From 7a0472fa35bcc51743422039932a8234f49d252e Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Thu, 8 Jun 2023 14:28:29 -0400 Subject: [PATCH 001/701] Don't call update function unless layer has been initialized --- modules/globebrowsing/src/layer.cpp | 4 ++++ modules/globebrowsing/src/layer.h | 2 ++ modules/globebrowsing/src/layergroup.cpp | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/globebrowsing/src/layer.cpp b/modules/globebrowsing/src/layer.cpp index e16f20fae0..49f390abad 100644 --- a/modules/globebrowsing/src/layer.cpp +++ b/modules/globebrowsing/src/layer.cpp @@ -438,6 +438,10 @@ bool Layer::enabled() const { return _enabled; } +bool Layer::isInitialized() const { + return _isInitialized; +} + TileProvider* Layer::tileProvider() const { return _tileProvider.get(); } diff --git a/modules/globebrowsing/src/layer.h b/modules/globebrowsing/src/layer.h index 84a0728631..a8e732fcd5 100644 --- a/modules/globebrowsing/src/layer.h +++ b/modules/globebrowsing/src/layer.h @@ -58,6 +58,7 @@ public: TileDepthTransform depthTransform() const; void setEnabled(bool enabled); bool enabled() const; + bool isInitialized() const; TileProvider* tileProvider() const; glm::vec3 solidColor() const; const LayerRenderSettings& renderSettings() const; @@ -99,6 +100,7 @@ private: const layers::Group::ID _layerGroupId; std::function _onChangeCallback; + bool _isInitialized = false; }; } // namespace openspace::globebrowsing diff --git a/modules/globebrowsing/src/layergroup.cpp b/modules/globebrowsing/src/layergroup.cpp index e63d0a8ab5..1c466f26bd 100644 --- a/modules/globebrowsing/src/layergroup.cpp +++ b/modules/globebrowsing/src/layergroup.cpp @@ -91,7 +91,7 @@ void LayerGroup::update() { _activeLayers.clear(); for (const std::unique_ptr& layer : _layers) { - if (layer->enabled()) { + if (layer->enabled() && layer->isInitialized()) { layer->update(); _activeLayers.push_back(layer.get()); } From ad58c695bfd2a43b88acb8883b907e8b8e66faf6 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Fri, 9 Jun 2023 10:31:57 -0400 Subject: [PATCH 002/701] Set initialize to true after initialization --- modules/globebrowsing/src/layer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/globebrowsing/src/layer.cpp b/modules/globebrowsing/src/layer.cpp index 49f390abad..b051f6f37d 100644 --- a/modules/globebrowsing/src/layer.cpp +++ b/modules/globebrowsing/src/layer.cpp @@ -384,6 +384,7 @@ void Layer::initialize() { if (_tileProvider) { _tileProvider->initialize(); } + _isInitialized = true; } void Layer::deinitialize() { From 96823b848fb994b64b22662e12143c6efd32ea5e Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Fri, 9 Jun 2023 16:15:27 -0400 Subject: [PATCH 003/701] Add function that calculates eclipse shadows --- .../rendering/atmospheredeferredcaster.cpp | 39 +++++++++++++++++++ .../rendering/atmospheredeferredcaster.h | 1 + 2 files changed, 40 insertions(+) diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp index 26f1dac64c..89d9d9ae3b 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp @@ -270,6 +270,45 @@ void AtmosphereDeferredcaster::deinitialize() { void AtmosphereDeferredcaster::update(const UpdateData&) {} +float AtmosphereDeferredcaster::eclipseShadow(glm::dvec3 position, bool ground) +{ + // This code is copied from the atmosphere deferred fragment shader + // It is used to calculate the eclipse shadow + const ShadowRenderingStruct& shadow = _shadowDataArrayCache.front(); + if (!shadow.isShadowing) { + return 1.0f; + } + + glm::dvec3 pc = shadow.casterPositionVec - position; + glm::dvec3 scNorm = shadow.sourceCasterVec; + glm::dvec3 pcProj = dot(pc, scNorm) * scNorm; + glm::dvec3 d = pc - pcProj; + + float length_d = float(length(d)); + double lengthPcProj = length(pcProj); + + float r_p_pi = float(shadow.rc * (lengthPcProj + shadow.xp) / shadow.xp); + float r_u_pi = float(shadow.rc * (shadow.xu - lengthPcProj) / shadow.xu); + + if (length_d < r_u_pi) { + // umbra + if (_hardShadowsEnabled) { + return ground ? 0.2 : 0.5; + } + else { + // butterworth function + return sqrt(r_u_pi / (r_u_pi + pow(length_d, 4.0))); + } + } + else if (length_d < r_p_pi) { + // penumbra + return _hardShadowsEnabled ? 0.5 : length_d / r_p_pi; + } + else { + return 1.0; + } +} + void AtmosphereDeferredcaster::preRaycast(const RenderData& data, const DeferredcastData&, ghoul::opengl::ProgramObject& prg) { diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.h b/modules/atmosphere/rendering/atmospheredeferredcaster.h index 49f29a6395..4ed22758d9 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.h +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.h @@ -75,6 +75,7 @@ public: void initializeCachedVariables(ghoul::opengl::ProgramObject& program) override; void update(const UpdateData&) override; + float eclipseShadow(glm::dvec3 position, bool ground); void calculateAtmosphereParameters(); From 52e316b03de37d0733b84a192b865e6955674b65 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Fri, 9 Jun 2023 16:21:12 -0400 Subject: [PATCH 004/701] Move calculate dimming coefficient to a function and also include calculations for eclipse shadows --- .../rendering/renderableatmosphere.cpp | 125 +++++++++++------- .../rendering/renderableatmosphere.h | 1 + 2 files changed, 77 insertions(+), 49 deletions(-) diff --git a/modules/atmosphere/rendering/renderableatmosphere.cpp b/modules/atmosphere/rendering/renderableatmosphere.cpp index 7894d814de..0458e8cd6d 100644 --- a/modules/atmosphere/rendering/renderableatmosphere.cpp +++ b/modules/atmosphere/rendering/renderableatmosphere.cpp @@ -34,6 +34,7 @@ #include #include #include +#include namespace { constexpr float KM_TO_M = 1000.f; @@ -471,55 +472,7 @@ void RenderableAtmosphere::update(const UpdateData& data) { _deferredcaster->setModelTransform(modelTransform); _deferredcaster->setOpacity(opacity()); _deferredcaster->update(data); - - // Calculate atmosphere dimming coefficient - // Calculate if the camera is in the atmosphere and if it is in the fading region - float atmosphereDimming = 1.f; - glm::dvec3 cameraPos = global::navigationHandler->camera()->positionVec3(); - glm::dvec3 planetPos = glm::dvec3(modelTransform * glm::dvec4(0.0, 0.0, 0.0, 1.0)); - float cameraDistance = static_cast(glm::distance(planetPos, cameraPos)); - // Atmosphere height is in KM - float atmosphereEdge = KM_TO_M * (_planetRadius + _atmosphereHeight); - // Height of the atmosphere where the objects will be faded - float atmosphereFadingHeight = KM_TO_M * _atmosphereDimmingHeight * _atmosphereHeight; - float atmosphereInnerEdge = atmosphereEdge - atmosphereFadingHeight; - bool cameraIsInAtmosphere = cameraDistance < atmosphereEdge; - bool cameraIsInFadingRegion = cameraDistance > atmosphereInnerEdge; - - // Check if camera is in sunset - glm::dvec3 normalUnderCamera = glm::normalize(cameraPos - planetPos); - glm::dvec3 vecToSun = glm::normalize(-planetPos); - float cameraSunAngle = glm::degrees(static_cast( - glm::acos(glm::dot(vecToSun, normalUnderCamera)) - )); - float sunsetStart = _atmosphereDimmingSunsetAngle.value().x; - float sunsetEnd = _atmosphereDimmingSunsetAngle.value().y; - // If cameraSunAngle is more than 90 degrees, we are in shaded part of globe - bool cameraIsInSun = cameraSunAngle <= sunsetEnd; - bool cameraIsInSunset = cameraSunAngle > sunsetStart && cameraIsInSun; - - // Fade if camera is inside the atmosphere - if (cameraIsInAtmosphere && cameraIsInSun) { - // If camera is in fading part of the atmosphere - // Fade with regards to altitude - if (cameraIsInFadingRegion) { - // Fading - linear interpolation - atmosphereDimming = (cameraDistance - atmosphereInnerEdge) / - atmosphereFadingHeight; - } - else { - // Camera is below fading region - atmosphere dims objects completely - atmosphereDimming = 0.0; - } - if (cameraIsInSunset) { - // Fading - linear interpolation - atmosphereDimming = (cameraSunAngle - sunsetStart) / - (sunsetEnd - sunsetStart); - } - global::navigationHandler->camera()->setAtmosphereDimmingFactor( - atmosphereDimming - ); - } + setDimmingCoefficient(computeModelTransformMatrix(data.modelTransform)); } void RenderableAtmosphere::updateAtmosphereParameters() { @@ -546,4 +499,78 @@ void RenderableAtmosphere::updateAtmosphereParameters() { _deferredcaster->setHardShadows(_hardShadowsEnabled); } +// Calculate atmosphere dimming coefficient +void RenderableAtmosphere::setDimmingCoefficient(const glm::dmat4& modelTransform) { + // Calculate if the camera is in the atmosphere and if it is in the sunny region + glm::dvec3 cameraPos = global::navigationHandler->camera()->positionVec3(); + glm::dvec3 planetPos = glm::dvec3(modelTransform * glm::dvec4(0.0, 0.0, 0.0, 1.0)); + float cameraDistance = static_cast(glm::distance(planetPos, cameraPos)); + glm::dvec3 normalUnderCamera = glm::normalize(cameraPos - planetPos); + glm::dvec3 vecToSun = glm::normalize(-planetPos); + + float cameraSunAngle = glm::degrees(static_cast( + glm::acos(glm::dot(vecToSun, normalUnderCamera)) + )); + float sunsetEnd = _atmosphereDimmingSunsetAngle.value().y; + + // If cameraSunAngle is more than 90 degrees, we are in shaded part of globe + bool cameraIsInSun = cameraSunAngle <= sunsetEnd; + // Atmosphere height is in KM + float atmosphereEdge = KM_TO_M * (_planetRadius + _atmosphereHeight); + bool cameraIsInAtmosphere = cameraDistance < atmosphereEdge; + + // Don't fade if camera is not in the sunny part of an atmosphere + if (!(cameraIsInAtmosphere && cameraIsInSun)) { + return; + } + // Else we need to fade the objects + // Height of the atmosphere where the objects will be faded + float atmosphereFadingHeight = KM_TO_M * _atmosphereDimmingHeight * _atmosphereHeight; + float atmosphereInnerEdge = atmosphereEdge - atmosphereFadingHeight; + bool cameraIsInFadingRegion = cameraDistance > atmosphereInnerEdge; + + // Check if camera is in sunset + float sunsetStart = _atmosphereDimmingSunsetAngle.value().x; + bool cameraIsInSunset = cameraSunAngle > sunsetStart && cameraIsInSun; + + // See if we are inside of an eclipse shadow + float eclipseShadow = _deferredcaster->eclipseShadow(cameraPos, false); + bool cameraIsInEclipse = std::abs(eclipseShadow - 1.0f) > glm::epsilon(); + // Invert shadow and multiply with itself to make it more narrow + eclipseShadow = std::pow(1.0f - eclipseShadow, 2.0f); + float atmosphereDimming = 0.f; + + if (cameraIsInSunset) { + // Fading - linear interpolation + atmosphereDimming = (cameraSunAngle - sunsetStart) / + (sunsetEnd - sunsetStart); + } + else if (cameraIsInFadingRegion && cameraIsInEclipse) { + // Fade with regards to altitude & eclipse shadow + // Fading - linear interpolation + float fading = (cameraDistance - atmosphereInnerEdge) / + atmosphereFadingHeight; + atmosphereDimming = std::clamp(eclipseShadow + fading, 0.0f, 1.0f); + } + else if (cameraIsInFadingRegion) { + // Fade with regards to altitude + // Fading - linear interpolation + atmosphereDimming = (cameraDistance - atmosphereInnerEdge) / + atmosphereFadingHeight; + } + else if (cameraIsInEclipse) { + atmosphereDimming = eclipseShadow; + } + else { + // Camera is below fading region - atmosphere dims objects completely + atmosphereDimming = 0.0f; + + } + // Calculate dimming coefficient for stars, labels etc that are dimmed in the + // atmosphere + global::navigationHandler->camera()->setAtmosphereDimmingFactor( + atmosphereDimming + ); +} + } // namespace openspace diff --git a/modules/atmosphere/rendering/renderableatmosphere.h b/modules/atmosphere/rendering/renderableatmosphere.h index acee718216..66843f16f1 100644 --- a/modules/atmosphere/rendering/renderableatmosphere.h +++ b/modules/atmosphere/rendering/renderableatmosphere.h @@ -79,6 +79,7 @@ public: private: glm::dmat4 computeModelTransformMatrix(const openspace::TransformData& data); void updateAtmosphereParameters(); + void dimmingCoefficient(const glm::dmat4& modelTransform); properties::FloatProperty _atmosphereHeight; properties::FloatProperty _groundAverageReflectance; From e5e5a22786d83d0dbfc5058cf6df7bfa699fc87a Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Mon, 12 Jun 2023 11:07:43 +0200 Subject: [PATCH 005/701] Read performshading from geojson file --- .../src/geojson/geojsonproperties.cpp | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/modules/globebrowsing/src/geojson/geojsonproperties.cpp b/modules/globebrowsing/src/geojson/geojsonproperties.cpp index 594fb49892..b7e768484a 100644 --- a/modules/globebrowsing/src/geojson/geojsonproperties.cpp +++ b/modules/globebrowsing/src/geojson/geojsonproperties.cpp @@ -64,6 +64,8 @@ namespace geojson::propertykeys { constexpr std::string_view AltitudeModeClamp = "clampToGround"; constexpr std::string_view AltitudeModeAbsolute = "absolute"; constexpr std::string_view AltitudeModeRelative = "relativeToGround"; + + constexpr std::string_view PerformShading = "performShading"; } // namespace geojson::propertykeys namespace { @@ -210,7 +212,8 @@ namespace { constexpr openspace::properties::Property::PropertyInfo ExtrudeInfo = { "Extrude", "Extrude", - "If true, extrude the mesh or line to intersect the globe", + "If true, extrude the geometry to intersect the globe.Lines/polygons will be" + "extruded with polygons,and points with lines ", openspace::properties::Property::Visibility::User }; @@ -404,16 +407,16 @@ GeoJsonProperties::GeoJsonProperties() addProperty(performShading); altitudeModeOption.addOptions({ - { static_cast(AltitudeMode::Absolute), "Absolute"}, + { static_cast(AltitudeMode::Absolute), "Absolute" }, { static_cast(AltitudeMode::RelativeToGround), "Relative to Ground" } //{ static_cast(AltitudeMode::ClampToGround), "Clamp to Ground" } / TODO: add ClampToGround - }); + }); addProperty(altitudeModeOption); pointAnchorOption.addOptions({ - { static_cast(PointTextureAnchor::Bottom), "Bottom"}, + { static_cast(PointTextureAnchor::Bottom), "Bottom" }, { static_cast(PointTextureAnchor::Center), "Center" } - }); + }); addProperty(pointAnchorOption); addPropertySubOwner(tessellation); @@ -555,6 +558,9 @@ GeoJsonOverrideProperties propsFromGeoJson(const geos::io::GeoJSONFeature& featu )); } } + else if (keyMatches(key, propertykeys::PerformShading, PerformShadingInfo)) { + result.performShading = value.getBoolean(); + } else if (keyMatches(key, propertykeys::Tessellate, TessellationEnabledInfo)) { result.tessellationEnabled = value.getBoolean(); } @@ -563,7 +569,13 @@ GeoJsonOverrideProperties propsFromGeoJson(const geos::io::GeoJSONFeature& featu result.useTessellationLevel = true; result.tessellationLevel = static_cast(value.getNumber()); } - else if (keyMatches(key, propertykeys::TessellationMaxDistance, TessellationDistanceInfo)) { + else if ( + keyMatches( + key, + propertykeys::TessellationMaxDistance, + TessellationDistanceInfo + )) + { result.tessellationDistance = static_cast(value.getNumber()); } }; From 76402e05252beae874513f2dda1c25c62558e17a Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Mon, 12 Jun 2023 14:11:45 +0200 Subject: [PATCH 006/701] Consistent spelling of "tessellation" --- modules/globebrowsing/src/geojson/geojsonproperties.cpp | 6 +++--- modules/globebrowsing/src/geojson/globegeometryfeature.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/globebrowsing/src/geojson/geojsonproperties.cpp b/modules/globebrowsing/src/geojson/geojsonproperties.cpp index b7e768484a..2b96742276 100644 --- a/modules/globebrowsing/src/geojson/geojsonproperties.cpp +++ b/modules/globebrowsing/src/geojson/geojsonproperties.cpp @@ -258,9 +258,9 @@ namespace { constexpr openspace::properties::Property::PropertyInfo UseTessellationLevelInfo = { "UseTessellationLevel", "Use Tessellation Level", - "If true, use the 'Tesselation Level' to control the level of detail for the " - "tessellation. The distance used will be the 'Tesselation Distance' divided by " - "the 'Tesselation Level', so the higher the level value, the smaller each " + "If true, use the 'Tessellation Level' to control the level of detail for the " + "tessellation. The distance used will be the 'Tessellation Distance' divided by " + "the 'Tessellation Level', so the higher the level value, the smaller each " "segment in the geomoetry will be", openspace::properties::Property::Visibility::AdvancedUser }; diff --git a/modules/globebrowsing/src/geojson/globegeometryfeature.h b/modules/globebrowsing/src/geojson/globegeometryfeature.h index 5870a138fa..07d1c5b634 100644 --- a/modules/globebrowsing/src/geojson/globegeometryfeature.h +++ b/modules/globebrowsing/src/geojson/globegeometryfeature.h @@ -174,7 +174,7 @@ private: void initializeRenderFeature(RenderFeature& feature, const std::vector& vertices); - /// Get the distance that shall be used for tesselation, based on the properties + /// Get the distance that shall be used for tessellation, based on the properties float tessellationStepSize() const; /// Compute the heights to the surface at the reference points From 81a54927d0f5d2a8e65d6f9fc2396a057e2d6544 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Mon, 12 Jun 2023 09:41:13 -0400 Subject: [PATCH 007/701] Fix compilation issue --- modules/atmosphere/rendering/renderableatmosphere.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/atmosphere/rendering/renderableatmosphere.h b/modules/atmosphere/rendering/renderableatmosphere.h index 66843f16f1..5d8cc531e2 100644 --- a/modules/atmosphere/rendering/renderableatmosphere.h +++ b/modules/atmosphere/rendering/renderableatmosphere.h @@ -79,7 +79,7 @@ public: private: glm::dmat4 computeModelTransformMatrix(const openspace::TransformData& data); void updateAtmosphereParameters(); - void dimmingCoefficient(const glm::dmat4& modelTransform); + void setDimmingCoefficient(const glm::dmat4& modelTransform); properties::FloatProperty _atmosphereHeight; properties::FloatProperty _groundAverageReflectance; From 08523695dd20dde070b86b147c44a2f43e14950f Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Mon, 12 Jun 2023 11:41:19 -0400 Subject: [PATCH 008/701] Fix crash from dereferencing a null ptr --- modules/atmosphere/rendering/atmospheredeferredcaster.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp index 89d9d9ae3b..4ba764159c 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp @@ -275,7 +275,7 @@ float AtmosphereDeferredcaster::eclipseShadow(glm::dvec3 position, bool ground) // This code is copied from the atmosphere deferred fragment shader // It is used to calculate the eclipse shadow const ShadowRenderingStruct& shadow = _shadowDataArrayCache.front(); - if (!shadow.isShadowing) { + if (_shadowDataArrayCache.empty() || !shadow.isShadowing) { return 1.0f; } From c1b97d2603faef7e53a9f0a21e600fd31f86dbf3 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Mon, 12 Jun 2023 17:50:07 -0400 Subject: [PATCH 009/701] Update documentation submodule: fix broken search and console errors for keys --- documentation | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation b/documentation index 3917fa57e4..3d6a26821f 160000 --- a/documentation +++ b/documentation @@ -1 +1 @@ -Subproject commit 3917fa57e47503e30e20d4059be9b54b729a5ea2 +Subproject commit 3d6a26821fe51b4ca8b6e182476246683a12080f From ee9c917acfdda79d5fcb3200cfbe580b7fc6ea9d Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Tue, 13 Jun 2023 09:29:44 +0200 Subject: [PATCH 010/701] Fix some faulty indentation and remove a bunch of extra lines --- modules/globebrowsing/src/renderableglobe.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/modules/globebrowsing/src/renderableglobe.cpp b/modules/globebrowsing/src/renderableglobe.cpp index fcb58d8020..00bfcbfbb4 100644 --- a/modules/globebrowsing/src/renderableglobe.cpp +++ b/modules/globebrowsing/src/renderableglobe.cpp @@ -987,7 +987,6 @@ void RenderableGlobe::renderChunks(const RenderData& data, RendererTasks&, { ZoneScoped; - if (_layerManagerDirty) { _layerManager.update(); _layerManagerDirty = false; @@ -1001,8 +1000,8 @@ void RenderableGlobe::renderChunks(const RenderData& data, RendererTasks&, lgs.end(), 0, [](int lhs, LayerGroup* lg) { - return lhs + static_cast(lg->activeLayers().size()); - } + return lhs + static_cast(lg->activeLayers().size()); + } ); _nLayersIsDirty = false; } @@ -1112,8 +1111,6 @@ void RenderableGlobe::renderChunks(const RenderData& data, RendererTasks&, _iterationsOfUnavailableData = (_allChunksAvailable ? 0 : _iterationsOfUnavailableData + 1); - - // // Setting uniforms that don't change between chunks but are view dependent // @@ -1181,8 +1178,6 @@ void RenderableGlobe::renderChunks(const RenderData& data, RendererTasks&, _localRenderer.program->setIgnoreUniformLocationError(IgnoreError::Yes); } - - // Local shader _localRenderer.program->setUniform( "projectionTransform", From 7ada21662066ae6841d92651cd7db38f49dd7452 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Tue, 13 Jun 2023 11:12:56 +0200 Subject: [PATCH 011/701] Change linear interpolation back to anisotropic interpolation (closes #2752) --- modules/globebrowsing/src/memoryawaretilecache.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/globebrowsing/src/memoryawaretilecache.cpp b/modules/globebrowsing/src/memoryawaretilecache.cpp index 9000d41dd0..653ad00577 100644 --- a/modules/globebrowsing/src/memoryawaretilecache.cpp +++ b/modules/globebrowsing/src/memoryawaretilecache.cpp @@ -219,14 +219,14 @@ void MemoryAwareTileCache::TextureContainer::reset() { _initData.ghoulTextureFormat, toGlTextureFormat(_initData.glType, _initData.ghoulTextureFormat), _initData.glType, - Texture::FilterMode::Linear, + Texture::FilterMode::AnisotropicMipMap, Texture::WrappingMode::ClampToEdge, Texture::AllocateData(_initData.shouldAllocateDataOnCPU) ); tex->setDataOwnership(Texture::TakeOwnership::Yes); tex->uploadTexture(); - tex->setFilter(Texture::FilterMode::Linear); + tex->setFilter(Texture::FilterMode::AnisotropicMipMap); _textures.push_back(std::move(tex)); } @@ -472,7 +472,10 @@ void MemoryAwareTileCache::createTileAndPut(ProviderTileKey key, RawTile rawTile _numTextureBytesAllocatedOnCPU += numBytes - previousExpectedDataSize; tex->reUploadTexture(); } - tex->setFilter(ghoul::opengl::Texture::FilterMode::Linear); + // Hi there, I know someone will be tempted to change this to a Linear filtering + // mode at some point. This will introduce rendering artifacts when looking at the + // globe at oblique angles (see #2752) + tex->setFilter(ghoul::opengl::Texture::FilterMode::AnisotropicMipMap); Tile tile{ tex, std::move(rawTile.tileMetaData), Tile::Status::OK }; TileTextureInitData::HashKey initDataKey = initData.hashKey; _textureContainerMap[initDataKey].second->put(std::move(key), std::move(tile)); From f38c7242d0544485ff360c1194d00e91764ad673 Mon Sep 17 00:00:00 2001 From: Micah Acinapura Date: Tue, 13 Jun 2023 08:26:34 -0600 Subject: [PATCH 012/701] =?UTF-8?q?added=20multiple=20and=20offset=20to=20?= =?UTF-8?q?blue=20marble=20height=20to=20make=20it=20similar=20lo=E2=80=A6?= =?UTF-8?q?=20(#2658)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * added multiple and offset to blue marble height to make it similar looking to esri terrain * Update blue_marble_height.asset --- .../earth/layers/heightlayers/blue_marble_height.asset | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/blue_marble_height.asset b/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/blue_marble_height.asset index bc2d6a2b45..1b6c3fc58a 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/blue_marble_height.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/blue_marble_height.asset @@ -15,7 +15,12 @@ local Layer = { Identifier = "Earth_Bluemarble_Height", Enabled = asset.enabled, FilePath = texturesPath .. "earth_bluemarble_height.jpg", - Description = "Topographic layer from Blue Marble Next Generation" + Description = "Topographic layer from Blue Marble Next Generation", + --note these values were just chosen to try to closly match the look of the ESRI Terrain layer + Settings = { + Multiplier = 40, + Offset = -600 + } } From 7575be32c06a4486e2d581023258303ecb666b90 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Tue, 13 Jun 2023 19:16:09 +0200 Subject: [PATCH 013/701] Add version number to launcher (closes #2365) --- .../ext/launcher/resources/qss/launcher.qss | 5 +++++ apps/OpenSpace/ext/launcher/src/launcherwindow.cpp | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/apps/OpenSpace/ext/launcher/resources/qss/launcher.qss b/apps/OpenSpace/ext/launcher/resources/qss/launcher.qss index 5c920457bb..a22ab8a331 100644 --- a/apps/OpenSpace/ext/launcher/resources/qss/launcher.qss +++ b/apps/OpenSpace/ext/launcher/resources/qss/launcher.qss @@ -30,6 +30,11 @@ LauncherWindow QLabel#clear { background-color: rgba(0, 0, 0, 0%); } +LauncherWindow QLabel#version-info { + font-size: 10pt; + color: #dfdfdf; +} + LauncherWindow QComboBox#config { background: rgb(96, 96, 96); border: 1px solid rgb(128, 128, 128); diff --git a/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp b/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp index 9675293ae2..8454551101 100644 --- a/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp +++ b/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp @@ -82,6 +82,9 @@ namespace { constexpr QRect StartButton( LeftRuler, TopRuler + 400, ItemWidth, ItemHeight ); + constexpr QRect VersionString( + 5, ScreenHeight - SmallItemHeight, ItemWidth, SmallItemHeight + ); } // geometry std::optional loadProfileFromFile(QWidget* parent, std::string filename) { @@ -364,6 +367,15 @@ QWidget* LauncherWindow::createCentralWidget() { _editWindowButton->setGeometry(geometry::EditWindowButton); _editWindowButton->setCursor(Qt::PointingHandCursor); + + QLabel* versionLabel = new QLabel(centralWidget); + versionLabel->setVisible(true); + versionLabel->setText( + QString::fromStdString(std::string(openspace::OPENSPACE_VERSION_STRING_FULL)) + ); + versionLabel->setObjectName("version-info"); + versionLabel->setGeometry(geometry::VersionString); + return centralWidget; } From 07ebac5cd3eeb36dd36f6e2418e34a6c54288345 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Tue, 13 Jun 2023 19:38:00 +0200 Subject: [PATCH 014/701] Remove the registered actions before updating the delta time keybindings (closes #2764) --- src/util/timemanager.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/util/timemanager.cpp b/src/util/timemanager.cpp index c9fc013e57..e400f3dec0 100644 --- a/src/util/timemanager.cpp +++ b/src/util/timemanager.cpp @@ -75,7 +75,9 @@ namespace { }; constexpr std::string_view DeltaTimeStepsGuiPath = "/Time/Simulation Speed/Steps"; -} + + constexpr std::string_view DeltaTimeActionPrefix = "core.time.delta_time"; +} // namespace namespace openspace { @@ -466,6 +468,7 @@ void TimeManager::setDeltaTimeSteps(std::vector deltaTimes) { _deltaTimeSteps = std::move(deltaTimes); _deltaTimeStepsChanged = true; + clearDeltaTimesKeybindings(); addDeltaTimesKeybindings(); } @@ -500,7 +503,7 @@ void TimeManager::addDeltaTimesKeybindings() { auto addDeltaTimeKeybind = [this](Key key, KeyModifier mod, double step) { const std::string s = fmt::format("{:.0f}", step); - std::string identifier = fmt::format("core.time.delta_time.{}", s); + std::string identifier = fmt::format("{}.{}", DeltaTimeActionPrefix, s); interaction::Action action; action.identifier = identifier; action.command = fmt::format("openspace.time.interpolateDeltaTime({})", s); @@ -551,6 +554,15 @@ void TimeManager::addDeltaTimesKeybindings() { } void TimeManager::clearDeltaTimesKeybindings() { + // Iterate over all of the registered actions with the common prefix that we created + // in the addDeltaTimesKeybindings function + std::vector actions = global::actionManager->actions(); + for (const interaction::Action& action : actions) { + if (action.identifier.starts_with(DeltaTimeActionPrefix)) { + global::actionManager->removeAction(action.identifier); + } + } + for (const KeyWithModifier& kb : _deltaTimeStepKeybindings) { // Check if there are multiple keys bound to the same key auto bindings = global::keybindingManager->keyBinding(kb); From e89bef020347a35eded3c297dec77106316b9de6 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Tue, 13 Jun 2023 16:10:06 -0400 Subject: [PATCH 015/701] Address comments on PR and make code more readable --- .../rendering/atmospheredeferredcaster.cpp | 71 ++++++++++--------- .../rendering/atmospheredeferredcaster.h | 10 +-- .../rendering/renderableatmosphere.cpp | 34 ++++----- 3 files changed, 58 insertions(+), 57 deletions(-) diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp index 4ba764159c..5dfd05bcfb 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp @@ -270,42 +270,44 @@ void AtmosphereDeferredcaster::deinitialize() { void AtmosphereDeferredcaster::update(const UpdateData&) {} -float AtmosphereDeferredcaster::eclipseShadow(glm::dvec3 position, bool ground) -{ +float AtmosphereDeferredcaster::eclipseShadow(glm::dvec3 position) { // This code is copied from the atmosphere deferred fragment shader // It is used to calculate the eclipse shadow const ShadowRenderingStruct& shadow = _shadowDataArrayCache.front(); if (_shadowDataArrayCache.empty() || !shadow.isShadowing) { - return 1.0f; + return 1.f; } - glm::dvec3 pc = shadow.casterPositionVec - position; - glm::dvec3 scNorm = shadow.sourceCasterVec; - glm::dvec3 pcProj = dot(pc, scNorm) * scNorm; - glm::dvec3 d = pc - pcProj; + const glm::dvec3 positionToCaster = shadow.casterPositionVec - position; + const glm::dvec3 sourceToCaster = shadow.sourceCasterVec; // Normalized + const glm::dvec3 casterShadow = dot(positionToCaster, sourceToCaster) * sourceToCaster; + const glm::dvec3 positionToShadow = positionToCaster - casterShadow; - float length_d = float(length(d)); - double lengthPcProj = length(pcProj); + float distanceToShadow = static_cast(length(positionToShadow)); + double shadowLength = length(casterShadow); - float r_p_pi = float(shadow.rc * (lengthPcProj + shadow.xp) / shadow.xp); - float r_u_pi = float(shadow.rc * (shadow.xu - lengthPcProj) / shadow.xu); + float radiusPenumbra = static_cast( + shadow.radiusCaster * (shadowLength + shadow.penumbra) / shadow.penumbra + ); + float radiusUmbra = static_cast( + shadow.radiusCaster * (shadow.umbra - shadowLength) / shadow.umbra + ); - if (length_d < r_u_pi) { - // umbra + // Is the position in the umbra - the fully shaded part + if (distanceToShadow < radiusUmbra) { if (_hardShadowsEnabled) { - return ground ? 0.2 : 0.5; + return 0.5f; } else { - // butterworth function - return sqrt(r_u_pi / (r_u_pi + pow(length_d, 4.0))); + // Smooth the shadow with the butterworth function + return sqrt(radiusUmbra / (radiusUmbra + pow(distanceToShadow, 4.f))); } } - else if (length_d < r_p_pi) { - // penumbra - return _hardShadowsEnabled ? 0.5 : length_d / r_p_pi; + else if (distanceToShadow < radiusPenumbra) { // In penumbra - partially shaded part + return _hardShadowsEnabled ? 0.5f : distanceToShadow / radiusPenumbra; } else { - return 1.0; + return 1.f; } } @@ -430,9 +432,10 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& data, const Deferred return; } - const double sourceScale = std::max(glm::compMax(sourceNode->scale()), 1.0); - const double casterScale = std::max(glm::compMax(casterNode->scale()), 1.0); - + double sourceScale = std::max(glm::compMax(sourceNode->scale()), 1.0); + double casterScale = std::max(glm::compMax(casterNode->scale()), 1.0); + double actualSourceRadius = shadowConf.source.second * sourceScale; + double actualCasterRadius = shadowConf.caster.second * casterScale; // First we determine if the caster is shadowing the current planet // (all calculations in World Coordinates): glm::dvec3 planetCasterVec = casterPos - data.modelTransform.translation; @@ -442,11 +445,9 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& data, const Deferred (glm::dot(planetCasterVec, sourceCasterVec) / (scLength * scLength)) * sourceCasterVec; double dTest = glm::length(planetCasterVec - planetCasterProj); - double xpTest = shadowConf.caster.second * casterScale * - scLength / - (shadowConf.source.second * sourceScale + - shadowConf.caster.second * casterScale); - double rpTest = shadowConf.caster.second * casterScale * + double xpTest = actualCasterRadius * scLength / + (actualSourceRadius + actualCasterRadius); + double rpTest = actualCasterRadius * (glm::length(planetCasterProj) + xpTest) / xpTest; double casterDistSun = glm::length(casterPos - sunPosWorld); @@ -462,11 +463,11 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& data, const Deferred { // The current caster is shadowing the current planet shadow.isShadowing = true; - shadow.rs = shadowConf.source.second * sourceScale; - shadow.rc = shadowConf.caster.second * casterScale; + shadow.radiusSource = actualSourceRadius; + shadow.radiusCaster = actualCasterRadius; shadow.sourceCasterVec = glm::normalize(sourceCasterVec); - shadow.xp = xpTest; - shadow.xu = shadow.rc * scLength / (shadow.rs - shadow.rc); + shadow.penumbra = xpTest; + shadow.umbra = shadow.radiusCaster * scLength / (shadow.radiusSource - shadow.radiusCaster); shadow.casterPositionVec = casterPos; } _shadowDataArrayCache.push_back(shadow); @@ -483,11 +484,11 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& data, const Deferred if (sd.isShadowing) { std::strcpy(bf, "].xp\0"); - prg.setUniform(_uniformNameBuffer, sd.xp); + prg.setUniform(_uniformNameBuffer, sd.penumbra); std::strcpy(bf, "].xu\0"); - prg.setUniform(_uniformNameBuffer, sd.xu); + prg.setUniform(_uniformNameBuffer, sd.umbra); std::strcpy(bf, "].rc\0"); - prg.setUniform(_uniformNameBuffer, sd.rc); + prg.setUniform(_uniformNameBuffer, sd.radiusCaster); std::strcpy(bf, "].sourceCasterVec\0"); prg.setUniform(_uniformNameBuffer, sd.sourceCasterVec); std::strcpy(bf, "].casterPositionVec\0"); diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.h b/modules/atmosphere/rendering/atmospheredeferredcaster.h index 4ed22758d9..eae2fa33ca 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.h +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.h @@ -46,10 +46,10 @@ struct DeferredcastData; struct ShadowConfiguration; struct ShadowRenderingStruct { - double xu = 0.0; - double xp = 0.0; - double rs = 0.0; - double rc = 0.0; + double umbra = 0.0; + double penumbra = 0.0; + double radiusSource = 0.0; + double radiusCaster = 0.0; glm::dvec3 sourceCasterVec = glm::dvec3(0.0); glm::dvec3 casterPositionVec = glm::dvec3(0.0); bool isShadowing = false; @@ -75,7 +75,7 @@ public: void initializeCachedVariables(ghoul::opengl::ProgramObject& program) override; void update(const UpdateData&) override; - float eclipseShadow(glm::dvec3 position, bool ground); + float eclipseShadow(glm::dvec3 position); void calculateAtmosphereParameters(); diff --git a/modules/atmosphere/rendering/renderableatmosphere.cpp b/modules/atmosphere/rendering/renderableatmosphere.cpp index 0458e8cd6d..00e5a322d5 100644 --- a/modules/atmosphere/rendering/renderableatmosphere.cpp +++ b/modules/atmosphere/rendering/renderableatmosphere.cpp @@ -33,8 +33,8 @@ #include #include #include -#include #include +#include namespace { constexpr float KM_TO_M = 1000.f; @@ -273,7 +273,7 @@ documentation::Documentation RenderableAtmosphere::Documentation() { RenderableAtmosphere::RenderableAtmosphere(const ghoul::Dictionary& dictionary) : Renderable(dictionary) - , _atmosphereHeight(AtmosphereHeightInfo, 60.f, 0.1f, 99.0f) + , _atmosphereHeight(AtmosphereHeightInfo, 60.f, 0.1f, 99.f) , _groundAverageReflectance(AverageGroundReflectanceInfo, 0.f, 0.f, 1.f) , _groundRadianceEmission(GroundRadianceEmissionInfo, 0.f, 0.f, 1.f) , _rayleighHeightScale(RayleighHeightScaleInfo, 0.f, 0.1f, 50.f) @@ -502,15 +502,16 @@ void RenderableAtmosphere::updateAtmosphereParameters() { // Calculate atmosphere dimming coefficient void RenderableAtmosphere::setDimmingCoefficient(const glm::dmat4& modelTransform) { // Calculate if the camera is in the atmosphere and if it is in the sunny region - glm::dvec3 cameraPos = global::navigationHandler->camera()->positionVec3(); - glm::dvec3 planetPos = glm::dvec3(modelTransform * glm::dvec4(0.0, 0.0, 0.0, 1.0)); + const glm::dvec3 cameraPos = global::navigationHandler->camera()->positionVec3(); + // TODO: change the assumption that the Sun is placed in the origin + const glm::dvec3 planetPos = glm::dvec3(modelTransform * glm::dvec4(0.0, 0.0, 0.0, 1.0)); + const glm::dvec3 normalUnderCamera = glm::normalize(cameraPos - planetPos); + const glm::dvec3 vecToSun = glm::normalize(-planetPos); + float cameraDistance = static_cast(glm::distance(planetPos, cameraPos)); - glm::dvec3 normalUnderCamera = glm::normalize(cameraPos - planetPos); - glm::dvec3 vecToSun = glm::normalize(-planetPos); - - float cameraSunAngle = glm::degrees(static_cast( - glm::acos(glm::dot(vecToSun, normalUnderCamera)) - )); + float cameraSunAngle = static_cast( + glm::degrees(glm::acos(glm::dot(vecToSun, normalUnderCamera)) + )); float sunsetEnd = _atmosphereDimmingSunsetAngle.value().y; // If cameraSunAngle is more than 90 degrees, we are in shaded part of globe @@ -520,7 +521,7 @@ void RenderableAtmosphere::setDimmingCoefficient(const glm::dmat4& modelTransfor bool cameraIsInAtmosphere = cameraDistance < atmosphereEdge; // Don't fade if camera is not in the sunny part of an atmosphere - if (!(cameraIsInAtmosphere && cameraIsInSun)) { + if (!cameraIsInAtmosphere || !cameraIsInSun) { return; } // Else we need to fade the objects @@ -534,10 +535,10 @@ void RenderableAtmosphere::setDimmingCoefficient(const glm::dmat4& modelTransfor bool cameraIsInSunset = cameraSunAngle > sunsetStart && cameraIsInSun; // See if we are inside of an eclipse shadow - float eclipseShadow = _deferredcaster->eclipseShadow(cameraPos, false); - bool cameraIsInEclipse = std::abs(eclipseShadow - 1.0f) > glm::epsilon(); + float eclipseShadow = _deferredcaster->eclipseShadow(cameraPos); + bool cameraIsInEclipse = std::abs(eclipseShadow - 1.f) > glm::epsilon(); // Invert shadow and multiply with itself to make it more narrow - eclipseShadow = std::pow(1.0f - eclipseShadow, 2.0f); + eclipseShadow = std::pow(1.f - eclipseShadow, 2.f); float atmosphereDimming = 0.f; if (cameraIsInSunset) { @@ -550,7 +551,7 @@ void RenderableAtmosphere::setDimmingCoefficient(const glm::dmat4& modelTransfor // Fading - linear interpolation float fading = (cameraDistance - atmosphereInnerEdge) / atmosphereFadingHeight; - atmosphereDimming = std::clamp(eclipseShadow + fading, 0.0f, 1.0f); + atmosphereDimming = std::clamp(eclipseShadow + fading, 0.f, 1.f); } else if (cameraIsInFadingRegion) { // Fade with regards to altitude @@ -563,8 +564,7 @@ void RenderableAtmosphere::setDimmingCoefficient(const glm::dmat4& modelTransfor } else { // Camera is below fading region - atmosphere dims objects completely - atmosphereDimming = 0.0f; - + atmosphereDimming = 0.f; } // Calculate dimming coefficient for stars, labels etc that are dimmed in the // atmosphere From 5d1882e398b3b57364900f947a98ec83a324613c Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Wed, 14 Jun 2023 10:29:26 -0400 Subject: [PATCH 016/701] Update gui hash --- data/assets/util/webgui.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/util/webgui.asset b/data/assets/util/webgui.asset index a72878a3db..2f6431c17f 100644 --- a/data/assets/util/webgui.asset +++ b/data/assets/util/webgui.asset @@ -4,7 +4,7 @@ local guiCustomization = asset.require("customization/gui") -- Select which commit hashes to use for the frontend and backend -local frontendHash = "c6b16ef4ffdda6b20298d16a204c8977ad56ef09" +local frontendHash = "3f93d653ee4783b22a38a6c771e599cbd95326c5" local frontend = asset.syncedResource({ Identifier = "WebGuiFrontend", From 641c747f94867aa41d24e577caf92a364856c4ca Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Wed, 14 Jun 2023 10:52:33 -0400 Subject: [PATCH 017/701] Rename the property in the video player to reload instead of reset, and add some more explanation --- modules/video/include/videoplayer.h | 4 ++-- modules/video/src/videoplayer.cpp | 19 ++++++++++--------- modules/video/src/videotileprovider.cpp | 2 +- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/modules/video/include/videoplayer.h b/modules/video/include/videoplayer.h index a4ad4dfe39..7a10a667ad 100644 --- a/modules/video/include/videoplayer.h +++ b/modules/video/include/videoplayer.h @@ -67,7 +67,7 @@ public: const std::unique_ptr& frameTexture() const; bool isInitialized() const; - void reset(); + void reload(); void destroy(); void update(); @@ -123,7 +123,7 @@ private: properties::TriggerProperty _play; properties::TriggerProperty _pause; properties::TriggerProperty _goToStart; - properties::TriggerProperty _reset; + properties::TriggerProperty _reload; properties::BoolProperty _playAudio; properties::BoolProperty _loopVideo; diff --git a/modules/video/src/videoplayer.cpp b/modules/video/src/videoplayer.cpp index e4b85762cb..35a80dfb94 100644 --- a/modules/video/src/videoplayer.cpp +++ b/modules/video/src/videoplayer.cpp @@ -60,13 +60,14 @@ namespace { constexpr openspace::properties::Property::PropertyInfo GoToStartInfo = { "GoToStart", "Go To Start", - "Go to start in video" + "Sets the time to the beginning of the video and pauses it." }; - constexpr openspace::properties::Property::PropertyInfo ResetInfo = { - "Reset", - "Reset", - "Reset video" + constexpr openspace::properties::Property::PropertyInfo ReloadInfo = { + "Reload", + "Reload", + "Reloads the video and creates a new texture. This might be useful in case there " + "was an error loading the video." }; constexpr openspace::properties::Property::PropertyInfo AudioInfo = { @@ -249,7 +250,7 @@ VideoPlayer::VideoPlayer(const ghoul::Dictionary& dictionary) , _play(PlayInfo) , _pause(PauseInfo) , _goToStart(GoToStartInfo) - , _reset(ResetInfo) + , _reload(ReloadInfo) , _playAudio(AudioInfo, false) , _loopVideo(LoopVideoInfo, true) { @@ -260,8 +261,8 @@ VideoPlayer::VideoPlayer(const ghoul::Dictionary& dictionary) _videoFile = p.video; _loopVideo = p.loopVideo.value_or(_loopVideo); - _reset.onChange([this]() { reset(); }); - addProperty(_reset); + _reload.onChange([this]() { reload(); }); + addProperty(_reload); if (p.playbackMode.has_value()) { switch (*p.playbackMode) { @@ -781,7 +782,7 @@ const std::unique_ptr& VideoPlayer::frameTexture() const return _frameTexture; } -void VideoPlayer::reset() { +void VideoPlayer::reload() { if (_videoFile.empty()) { return; } diff --git a/modules/video/src/videotileprovider.cpp b/modules/video/src/videotileprovider.cpp index 5d4b03ee04..8446be051a 100644 --- a/modules/video/src/videotileprovider.cpp +++ b/modules/video/src/videotileprovider.cpp @@ -106,7 +106,7 @@ void VideoTileProvider::update() { } void VideoTileProvider::reset() { - _videoPlayer.reset(); + _videoPlayer.reload(); } ChunkTile VideoTileProvider::chunkTile(TileIndex tileIndex, int parents, int maxParents) { From d1094c211e7544f1236b323c0a06ccdb68da83d1 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Wed, 14 Jun 2023 11:17:31 -0400 Subject: [PATCH 018/701] Change video example video to compressed science on a sphere video --- data/assets/examples/video/examplevideo.mp4 | Bin 4218 -> 287618 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/assets/examples/video/examplevideo.mp4 b/data/assets/examples/video/examplevideo.mp4 index 3f5d7225acc37c9e22692bed50e858e3aaea5928..ed70354cbee9ed6189459bacd83c90121ffd3ee4 100644 GIT binary patch literal 287618 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

6tvVRyPj*Fqct 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

(<+JTUxujzA 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 literal 4218 zcmeHLU2GIp6u!$ssr-~;KpKO1g=)mG+nMcBXw8H!rP30N#3+9;40mSkcE`@_OlNMl zyT}6=ZAkP*P53EhH!%oGu)Of|pazH-0TUBRFxFpM5)dJxk_bX{J$Gi?SsNbYffv)8 zy>rh!=X~efd(QpKB7|^~C_92jhG4zi-;nCpe+gtbx*HqT^@iZQ#XuCAx2Cz{bUY8fOQwVaMR?j@RHrU5#Z z&2%g6Her=0M3qGB(4_MJFzIqC3=^R}a-YQcMAvWz)3WVc8({nKnQ>X%1{lv4uj3 zlubP?#p2jiX_~6tOo|J9m=56~b*P&HxTDG=)8%qUl~gB*O$Fl0rv)7;Rv#5`7oUtI zL>qv#xnZv*S*f8B7%ro>6vw&^NrD9dIRsmz3-ZsiiMGHB-b1&&f~>y>`m!@NY(INy z{}cA>1A1gf)gPA*?cCP1cg@vQb=TT&hgkGd`_MCQoPOYNF1lgG!PA?kd~xCD9S5%+ zdPiIHQgzL`{)*oZ92xgyMq9mN{s*6~U2#ziTu)Rp}3>B5jvHjJYn)%@=l;9hVtr*^12g1RwepU z?e8U0yH-~Icx!O0kLqomzM!}&;cLFjd`$rD1JH3FbO1nx58478aCN42W&pYjAg&3Z zD*@=&0OWfrRF#1Wkr7XYx)IRscmVP}6`m~zb&Yr`xB(~|fJ&aWd!S}-OohXNr=tKm z0ohq0Nwq5DqO$uANSMLMBhArKTR%%AA~gk zhfxA{#g6be_%A5`>HvFGzd6vn6EzN@ zira8!b%O8(*6H~SmnoL4f#1<(l%G5LZ3YnbfVEU(E>N?n;lcyUD`0`!9bX!Ag==a$ z0SPv>(Q_AoeF{B)(!)hkn&Eg9eE8F8nC9(j{*-DXY0aQqr(zCVrb!@XWK7R!`LJs> zUp8BV8=HfnaQT#O$G|>4;Rlx~2GIR3bB7bcb@Kf62rVz=HhoSr!l(^MUU>=4TnYLM z8>97$q9Q!K3|-;RJYVR2Yl=l^#Gq8BmN1a-{!8{7(x}P zD;GYWd;G7PH#u|$JSIvZtzHHpg^Fri=7pQf`RHKekZI6`S@1OQ!ue3ckE?;M>hs2z z4QHQfL7x|%KYphu-5Mj%t~aUI0*M|e rzh2- Date: Wed, 14 Jun 2023 20:04:08 +0200 Subject: [PATCH 019/701] Update TilePixelSizes to temporarily address #2472 --- .../solarsystem/missions/apollo/apollo_globebrowsing.asset | 5 +++++ .../planets/earth/layers/heightlayers/terrain_tileset.asset | 2 +- .../planets/mars/layers/heightlayers/hirisels.asset | 2 +- .../planets/mars/layers/heightlayers/mdem200m.asset | 2 +- .../planets/venus/layers/heightlayers/magellan_newyork.asset | 2 +- .../planets/venus/layers/heightlayers/magellan_utah.asset | 2 +- modules/globebrowsing/scripts/layer_support.lua | 2 +- 7 files changed, 11 insertions(+), 6 deletions(-) diff --git a/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset b/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset index 80a25772cb..25ff907125 100644 --- a/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset +++ b/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset @@ -1,4 +1,9 @@ local moon = asset.require("scene/solarsystem/planets/earth/moon/moon") +-- This is technically not necessary, but we need to ensure that the default layers load +-- first before we add the layers from this assets or else the default layers might be +-- initialized later, causing them to appear **after** these layers +asset.require("scene/solarsystem/planets/earth/moon/default_layers") + local heightmaps = asset.syncedResource({ Name = "Apollo Globebrowsing Heightmaps", diff --git a/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/terrain_tileset.asset b/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/terrain_tileset.asset index 8892c0cb89..40bb76d119 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/terrain_tileset.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/terrain_tileset.asset @@ -7,7 +7,7 @@ local Layer = { Name = "Terrain tileset", Enabled = asset.enabled, FilePath = asset.localResource("terrain_tileset.wms"), - TilePixelSize = 512, + TilePixelSize = 129, Description = [[This globe layer presents elevation data at approximately 90m or 1km per pixel resolution for the world. The elevation data includes 90m Shuttle Radar Topography Mission (SRTM) elevation data from NASA and National diff --git a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/hirisels.asset b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/hirisels.asset index 20d4566c0f..af7a51b238 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/hirisels.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/hirisels.asset @@ -7,7 +7,7 @@ local Layer = { Name = "HiRISE Local Set DEM", Enabled = asset.enabled, FilePath = asset.localResource("hirisels.wms"), - TilePixelSize = 512, + TilePixelSize = 129, Description = [[HiRISE (High Resolution Imaging Science Experiment) is the most powerful camera ever sent to another planet, one of six instruments onboard the Mars Reconnaissance Orbiter. We launched in 2005, arrived at Mars in 2006 and have diff --git a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mdem200m.asset b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mdem200m.asset index 2a7a58987d..8206a3a70c 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mdem200m.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mdem200m.asset @@ -7,7 +7,7 @@ local Layer = { Name = "HRSC MOLA Blended DEM Global 200m v2", Enabled = asset.enabled, FilePath = asset.localResource("mdem200m.wms"), - TilePixelSize = 513, + TilePixelSize = 129, Description = [[Blend of data derived from the Mars Orbiter Laser Altimeter (MOLA, an instrument aboard NASA's Mars Global Surveyor spacecraft), and data derived from the High-Resolution Stereo Camera (HRSC, an instrument aboard the European Space diff --git a/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_newyork.asset b/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_newyork.asset index a2e2534caf..102ea3fcaa 100644 --- a/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_newyork.asset +++ b/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_newyork.asset @@ -7,7 +7,7 @@ local Layer = { Name = "Magellan Elevation [New York]", Enabled = asset.enabled, FilePath = asset.localResource("magellan_newyork.wms"), - TilePixelSize = 256, + TilePixelSize = 129, Settings = { Gamma = 1.72, Multiplier = 1.1 diff --git a/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_utah.asset b/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_utah.asset index a9d380d3db..83a7c0125a 100644 --- a/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_utah.asset +++ b/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_utah.asset @@ -7,7 +7,7 @@ local Layer = { Name = "Magellan Elevation [Utah]", Enabled = asset.enabled, FilePath = asset.localResource("magellan_utah.wms"), - TilePixelSize = 256, + TilePixelSize = 129, Settings = { Gamma = 1.72, Multiplier = 1.1 diff --git a/modules/globebrowsing/scripts/layer_support.lua b/modules/globebrowsing/scripts/layer_support.lua index d396f5db6a..3622156feb 100644 --- a/modules/globebrowsing/scripts/layer_support.lua +++ b/modules/globebrowsing/scripts/layer_support.lua @@ -245,7 +245,7 @@ openspace.globebrowsing.parseInfoFile = function (file) Name = name, Description = Description or "", FilePath = dir .. '/' .. HeightFile, - TilePixelSize = 512 + TilePixelSize = 65 } end From 045e4fcaa376e80456c9016a5094f1b944a20f3f Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Wed, 14 Jun 2023 18:23:43 -0400 Subject: [PATCH 020/701] =?UTF-8?q?Add=20property=20to=20make=20it=20possi?= =?UTF-8?q?ble=20to=20set=20if=20the=20browser=20display=20copies=E2=80=A6?= =?UTF-8?q?=20(#2774)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add property to make it possible to set if the browser display copies should animate while the target is moving * Update modules/skybrowser/src/targetbrowserpair.cpp Co-authored-by: Alexander Bock --------- Co-authored-by: Alexander Bock --- .../include/screenspaceskybrowser.h | 2 ++ .../skybrowser/src/screenspaceskybrowser.cpp | 20 +++++++++++++++++++ modules/skybrowser/src/targetbrowserpair.cpp | 5 ++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index a4b1e91620..13d41db2a8 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -50,6 +50,7 @@ public: glm::dvec2 fineTuneVector(const glm::dvec2& drag); bool isInitialized() const; bool isPointingSpacecraft() const; + bool shouldUpdateWhileTargetAnimates() const; double setVerticalFovWithScroll(float scroll); void setIdInBrowser() const; @@ -71,6 +72,7 @@ private: properties::FloatProperty _textureQuality; properties::BoolProperty _isHidden; properties::BoolProperty _isPointingSpacecraft; + properties::BoolProperty _updateDuringTargetAnimation; std::vector> _displayCopies; std::vector> _showDisplayCopies; diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index 21b11fb99e..b004c5cb79 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -82,6 +82,14 @@ namespace { openspace::properties::Property::Visibility::User }; + constexpr openspace::properties::Property::PropertyInfo UpdateDuringAnimationInfo = { + "UpdateDuringTargetAnimation", + "Update During Target Animation", + "If checked, the sky browser display copy will update its coordinates while " + "the target is animating.", + openspace::properties::Property::Visibility::User + }; + struct [[codegen::Dictionary(ScreenSpaceSkyBrowser)]] Parameters { // [[codegen::verbatim(TextureQualityInfo.description)]] std::optional textureQuality; @@ -91,6 +99,9 @@ namespace { // [[codegen::verbatim(PointSpacecraftInfo.description)]] std::optional pointSpacecraft; + + // [[codegen::verbatim(UpdateDuringAnimationInfo.description)]] + std::optional updateDuringTargetAnimation; }; #include "screenspaceskybrowser_codegen.cpp" @@ -123,6 +134,7 @@ ScreenSpaceSkyBrowser::ScreenSpaceSkyBrowser(const ghoul::Dictionary& dictionary , _textureQuality(TextureQualityInfo, 1.f, 0.25f, 1.f) , _isHidden(IsHiddenInfo, true) , _isPointingSpacecraft(PointSpacecraftInfo, false) + , _updateDuringTargetAnimation(UpdateDuringAnimationInfo, false) { _identifier = makeUniqueIdentifier(_identifier); @@ -131,6 +143,9 @@ ScreenSpaceSkyBrowser::ScreenSpaceSkyBrowser(const ghoul::Dictionary& 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 + ); addProperty(_isHidden); addProperty(_url); @@ -139,6 +154,7 @@ ScreenSpaceSkyBrowser::ScreenSpaceSkyBrowser(const ghoul::Dictionary& dictionary addProperty(_textureQuality); addProperty(_verticalFov); addProperty(_isPointingSpacecraft); + addProperty(_updateDuringTargetAnimation); _textureQuality.onChange([this]() { _isDimensionsDirty = true; }); @@ -199,6 +215,10 @@ bool ScreenSpaceSkyBrowser::isPointingSpacecraft() const { return _isPointingSpacecraft; } +bool ScreenSpaceSkyBrowser::shouldUpdateWhileTargetAnimates() const { + return _updateDuringTargetAnimation; +} + void ScreenSpaceSkyBrowser::setIdInBrowser() const { int currentNode = global::windowDelegate->currentNode(); WwtCommunicator::setIdInBrowser(fmt::format("{}_{}", identifier(), currentNode)); diff --git a/modules/skybrowser/src/targetbrowserpair.cpp b/modules/skybrowser/src/targetbrowserpair.cpp index 90672f5856..57e4e86d48 100644 --- a/modules/skybrowser/src/targetbrowserpair.cpp +++ b/modules/skybrowser/src/targetbrowserpair.cpp @@ -91,7 +91,10 @@ void TargetBrowserPair::fineTuneTarget(const glm::vec2& translation) { } void TargetBrowserPair::synchronizeAim() { - if (!_targetAnimation.isAnimating() && _browser->isInitialized()) { + bool shouldUpdate = + _browser->shouldUpdateWhileTargetAnimates() || + !_targetAnimation.isAnimating(); + if (shouldUpdate && _browser->isInitialized()) { _browser->setEquatorialAim(targetDirectionEquatorial()); _browser->setTargetRoll(targetRoll()); _targetRenderable->setVerticalFov(_browser->verticalFov()); From fb85410850d682b5c4b10273a6a75012936b652d Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Wed, 14 Jun 2023 18:34:37 -0400 Subject: [PATCH 021/701] Fix bug with dark screen space renderables (#2776) --- modules/skybrowser/skybrowsermodule_lua.inl | 1 - src/rendering/screenspacerenderable.cpp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 7201a08cad..b84c568235 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -525,7 +525,6 @@ std::string prunedIdentifier(std::string identifier) { "Name = '" + nameBrowser + "'," "Url = '" + url + "'," "FaceCamera = false," - "Gamma = 2.2," "CartesianPosition = " + ghoul::to_string(positionBrowser) + "}"; diff --git a/src/rendering/screenspacerenderable.cpp b/src/rendering/screenspacerenderable.cpp index b615c75380..35905f2b55 100644 --- a/src/rendering/screenspacerenderable.cpp +++ b/src/rendering/screenspacerenderable.cpp @@ -464,7 +464,7 @@ void ScreenSpaceRenderable::createShaders() { "hdrExposure", static_cast(global::renderEngine->hdrExposure()) ); - rendererData.setValue("disableHDR", global::renderEngine->isHdrDisabled()); + rendererData.setValue("disableHDR", true); dict.setValue("rendererData", rendererData); dict.setValue( From 516b0fadfb8bca75ed1e467761d8cdce329c1db1 Mon Sep 17 00:00:00 2001 From: Micah Acinapura Date: Wed, 14 Jun 2023 18:43:42 -0400 Subject: [PATCH 022/701] updated goldengate and gatewayarch models; (#2775) * updated goldengate and gatewayarch models; update ghoul for cachefix * update ghoul to support current and previous versions of .osmodel * revert ghoul commits * Apply suggestions from code review Co-authored-by: Alexander Bock --------- Co-authored-by: Alexander Bock --- data/assets/educational/scale/gateway_arch.asset | 15 +++++++-------- .../educational/scale/golden_gate_bridge.asset | 6 ++---- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/data/assets/educational/scale/gateway_arch.asset b/data/assets/educational/scale/gateway_arch.asset index 28e89ee780..451b19e50b 100644 --- a/data/assets/educational/scale/gateway_arch.asset +++ b/data/assets/educational/scale/gateway_arch.asset @@ -5,15 +5,13 @@ local sunAsset = asset.require("scene/solarsystem/sun/sun") local modelFolder = asset.syncedResource({ Name = "Scale Gateway Arch", - Type = "UrlSynchronization", + Type = "HttpSynchronization", Identifier = "scale_model_gateway_arch", - Url = "https://wms.openspace.amnh.org/static/sync/url/scalemodels/GatewayArch_fbx.osmodel", - Filename = "GatewayArch_fbx.osmodel", - Override = false + Version = 2 }) -local Location = { 38.624880, -90.184939 } +local Location = { 38.624640, -90.184940 } local ScaleModel = { Identifier = "Scale_GatewayArch", @@ -36,14 +34,15 @@ local ScaleModel = { }, Scale = { Type = "StaticScale", - Scale = 0.5 + Scale = 1.1 } }, Renderable = { Type = "RenderableModel", - GeometryFile = modelFolder .. "GatewayArch_fbx.osmodel", + GeometryFile = modelFolder .. "GatewayArch.osmodel", RotationVector = { 0.0, 157.0, 0.0 }, - LightSources = { sunAsset.LightSource } + LightSources = { sunAsset.LightSource }, + ModelScale = "Centimeter" }, GUI = { Name = "Gateway Arch", diff --git a/data/assets/educational/scale/golden_gate_bridge.asset b/data/assets/educational/scale/golden_gate_bridge.asset index d0ee73f63a..e66860e047 100644 --- a/data/assets/educational/scale/golden_gate_bridge.asset +++ b/data/assets/educational/scale/golden_gate_bridge.asset @@ -5,11 +5,9 @@ local sunAsset = asset.require("scene/solarsystem/sun/sun") local modelFolder = asset.syncedResource({ Name = "Scale Golden Gate Bridge", - Type = "UrlSynchronization", + Type = "HttpSynchronization", Identifier = "scale_model_golden_gate_bridge", - Url = "https://wms.openspace.amnh.org/static/sync/url/scalemodels/golden_gate.osmodel", - Filename = "golden_gate.osmodel", - Override = false + Version = 2 }) From 8d7b4238033cfa5d1c3978a2a6b35b43a1b34b7c Mon Sep 17 00:00:00 2001 From: Micah Acinapura Date: Wed, 14 Jun 2023 18:45:09 -0400 Subject: [PATCH 023/701] Add cache false to jpg layers to remove warnings (#2777) * removing warnings from jpg layers; move scanner warning to debug * update moon texture to v2 * Apply suggestions from code review Co-authored-by: Alexander Bock --------- Co-authored-by: Alexander Bock --- .../dwarf_planets/ceres/layers/colorlayers/lamo_local.asset | 3 ++- .../heliosphere/bastille_day/magnetogram_textures.asset | 3 ++- .../planets/earth/layers/colorlayers/blue_marble.asset | 3 ++- .../earth/layers/heightlayers/blue_marble_height.asset | 3 ++- .../earth/layers/nightlayers/earth_night_texture.asset | 3 ++- .../earth/moon/layers/colorlayers/moon_texture.asset | 5 +++-- .../earth/noaa-sos/land/blue_marble-blue_marble.asset | 3 ++- .../ganymede/layers/colorlayers/ganymede_texture.asset | 3 ++- .../planets/jupiter/io/layers/colorlayers/io_texture.asset | 3 ++- .../jupiter/layers/colorlayers/jupiter_texture.asset | 3 ++- .../planets/mars/layers/colorlayers/mars_texture.asset | 3 ++- .../mercury/layers/colorlayers/alsimap_02122015.asset | 3 ++- .../mercury/layers/colorlayers/casimap_02122015.asset | 3 ++- .../mercury/layers/colorlayers/fesimap_02122015.asset | 3 ++- .../mercury/layers/colorlayers/mercury_texture.asset | 3 ++- .../mercury/layers/colorlayers/mgsimap_02122015.asset | 3 ++- .../mercury/layers/colorlayers/ssimap_02122015.asset | 3 ++- .../neptune/layers/colorlayers/neptune_texture.asset | 3 ++- .../triton_voyager2_clrmosaic_globalfill_600m.asset | 3 ++- .../saturn/dione/layers/colorlayers/dione_texture.asset | 3 ++- .../enceladus/layers/colorlayers/enceladus_texture.asset | 3 ++- .../saturn/iapetus/layers/colorlayers/iapetus_texture.asset | 3 ++- .../planets/saturn/layers/colorlayers/saturn_texture.asset | 3 ++- .../saturn/mimas/layers/colorlayers/mimas_texture.asset | 3 ++- .../saturn/rhea/layers/colorlayers/rhea_texture.asset | 3 ++- .../saturn/tethys/layers/colorlayers/tethys_texture.asset | 3 ++- .../planets/uranus/layers/colorlayers/uranus_texture.asset | 3 ++- .../venus/layers/colorlayers/clouds_magellan_combo.asset | 3 ++- .../layers/colorlayers/clouds_magellan_combo_newyork.asset | 3 ++- .../planets/venus/layers/colorlayers/venus_texture.asset | 6 ++++-- .../solarsystem/sun/layers/colorlayers/sun_texture.asset | 3 ++- modules/spacecraftinstruments/util/instrumentdecoder.cpp | 2 +- 32 files changed, 66 insertions(+), 34 deletions(-) diff --git a/data/assets/scene/solarsystem/dwarf_planets/ceres/layers/colorlayers/lamo_local.asset b/data/assets/scene/solarsystem/dwarf_planets/ceres/layers/colorlayers/lamo_local.asset index 8ca72672c9..4bfd3e4e7d 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/ceres/layers/colorlayers/lamo_local.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/ceres/layers/colorlayers/lamo_local.asset @@ -14,7 +14,8 @@ local Layer = { Identifier = "LAMO_Local", Name = "LAMO [Local]", Enabled = asset.enabled, - FilePath = textures .. "ceres_lamo_4096x2048.png" + FilePath = textures .. "ceres_lamo_4096x2048.png", + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/magnetogram_textures.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/magnetogram_textures.asset index 7dae7bd896..0455bc9b86 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/magnetogram_textures.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/magnetogram_textures.asset @@ -42,7 +42,8 @@ asset.onInitialize(function() Name = imagename, --"Magnetogram-" .. i, Description = "", FilePath = imagename, - Enabled = false + Enabled = false, + CacheSettings = { Enabled = false } } ) end diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/blue_marble.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/blue_marble.asset index f9244b2208..886df1be13 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/blue_marble.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/blue_marble.asset @@ -15,7 +15,8 @@ local Layer = { Name = "Blue Marble", Enabled = asset.enabled, FilePath = texturesPath .. "earth_bluemarble.jpg", - Description = "Earth image from Blue Marble Next Generation" + Description = "Earth image from Blue Marble Next Generation", + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/blue_marble_height.asset b/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/blue_marble_height.asset index 1b6c3fc58a..f6d07c0577 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/blue_marble_height.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/blue_marble_height.asset @@ -20,7 +20,8 @@ local Layer = { Settings = { Multiplier = 40, Offset = -600 - } + }, + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_night_texture.asset b/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_night_texture.asset index b42d01213a..df716c1df8 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_night_texture.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_night_texture.asset @@ -15,7 +15,8 @@ local Layer = { Name = "Earth Night Texture", Enabled = asset.enabled, FilePath = texturesPath .. "earth_night.png", - Description = "Earth's city lights are clearly visible from space" + Description = "Earth's city lights are clearly visible from space", + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/moon_texture.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/moon_texture.asset index d5f236e673..35249206b2 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/moon_texture.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/moon_texture.asset @@ -6,7 +6,7 @@ local texturesPath = asset.syncedResource({ Name = "Moon Textures", Type = "HttpSynchronization", Identifier = "moon_textures", - Version = 1 + Version = 2 }) @@ -15,7 +15,8 @@ local Layer = { Name = "Moon Texture", Enabled = asset.enabled, FilePath = texturesPath .. "WAC_GLOBAL_E000N0000_032P.png", - Description = "Lower Resolution offline version of WAC layer" + Description = "Lower Resolution offline version of WAC layer", + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble.asset index f991d2c041..256ee75fc0 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble.asset @@ -30,7 +30,8 @@ local Layer = { Name = Name, Enabled = asset.enabled, FilePath = syncedDirectory .. "4096.jpg", - Description = Description + Description = Description, + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/ganymede/layers/colorlayers/ganymede_texture.asset b/data/assets/scene/solarsystem/planets/jupiter/ganymede/layers/colorlayers/ganymede_texture.asset index 48c3aeda3c..c13cba2e90 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/ganymede/layers/colorlayers/ganymede_texture.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/ganymede/layers/colorlayers/ganymede_texture.asset @@ -13,7 +13,8 @@ local texturesPath = asset.syncedResource({ local Layer = { Identifier = "Texture", FilePath = texturesPath .. "ganymede.jpg", - Enabled = asset.enabled + Enabled = asset.enabled, + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/io/layers/colorlayers/io_texture.asset b/data/assets/scene/solarsystem/planets/jupiter/io/layers/colorlayers/io_texture.asset index 69015dcc80..d28283f7f2 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/io/layers/colorlayers/io_texture.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/io/layers/colorlayers/io_texture.asset @@ -13,7 +13,8 @@ local texturesPath = asset.syncedResource({ local Layer = { Identifier = "Texture", FilePath = texturesPath .. "io.jpg", - Enabled = asset.enabled + Enabled = asset.enabled, + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/layers/colorlayers/jupiter_texture.asset b/data/assets/scene/solarsystem/planets/jupiter/layers/colorlayers/jupiter_texture.asset index 7fc4927002..3b8eaf3ee3 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/layers/colorlayers/jupiter_texture.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/layers/colorlayers/jupiter_texture.asset @@ -13,7 +13,8 @@ local texturesPath = asset.syncedResource({ local Layer = { Identifier = "Texture", FilePath = texturesPath .. "jupiter_os.tif", - Enabled = asset.enabled + Enabled = asset.enabled, + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mars_texture.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mars_texture.asset index 34d40999ea..605155e4d0 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mars_texture.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mars_texture.asset @@ -15,7 +15,8 @@ local Layer = { Name = "Mars Texture", Enabled = asset.enabled, FilePath = texturesPath .. "mars.jpg", - Description = "Default jpg texture for Mars" + Description = "Default jpg texture for Mars", + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/alsimap_02122015.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/alsimap_02122015.asset index d796c5e88a..e27c699f95 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/alsimap_02122015.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/alsimap_02122015.asset @@ -15,7 +15,8 @@ local Layer = { Identifier = "alsimap_02122015", Enabled = asset.enabled, FilePath = texturesPath .. "alsimap_02122015.png", - BlendMode = "Multiply" + BlendMode = "Multiply", + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/casimap_02122015.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/casimap_02122015.asset index 91e6d3e67d..dc5e3e71c7 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/casimap_02122015.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/casimap_02122015.asset @@ -15,7 +15,8 @@ local Layer = { Identifier = "casimap_02122015", Enabled = asset.enabled, FilePath = texturesPath .. "casimap_02122015.png", - BlendMode = "Multiply" + BlendMode = "Multiply", + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/fesimap_02122015.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/fesimap_02122015.asset index 30e3529429..fb397287a7 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/fesimap_02122015.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/fesimap_02122015.asset @@ -15,7 +15,8 @@ local Layer = { Identifier = "fesimap_02122015", Enabled = asset.enabled, FilePath = texturesPath .. "fesimap_02122015.png", - BlendMode = "Multiply" + BlendMode = "Multiply", + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/mercury_texture.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/mercury_texture.asset index 9c507209f4..363bef5186 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/mercury_texture.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/mercury_texture.asset @@ -16,7 +16,8 @@ local Layer = { Enabled = asset.enabled, Description = [[The Map Projected Basemap RDR (BDR) data set consists of a global monochrome map of reflectance at a resolution of 256 pixels per degree (~166 m/p). - This is an offline version with lower resoution than the Messenger BDR layer.]] + This is an offline version with lower resoution than the Messenger BDR layer.]], + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/mgsimap_02122015.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/mgsimap_02122015.asset index 1fa0e13d80..f83de8ebad 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/mgsimap_02122015.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/mgsimap_02122015.asset @@ -19,7 +19,8 @@ local Layer = { Gamma = 1.33, Multiplier = 1.15 }, - BlendMode = "Multiply" + BlendMode = "Multiply", + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/ssimap_02122015.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/ssimap_02122015.asset index 9ba29f0e9d..52f6cc4076 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/ssimap_02122015.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/ssimap_02122015.asset @@ -15,7 +15,8 @@ local Layer = { Identifier = "ssimap_02122015", Enabled = asset.enabled, FilePath = texturesPath .. "ssimap_02122015.png", - BlendMode = "Multiply" + BlendMode = "Multiply", + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/neptune/layers/colorlayers/neptune_texture.asset b/data/assets/scene/solarsystem/planets/neptune/layers/colorlayers/neptune_texture.asset index 06c5a383f7..1e5705d57f 100644 --- a/data/assets/scene/solarsystem/planets/neptune/layers/colorlayers/neptune_texture.asset +++ b/data/assets/scene/solarsystem/planets/neptune/layers/colorlayers/neptune_texture.asset @@ -13,7 +13,8 @@ local texturesPath = asset.syncedResource({ local Layer = { Identifier = "Texture", FilePath = texturesPath .. "neptune.jpg", - Enabled = asset.enabled + Enabled = asset.enabled, + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/neptune/triton/layers/colorlayers/triton_voyager2_clrmosaic_globalfill_600m.asset b/data/assets/scene/solarsystem/planets/neptune/triton/layers/colorlayers/triton_voyager2_clrmosaic_globalfill_600m.asset index c6e34d821f..46e83c352b 100644 --- a/data/assets/scene/solarsystem/planets/neptune/triton/layers/colorlayers/triton_voyager2_clrmosaic_globalfill_600m.asset +++ b/data/assets/scene/solarsystem/planets/neptune/triton/layers/colorlayers/triton_voyager2_clrmosaic_globalfill_600m.asset @@ -19,7 +19,8 @@ local Layer = { This map has a resolution of 1,970 feet (600 meters per pixel [m]). Color was synthesized by combining high-resolution images taken through orange, violet, and ultraviolet filters; these images were displayed as red, green, and blue images and combined to create this - color version (Smith et al., 1989).]] + color version (Smith et al., 1989).]], + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/saturn/dione/layers/colorlayers/dione_texture.asset b/data/assets/scene/solarsystem/planets/saturn/dione/layers/colorlayers/dione_texture.asset index 4c2c4305f9..caca2f9069 100644 --- a/data/assets/scene/solarsystem/planets/saturn/dione/layers/colorlayers/dione_texture.asset +++ b/data/assets/scene/solarsystem/planets/saturn/dione/layers/colorlayers/dione_texture.asset @@ -13,7 +13,8 @@ local texturesPath = asset.syncedResource({ local Layer = { Identifier = "Texture", FilePath = texturesPath .. "dione.jpg", - Enabled = asset.enabled + Enabled = asset.enabled, + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/enceladus_texture.asset b/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/enceladus_texture.asset index 1cd5ccc633..0dd079b028 100644 --- a/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/enceladus_texture.asset +++ b/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/enceladus_texture.asset @@ -13,7 +13,8 @@ local texturesPath = asset.syncedResource({ local Layer = { Identifier = "Texture", FilePath = texturesPath .. "enceladus.jpg", - Enabled = asset.enabled + Enabled = asset.enabled, + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/saturn/iapetus/layers/colorlayers/iapetus_texture.asset b/data/assets/scene/solarsystem/planets/saturn/iapetus/layers/colorlayers/iapetus_texture.asset index 842d15cc5b..b3b19e7464 100644 --- a/data/assets/scene/solarsystem/planets/saturn/iapetus/layers/colorlayers/iapetus_texture.asset +++ b/data/assets/scene/solarsystem/planets/saturn/iapetus/layers/colorlayers/iapetus_texture.asset @@ -13,7 +13,8 @@ local texturesPath = asset.syncedResource({ local layer = { Identifier = "Texture", FilePath = texturesPath .. "iapetus.jpg", - Enabled = asset.enabled + Enabled = asset.enabled, + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/saturn/layers/colorlayers/saturn_texture.asset b/data/assets/scene/solarsystem/planets/saturn/layers/colorlayers/saturn_texture.asset index 53ad4d9cb0..a3e7ca57ad 100644 --- a/data/assets/scene/solarsystem/planets/saturn/layers/colorlayers/saturn_texture.asset +++ b/data/assets/scene/solarsystem/planets/saturn/layers/colorlayers/saturn_texture.asset @@ -13,7 +13,8 @@ local texturesPath = asset.syncedResource({ local Layer = { Identifier = "Texture", FilePath = texturesPath .. "saturn.jpg", - Enabled = asset.enabled + Enabled = asset.enabled, + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/saturn/mimas/layers/colorlayers/mimas_texture.asset b/data/assets/scene/solarsystem/planets/saturn/mimas/layers/colorlayers/mimas_texture.asset index fc2feae315..6c000042f2 100644 --- a/data/assets/scene/solarsystem/planets/saturn/mimas/layers/colorlayers/mimas_texture.asset +++ b/data/assets/scene/solarsystem/planets/saturn/mimas/layers/colorlayers/mimas_texture.asset @@ -13,7 +13,8 @@ local texturesPath = asset.syncedResource({ local Layer = { Identifier = "Texture", FilePath = texturesPath .. "mimas.jpg", - Enabled = asset.enabled + Enabled = asset.enabled, + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/saturn/rhea/layers/colorlayers/rhea_texture.asset b/data/assets/scene/solarsystem/planets/saturn/rhea/layers/colorlayers/rhea_texture.asset index 7a704c70f5..9ff9287019 100644 --- a/data/assets/scene/solarsystem/planets/saturn/rhea/layers/colorlayers/rhea_texture.asset +++ b/data/assets/scene/solarsystem/planets/saturn/rhea/layers/colorlayers/rhea_texture.asset @@ -13,7 +13,8 @@ local texturesPath = asset.syncedResource({ local Layer = { Identifier = "Texture", FilePath = texturesPath .. "rhea.jpg", - Enabled = asset.enabled + Enabled = asset.enabled, + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/saturn/tethys/layers/colorlayers/tethys_texture.asset b/data/assets/scene/solarsystem/planets/saturn/tethys/layers/colorlayers/tethys_texture.asset index bf048d863e..5e76f7b274 100644 --- a/data/assets/scene/solarsystem/planets/saturn/tethys/layers/colorlayers/tethys_texture.asset +++ b/data/assets/scene/solarsystem/planets/saturn/tethys/layers/colorlayers/tethys_texture.asset @@ -13,7 +13,8 @@ local texturesPath = asset.syncedResource({ local Layer = { Identifier = "Texture", FilePath = texturesPath .. "tethys.jpg", - Enabled = asset.enabled + Enabled = asset.enabled, + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/uranus/layers/colorlayers/uranus_texture.asset b/data/assets/scene/solarsystem/planets/uranus/layers/colorlayers/uranus_texture.asset index 5e9d4272bf..b8702a1d72 100644 --- a/data/assets/scene/solarsystem/planets/uranus/layers/colorlayers/uranus_texture.asset +++ b/data/assets/scene/solarsystem/planets/uranus/layers/colorlayers/uranus_texture.asset @@ -13,7 +13,8 @@ local texturesPath = asset.syncedResource({ local Layer = { Identifier = "Texture", FilePath = texturesPath .. "uranus.jpg", - Enabled = asset.enabled + Enabled = asset.enabled, + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo.asset b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo.asset index 603db61c9a..74d459010f 100644 --- a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo.asset +++ b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo.asset @@ -21,7 +21,8 @@ local Layer = { TileProvider = { Identifier = "Clouds", Name = "Clouds", - FilePath = texturesPath .. "venus_clouds.jpg" + FilePath = texturesPath .. "venus_clouds.jpg", + CacheSettings = { Enabled = false } } }, { diff --git a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo_newyork.asset b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo_newyork.asset index e8a1211c15..87477b880b 100644 --- a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo_newyork.asset +++ b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo_newyork.asset @@ -21,7 +21,8 @@ local Layer = { TileProvider = { Identifier = "Clouds", Name = "Clouds", - FilePath = texturesPath .. "venus_clouds.jpg" + FilePath = texturesPath .. "venus_clouds.jpg", + CacheSettings = { Enabled = false } } }, { diff --git a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/venus_texture.asset b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/venus_texture.asset index b49f35bc9c..d327130a11 100644 --- a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/venus_texture.asset +++ b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/venus_texture.asset @@ -13,7 +13,8 @@ local texturesPath = asset.syncedResource({ local Clouds = { Identifier = "Clouds", FilePath = texturesPath .. "venus_clouds.jpg", - Enabled = asset.enabled + Enabled = asset.enabled, + CacheSettings = { Enabled = false } } local Layer = { @@ -23,7 +24,8 @@ local Layer = { Settings = { Opacity = 0.48, Gamma = 0.48 - } + }, + CacheSettings = { Enabled = false } } diff --git a/data/assets/scene/solarsystem/sun/layers/colorlayers/sun_texture.asset b/data/assets/scene/solarsystem/sun/layers/colorlayers/sun_texture.asset index 830731671f..e0a558a030 100644 --- a/data/assets/scene/solarsystem/sun/layers/colorlayers/sun_texture.asset +++ b/data/assets/scene/solarsystem/sun/layers/colorlayers/sun_texture.asset @@ -13,7 +13,8 @@ local texturesPath = asset.syncedResource({ local Layer = { Identifier = "Texture", FilePath = texturesPath .. "sun.jpg", - Enabled = asset.enabled + Enabled = asset.enabled, + CacheSettings = { Enabled = false } } diff --git a/modules/spacecraftinstruments/util/instrumentdecoder.cpp b/modules/spacecraftinstruments/util/instrumentdecoder.cpp index a06ab2fe11..5fa03edf2a 100644 --- a/modules/spacecraftinstruments/util/instrumentdecoder.cpp +++ b/modules/spacecraftinstruments/util/instrumentdecoder.cpp @@ -57,7 +57,7 @@ InstrumentDecoder::InstrumentDecoder(const ghoul::Dictionary& dictionary) { _stopCommand = *p.stopCommand; } else { - LWARNING("Scanner must provide stop command, please check asset file"); + LDEBUG("Scanner must provide stop command, please check asset file"); } _spiceIDs = p.spice; From 1c281b2545414a98097726aa38a2207eb836590c Mon Sep 17 00:00:00 2001 From: Micah Acinapura Date: Wed, 14 Jun 2023 18:46:30 -0400 Subject: [PATCH 024/701] Remove panoramas until licenced; remove currentFocus lighting action until fixed; (#2778) * removing panoramas until licensing is sorted * remove current focus from planet lighting until its fixed --- .../actions/planets/planet_lighting.asset | 22 +- data/assets/nightsky/ground_panoramas.asset | 188 ------------------ data/assets/nightsky/nightsky.asset | 1 - 3 files changed, 11 insertions(+), 200 deletions(-) delete mode 100644 data/assets/nightsky/ground_panoramas.asset diff --git a/data/assets/actions/planets/planet_lighting.asset b/data/assets/actions/planets/planet_lighting.asset index 2676f71a8d..5a8923845f 100644 --- a/data/assets/actions/planets/planet_lighting.asset +++ b/data/assets/actions/planets/planet_lighting.asset @@ -59,13 +59,13 @@ local function illuminationAction(node, nodeLower, global) Command = actionCommand, Documentation = "Enables " .. string.lower(actionName) .. " for" .. node, GuiPath = "/Solar System/" .. node, - IsLocal = true + IsLocal = false } return action end -local CurrentFocusGlobal = illuminationAction("Current Focus", "current_focus", true) -local CurrentFocusStandard = illuminationAction("Current Focus", "current_focus", false) +--local CurrentFocusGlobal = illuminationAction("Current Focus", "current_focus", true) +--local CurrentFocusStandard = illuminationAction("Current Focus", "current_focus", false) local EarthGlobal = illuminationAction("Earth", "earth", true) local EarthStandard = illuminationAction("Earth", "earth", false) @@ -98,7 +98,7 @@ local AllGlobesGlobalIllumination = { ]], Documentation = "Enables global illumination for all globes", GuiPath = "/Solar System", - IsLocal = true + IsLocal = false } local AllGlobesStandardIllumination = { @@ -114,13 +114,13 @@ local AllGlobesStandardIllumination = { ]], Documentation = "Disables global illumination for all globes", GuiPath = "/Solar System", - IsLocal = true + IsLocal = false } asset.onInitialize(function() - openspace.action.registerAction(CurrentFocusGlobal) - openspace.action.registerAction(CurrentFocusStandard) + -- openspace.action.registerAction(CurrentFocusGlobal) + -- openspace.action.registerAction(CurrentFocusStandard) openspace.action.registerAction(EarthGlobal) openspace.action.registerAction(EarthStandard) openspace.action.registerAction(MarsGlobal) @@ -148,12 +148,12 @@ asset.onDeinitialize(function() openspace.action.removeAction(MarsGlobal) openspace.action.removeAction(EarthStandard) openspace.action.removeAction(EarthGlobal) - openspace.action.removeAction(CurrentFocusStandard) - openspace.action.removeAction(CurrentFocusGlobal) + -- openspace.action.removeAction(CurrentFocusStandard) + -- openspace.action.removeAction(CurrentFocusGlobal) end) -asset.export("CurrentFocusGlobal", CurrentFocusGlobal.Identifier) -asset.export("CurrentFocusStandard", CurrentFocusStandard.Identifier) +-- asset.export("CurrentFocusGlobal", CurrentFocusGlobal.Identifier) +-- asset.export("CurrentFocusStandard", CurrentFocusStandard.Identifier) asset.export("EarthGlobal", EarthGlobal.Identifier) asset.export("EarthStandard", EarthStandard.Identifier) asset.export("MarsGlobal", MarsGlobal.Identifier) diff --git a/data/assets/nightsky/ground_panoramas.asset b/data/assets/nightsky/ground_panoramas.asset deleted file mode 100644 index 6e2cf44100..0000000000 --- a/data/assets/nightsky/ground_panoramas.asset +++ /dev/null @@ -1,188 +0,0 @@ -local earthAsset = asset.require("scene/solarsystem/planets/earth/earth") - - - -local textures = asset.syncedResource({ - Name = "Ground Panorama Textures", - Type = "UrlSynchronization", - Identifier = "ground_panorama_textures", - Url = { - "https://wms.openspace.amnh.org/static/sync/url/panos/0.png", - "https://wms.openspace.amnh.org/static/sync/url/panos/1.png", - "https://wms.openspace.amnh.org/static/sync/url/panos/2.png", - "https://wms.openspace.amnh.org/static/sync/url/panos/3.png", - "https://wms.openspace.amnh.org/static/sync/url/panos/4.png", - "https://wms.openspace.amnh.org/static/sync/url/panos/5.png", - "https://wms.openspace.amnh.org/static/sync/url/panos/6.png" - }, - Override = false -}) - - -local GroundPanoPosition = { - Identifier = "GroundPanoPosition", - Parent = earthAsset.Earth.Identifier, - Transform = { - Translation = { - Type = "GlobeTranslation", - Globe = earthAsset.Earth.Identifier, - Latitude = 34.201639, - Longitude = -118.171319, - Altitude = 10.0, - UseCamera = false, - UseCameraAltitude = false - }, - Rotation = { - Type = "GlobeRotation", - Globe = earthAsset.Earth.Identifier, - Latitude = 34.201639, - Longitude = -118.171319, - UseHeightmap = false, - Angle = 270.0 - } - }, - GUI = { - Name = "Ground Pano Position", - Path = "/Other/Night Sky", - Hidden = true - } -} - -local GroundPanoSphere = { - Identifier = "GroundPanoSphere", - Parent = GroundPanoPosition.Identifier, - Transform = { - Rotation = { - Type = "StaticRotation", - Rotation = { -math.pi / 2, 0.0, 0.0 } - } - }, - Renderable = { - Type = "RenderableSphere", - Size = 8.5, - Segments = 40, - Opacity = 1.0, - Enabled = asset.enabled, - Texture = textures .. "3.png", - Orientation = "Inside", - MirrorTexture = true, - FadeOutThreshold = 1.00, - Background = true, - RenderBinMode = "Overlay" - }, - GUI = { - Name = "Ground Panorama", - Path = "/Other/Night Sky" - } -} - -local showCommand = [[ - local lat, lon, alt = openspace.globebrowsing.getGeoPositionForCamera() - local camera = openspace.navigation.getNavigationState() - openspace.setParent("GroundPanoPosition", camera.Anchor) - openspace.setPropertyValueSingle("Scene.GroundPanoPosition.Translation.Globe", camera.Anchor) - openspace.setPropertyValueSingle("Scene.GroundPanoPosition.Translation.Latitude", lat) - openspace.setPropertyValueSingle("Scene.GroundPanoPosition.Translation.Longitude", lon) - openspace.setPropertyValueSingle("Scene.GroundPanoPosition.Translation.Altitude", alt) - openspace.setPropertyValueSingle("Scene.GroundPanoPosition.Rotation.Globe", camera.Anchor) - openspace.setPropertyValueSingle("Scene.GroundPanoPosition.Rotation.Latitude", lat) - openspace.setPropertyValueSingle("Scene.GroundPanoPosition.Rotation.Longitude", lon) - openspace.setPropertyValueSingle("Scene.GroundPanoSphere.Renderable.Enabled", true) - openspace.setPropertyValueSingle("Scene.GroundPanoSphere.Renderable.Fade", 0.0) - openspace.setPropertyValueSingle("Scene.GroundPanoSphere.Renderable.Fade", 1.0, 1.0) -]] - -local setTextureCommand = function(scene) - local command = [[openspace.setPropertyValueSingle("Scene.GroundPanoSphere.Renderable.Texture", "]] - command = command .. textures - if (scene == "forest") then - command = command .. "1" - elseif (scene == "city") then - command = command .. "2" - elseif (scene == "backyard") then - command = command .. "3" - elseif (scene == "desert") then - command = command .. "4" - else - openspace.printDebug("unknown scene") - end - command = command .. [[.png")]] - command = command:gsub("\\", "\\\\") - return command -end - -local ShowForestPano = { - Identifier = "os.nightsky.ShowForestPano", - Name = "Show forest panorama", - Command = setTextureCommand("forest") .. showCommand, - Documentation = "Shows the panorama sphere with a forest scene", - GuiPath = "/Night Sky/Panoramas", - IsLocal = false -} - -local ShowCityPano = { - Identifier = "os.nightsky.ShowCityPano", - Name = "Show city panorama", - Command = setTextureCommand("city") .. showCommand, - Documentation = "Shows the panorama sphere with a city scene", - GuiPath = "/Night Sky/Panoramas", - IsLocal = false -} - -local ShowBackyardPano = { - Identifier = "os.nightsky.ShowBackyardPano", - Name = "Show backyard panorama", - Command = setTextureCommand("backyard") .. showCommand, - Documentation = "Shows the panorama sphere with a backyard scene", - GuiPath = "/Night Sky/Panoramas", - IsLocal = false -} - -local ShowDesertPano = { - Identifier = "os.nightsky.ShowDesertPano", - Name = "Show desert panorama", - Command = setTextureCommand("desert") .. showCommand, - Documentation = "Shows the panorama sphere with a desert scene", - GuiPath = "/Night Sky/Panoramas", - IsLocal = false -} - -local HideGroundPano = { - Identifier = "os.nightsky.HideGroundPano", - Name = "Hide ground panorama", - Command = [[ - openspace.fadeOut("Scene.GroundPanoSphere.Renderable") - ]], - Documentation = "Hides the panorama", - GuiPath = "/Night Sky/Panoramas", - IsLocal = false -} - - -asset.onInitialize(function() - openspace.addSceneGraphNode(GroundPanoPosition) - openspace.addSceneGraphNode(GroundPanoSphere) - openspace.action.registerAction(ShowForestPano) - openspace.action.registerAction(ShowCityPano) - openspace.action.registerAction(ShowBackyardPano) - openspace.action.registerAction(ShowDesertPano) - openspace.action.registerAction(HideGroundPano) -end) - -asset.onDeinitialize(function() - openspace.action.removeAction(HideGroundPano) - openspace.action.removeAction(ShowForestPano) - openspace.action.removeAction(ShowCityPano) - openspace.action.removeAction(ShowBackyardPano) - openspace.action.removeAction(ShowDesertPano) - openspace.removeSceneGraphNode(GroundPanoSphere) - openspace.removeSceneGraphNode(GroundPanoPosition) -end) - -asset.export(GroundPanoPosition) -asset.export(GroundPanoSphere) -asset.export("ShowForestPano", ShowForestPano.Identifier) -asset.export("ShowCityPano", ShowCityPano.Identifier) -asset.export("ShowBackyardPano", ShowBackyardPano.Identifier) -asset.export("ShowDesertPano", ShowDesertPano.Identifier) -asset.export("HideGroundPano", HideGroundPano.Identifier) diff --git a/data/assets/nightsky/nightsky.asset b/data/assets/nightsky/nightsky.asset index cac8f1d380..57cc9e2dd0 100644 --- a/data/assets/nightsky/nightsky.asset +++ b/data/assets/nightsky/nightsky.asset @@ -3,7 +3,6 @@ asset.require("./cardinal_directions", false) asset.require("./ecliptic_band", false) asset.require("./equatorial_band", false) asset.require("./galactic_band", false) -asset.require("./ground_panoramas", false) asset.require("./meridian", false) asset.require("./light_pollution", false) asset.require("./zenith", false) From 5c8ff9eec5e3d2d1196494cba3318fbb0ba23174 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 15 Jun 2023 00:52:39 +0200 Subject: [PATCH 025/701] Revert "Merge pull request #2721 from OpenSpace/issue/2682" This reverts commit b4337e8188624ce1454beae9095f35cd2998fd14, reversing changes made to 384f1e55307090b68bfa5a4846e5f48b88c4a49b. --- modules/globebrowsing/src/basictypes.h | 1 - modules/globebrowsing/src/rawtiledatareader.cpp | 4 +++- .../src/tileprovider/defaulttileprovider.cpp | 9 +-------- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/modules/globebrowsing/src/basictypes.h b/modules/globebrowsing/src/basictypes.h index 4e7bd94e3f..6655d2611a 100644 --- a/modules/globebrowsing/src/basictypes.h +++ b/modules/globebrowsing/src/basictypes.h @@ -104,7 +104,6 @@ struct TileMetaData { std::array maxValues; std::array minValues; std::array hasMissingData; - bool allMissingData = false; uint8_t nValues = 0; }; diff --git a/modules/globebrowsing/src/rawtiledatareader.cpp b/modules/globebrowsing/src/rawtiledatareader.cpp index 01ccd67694..d3f00fe0ea 100644 --- a/modules/globebrowsing/src/rawtiledatareader.cpp +++ b/modules/globebrowsing/src/rawtiledatareader.cpp @@ -977,7 +977,9 @@ TileMetaData RawTileDataReader::tileMetaData(RawTile& rawTile, } } - ppData.allMissingData = allIsMissing; + if (allIsMissing) { + rawTile.error = RawTile::ReadError::Failure; + } return ppData; } diff --git a/modules/globebrowsing/src/tileprovider/defaulttileprovider.cpp b/modules/globebrowsing/src/tileprovider/defaulttileprovider.cpp index 0ed4601d23..60bb918b4e 100644 --- a/modules/globebrowsing/src/tileprovider/defaulttileprovider.cpp +++ b/modules/globebrowsing/src/tileprovider/defaulttileprovider.cpp @@ -251,16 +251,9 @@ Tile::Status DefaultTileProvider::tileStatus(const TileIndex& index) { .tileIndex = index, .providerID = uniqueIdentifier }; - cache::MemoryAwareTileCache* tileCache = global::moduleEngine->module()->tileCache(); - - Tile t = tileCache->get(key); - if (t.metaData.has_value() && t.metaData->allMissingData) { - return Tile::Status::OutOfRange; - } - - return t.status; + return tileCache->get(key).status; } TileDepthTransform DefaultTileProvider::depthTransform() { From bf38d9a415753f44bcd5e3735296c62835bf3b4e Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Thu, 15 Jun 2023 16:35:06 +0200 Subject: [PATCH 026/701] provide some more info in GEOS errors on geojson load --- .../src/geojson/globegeometryfeature.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/modules/globebrowsing/src/geojson/globegeometryfeature.cpp b/modules/globebrowsing/src/geojson/globegeometryfeature.cpp index c41f17d626..74c699b874 100644 --- a/modules/globebrowsing/src/geojson/globegeometryfeature.cpp +++ b/modules/globebrowsing/src/geojson/globegeometryfeature.cpp @@ -231,13 +231,20 @@ void GlobeGeometryFeature::createFromSingleGeosGeometry(const geos::geom::Geomet _type = GeometryType::Polygon; } - catch (geos::util::IllegalStateException&) { - LERROR("Non-simple (e.g. self-intersecting) polygons not supported yet"); + catch (geos::util::IllegalStateException& e) { + LERROR(fmt::format( + "Non-simple (e.g. self-intersecting) polygons not supported yet. " + "GEOS error: '{}'", e.what() + )); throw ghoul::MissingCaseException(); // TODO: handle self-intersections points // https://www.sciencedirect.com/science/article/pii/S0304397520304199 } + catch (geos::util::GEOSException& e) { + LERROR(fmt::format("Unknown geos error: {}", e.what())); + throw ghoul::MissingCaseException(); + } break; } default: From 3bbe19f56c76b8d1ccf6dc785c82ac8fd4bc789d Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Thu, 15 Jun 2023 18:30:08 +0200 Subject: [PATCH 027/701] Update GUI hash --- data/assets/util/webgui.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/util/webgui.asset b/data/assets/util/webgui.asset index 2f6431c17f..98c92d27c7 100644 --- a/data/assets/util/webgui.asset +++ b/data/assets/util/webgui.asset @@ -4,7 +4,7 @@ local guiCustomization = asset.require("customization/gui") -- Select which commit hashes to use for the frontend and backend -local frontendHash = "3f93d653ee4783b22a38a6c771e599cbd95326c5" +local frontendHash = "aab5767cdfe004a8a512f18e41217f608b62f131" local frontend = asset.syncedResource({ Identifier = "WebGuiFrontend", From 23b01aba12611ae7b61e4826c5a87e6f54736665 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Thu, 15 Jun 2023 18:40:51 +0200 Subject: [PATCH 028/701] Add a trigger property to delete a geojson component --- .../src/geojson/geojsoncomponent.cpp | 26 +++++++++++++++++++ .../src/geojson/geojsoncomponent.h | 5 ++++ 2 files changed, 31 insertions(+) diff --git a/modules/globebrowsing/src/geojson/geojsoncomponent.cpp b/modules/globebrowsing/src/geojson/geojsoncomponent.cpp index 9bf2fcbf1e..394f5e4f00 100644 --- a/modules/globebrowsing/src/geojson/geojsoncomponent.cpp +++ b/modules/globebrowsing/src/geojson/geojsoncomponent.cpp @@ -165,6 +165,14 @@ namespace { openspace::properties::Property::Visibility::NoviceUser }; + constexpr openspace::properties::Property::PropertyInfo DeleteInfo = { + "Delete", + "Delete", + "Triggering this will remove this GeoJson component from its globe. Note that the " + "GUI may have to be reloaded for the change to be reflect in the user interface.", + openspace::properties::Property::Visibility::User + }; + struct [[codegen::Dictionary(GeoJsonComponent)]] Parameters { // The unique identifier for this layer. May not contain '.' or spaces std::string identifier; @@ -305,6 +313,8 @@ GeoJsonComponent::GeoJsonComponent(const ghoul::Dictionary& dictionary, glm::vec2(90.f, 180.f) ) , _flyToFeature(FlyToFeatureInfo) + , _deleteThisComponent(DeleteInfo) + , _deletePropertyOwner({ "Deletion", "Deletion" }) , _lightSourcePropertyOwner({ "LightSources", "Light Sources" }) , _featuresPropertyOwner({ "Features", "Features" }) { @@ -404,6 +414,12 @@ GeoJsonComponent::GeoJsonComponent(const ghoul::Dictionary& dictionary, _flyToFeature.onChange([this]() { flyToFeature(); }); addProperty(_flyToFeature); + // Add delete trigger under its own property owner, to make it more difficult to + // access by mistake + _deleteThisComponent.onChange([this]() { triggerDeletion(); }); + _deletePropertyOwner.addProperty(_deleteThisComponent); + addPropertySubOwner(_deletePropertyOwner); + readFile(); if (p.lightSources.has_value()) { @@ -812,4 +828,14 @@ void GeoJsonComponent::flyToFeature(std::optional index) const { ); } +void GeoJsonComponent::triggerDeletion() const { + global::scriptEngine->queueScript( + fmt::format( + "openspace.globebrowsing.deleteGeoJson(\"{}\", \"{}\")", + _globeNode.owner()->identifier(), _identifier + ), + scripting::ScriptEngine::RemoteScripting::Yes + ); +} + } // namespace openspace::globebrowsing diff --git a/modules/globebrowsing/src/geojson/geojsoncomponent.h b/modules/globebrowsing/src/geojson/geojsoncomponent.h index 133960bc65..5e25c552ff 100644 --- a/modules/globebrowsing/src/geojson/geojsoncomponent.h +++ b/modules/globebrowsing/src/geojson/geojsoncomponent.h @@ -115,6 +115,8 @@ private: */ void flyToFeature(std::optional index = std::nullopt) const; + void triggerDeletion() const; + std::vector _geometryFeatures; properties::BoolProperty _enabled; @@ -146,6 +148,9 @@ private: float _bboxDiagonalSize = 0.f; properties::TriggerProperty _flyToFeature; + properties::PropertyOwner _deletePropertyOwner; + properties::TriggerProperty _deleteThisComponent; + std::vector> _lightSources; std::unique_ptr _defaultLightSource; From 0b20affc5d37c71ef7a5b02df3dbbcdedb14cde1 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Thu, 15 Jun 2023 15:42:32 -0400 Subject: [PATCH 029/701] Add border to screenspace renderables --- .../rendering/screenspacerenderable.h | 7 ++- modules/base/shaders/screenspace_fs.glsl | 9 ++++ modules/skybrowser/include/wwtcommunicator.h | 2 +- .../skybrowser/src/screenspaceskybrowser.cpp | 2 +- modules/skybrowser/src/wwtcommunicator.cpp | 6 +-- src/rendering/screenspacerenderable.cpp | 43 +++++++++++++++++-- 6 files changed, 60 insertions(+), 9 deletions(-) diff --git a/include/openspace/rendering/screenspacerenderable.h b/include/openspace/rendering/screenspacerenderable.h index 93b03efe17..886e16c109 100644 --- a/include/openspace/rendering/screenspacerenderable.h +++ b/include/openspace/rendering/screenspacerenderable.h @@ -129,6 +129,10 @@ protected: // Local rotation (roll, pitch, yaw) properties::Vec3Property _localRotation; + // Border + properties::FloatProperty _borderWidth; + properties::Vec3Property _borderColor; + properties::FloatProperty _scale; properties::FloatProperty _gamma; properties::Vec3Property _multiplyColor; @@ -136,7 +140,8 @@ protected: properties::TriggerProperty _delete; glm::ivec2 _objectSize = glm::ivec2(0); - UniformCache(color, opacity, mvp, texture, backgroundColor, gamma) _uniformCache; + UniformCache(color, opacity, mvp, texture, backgroundColor, gamma, + borderColor, borderWidth) _uniformCache; std::unique_ptr _shader; }; diff --git a/modules/base/shaders/screenspace_fs.glsl b/modules/base/shaders/screenspace_fs.glsl index 21af960401..6478a93dab 100644 --- a/modules/base/shaders/screenspace_fs.glsl +++ b/modules/base/shaders/screenspace_fs.glsl @@ -33,6 +33,8 @@ uniform vec3 color = vec3(1.0); uniform float opacity = 1.0; uniform vec4 backgroundColor = vec4(0.0); uniform float gamma = 1.0; +uniform vec2 borderWidth = vec2(0.1); +uniform vec3 borderColor = vec3(0.0); Fragment getFragment() { @@ -41,6 +43,13 @@ Fragment getFragment() { vec4 texColor = texture(tex, vs_st) * vec4(color, opacity); frag.color = texColor.a * texColor + (1.0 - texColor.a) * backgroundColor; + + // Set border color + if (vs_st.x < borderWidth.x || vs_st.x > 1 - borderWidth.x || + vs_st.y < borderWidth.y || vs_st.y > 1 - borderWidth.y) { + frag.color = vec4(borderColor, 1.0); + } + if (frag.color.a == 0.0) { discard; } diff --git a/modules/skybrowser/include/wwtcommunicator.h b/modules/skybrowser/include/wwtcommunicator.h index 61f3e2ac65..bc2235dc92 100644 --- a/modules/skybrowser/include/wwtcommunicator.h +++ b/modules/skybrowser/include/wwtcommunicator.h @@ -76,7 +76,7 @@ protected: properties::DoubleProperty _verticalFov; double _borderRadius = 0.0; - glm::ivec3 _borderColor = glm::ivec3(70); + glm::ivec3 _wwtBorderColor = glm::ivec3(70); glm::dvec2 _equatorialAim = glm::dvec2(0.0); double _targetRoll = 0.0; bool _isImageCollectionLoaded = false; diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index 21b11fb99e..4ea4aa90b0 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -143,7 +143,7 @@ ScreenSpaceSkyBrowser::ScreenSpaceSkyBrowser(const ghoul::Dictionary& dictionary _textureQuality.onChange([this]() { _isDimensionsDirty = true; }); if (global::windowDelegate->isMaster()) { - _borderColor = randomBorderColor(); + _wwtBorderColor = randomBorderColor(); } _useRadiusAzimuthElevation.onChange( diff --git a/modules/skybrowser/src/wwtcommunicator.cpp b/modules/skybrowser/src/wwtcommunicator.cpp index 674609710d..67c7224f98 100644 --- a/modules/skybrowser/src/wwtcommunicator.cpp +++ b/modules/skybrowser/src/wwtcommunicator.cpp @@ -242,7 +242,7 @@ void WwtCommunicator::setEquatorialAim(glm::dvec2 equatorial) { } void WwtCommunicator::setBorderColor(glm::ivec3 color) { - _borderColor = std::move(color); + _wwtBorderColor = std::move(color); _borderColorIsDirty = true; } @@ -255,7 +255,7 @@ void WwtCommunicator::setBorderRadius(double radius) { void WwtCommunicator::updateBorderColor() const { std::string script = fmt::format( "setBackgroundColor('rgb({},{},{})');", - _borderColor.x, _borderColor.y, _borderColor.z + _wwtBorderColor.x, _wwtBorderColor.y, _wwtBorderColor.z ); executeJavascript(script); } @@ -355,7 +355,7 @@ void WwtCommunicator::setIdInBrowser(const std::string& id) const { } glm::ivec3 WwtCommunicator::borderColor() const { - return _borderColor; + return _wwtBorderColor; } double WwtCommunicator::verticalFov() const { diff --git a/src/rendering/screenspacerenderable.cpp b/src/rendering/screenspacerenderable.cpp index b615c75380..07f6f1c744 100644 --- a/src/rendering/screenspacerenderable.cpp +++ b/src/rendering/screenspacerenderable.cpp @@ -43,8 +43,9 @@ #include namespace { - constexpr std::array UniformNames = { - "color", "opacity", "mvpMatrix", "tex", "backgroundColor", "gamma" + constexpr std::array UniformNames = { + "color", "opacity", "mvpMatrix", "tex", "backgroundColor", "gamma", "borderColor", + "borderWidth" }; constexpr openspace::properties::Property::PropertyInfo EnabledInfo = { @@ -153,6 +154,20 @@ namespace { openspace::properties::Property::Visibility::AdvancedUser }; + constexpr openspace::properties::Property::PropertyInfo BorderWidthInfo = { + "BorderWidth", + "Border Width", + "The width of the border", + openspace::properties::Property::Visibility::NoviceUser + }; + + constexpr openspace::properties::Property::PropertyInfo BorderColorInfo = { + "BorderColor", + "Border Color", + "Sets the color of the border", + openspace::properties::Property::Visibility::NoviceUser + }; + float wrap(float value, float min, float max) { return glm::mod(value - min, max - min) + min; } @@ -188,6 +203,12 @@ namespace { // [[codegen::verbatim(GammaInfo.description)]] std::optional radiusAzimuthElevation; + // [[codegen::verbatim(BorderWidthInfo.description)]] + std::optional borderWidth; + + // [[codegen::verbatim(BorderColorInfo.description)]] + std::optional borderColor [[codegen::color()]]; + // [[codegen::verbatim(ScaleInfo.description)]] std::optional scale; @@ -292,6 +313,8 @@ ScreenSpaceRenderable::ScreenSpaceRenderable(const ghoul::Dictionary& dictionary glm::vec4(1.f) ) , _delete(DeleteInfo) + , _borderWidth(BorderWidthInfo, 0.f, 0.f, 1000.f) + , _borderColor(BorderColorInfo, glm::vec3(0.f), glm::vec3(0.f), glm::vec3(1.f)) { const Parameters p = codegen::bake(dictionary); @@ -328,6 +351,13 @@ ScreenSpaceRenderable::ScreenSpaceRenderable(const ghoul::Dictionary& dictionary addProperty(Fadeable::_fade); addProperty(_localRotation); + addProperty(_borderColor); + addProperty(_borderWidth); + + _borderWidth = p.borderWidth.value_or(_borderWidth); + + _borderColor = p.borderColor.value_or(_borderColor); + _borderColor.setViewOption(properties::Property::ViewOptions::Color); _multiplyColor = p.multiplyColor.value_or(_multiplyColor); _multiplyColor.setViewOption(properties::Property::ViewOptions::Color); @@ -498,7 +528,7 @@ glm::vec2 ScreenSpaceRenderable::screenSpacePosition() { return glm::vec2(_cartesianPosition.value()); } -glm::vec2 ScreenSpaceRenderable::screenSpaceDimensions() { +glm::vec2 ScreenSpaceRenderable::screenSpaceDimensions() { float ratio = static_cast(_objectSize.x) / static_cast(_objectSize.y); return glm::vec2(2.f * _scale * ratio, 2.f * _scale); } @@ -596,11 +626,18 @@ void ScreenSpaceRenderable::draw(glm::mat4 modelTransform) { glDisable(GL_CULL_FACE); _shader->activate(); + // Calculate the border from pixels to UV coordinates + glm::vec2 borderUV = glm::vec2( + _borderWidth / static_cast(_objectSize.x), + _borderWidth / static_cast(_objectSize.y) + ); _shader->setUniform(_uniformCache.color, _multiplyColor); _shader->setUniform(_uniformCache.opacity, opacity()); _shader->setUniform(_uniformCache.backgroundColor, _backgroundColor); _shader->setUniform(_uniformCache.gamma, _gamma); + _shader->setUniform(_uniformCache.borderWidth, borderUV); + _shader->setUniform(_uniformCache.borderColor, _borderColor); _shader->setUniform( _uniformCache.mvp, global::renderEngine->scene()->camera()->viewProjectionMatrix() * modelTransform From 91026c4c5208f1449b299002b23152e96dc98cc9 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Tue, 20 Jun 2023 15:54:53 +0200 Subject: [PATCH 030/701] Put statue of libery back on Liberty Island (closes #2787) --- data/assets/educational/scale/statue_of_liberty.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/educational/scale/statue_of_liberty.asset b/data/assets/educational/scale/statue_of_liberty.asset index c01e96f0f0..076469747e 100644 --- a/data/assets/educational/scale/statue_of_liberty.asset +++ b/data/assets/educational/scale/statue_of_liberty.asset @@ -11,7 +11,7 @@ local modelFolder = asset.syncedResource({ }) -local Location = { 48.87389, 2.29492, -3.0 } +local Location = { 40.689206, -74.044487, -3.0 } local ScaleModel = { Identifier = "Scale_StatueOfLiberty", From 89d130dcd5400ebc47cc684c26cd32ca81d9d995 Mon Sep 17 00:00:00 2001 From: Adam Rohdin Date: Wed, 21 Jun 2023 15:58:08 +0200 Subject: [PATCH 031/701] Change Voyager 1 & 2 trail end times to 2021 JAN 01 as it was wrongly changed in old commit --- .../scene/solarsystem/missions/voyager/voyager1.asset | 6 +++--- .../scene/solarsystem/missions/voyager/voyager2.asset | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/data/assets/scene/solarsystem/missions/voyager/voyager1.asset b/data/assets/scene/solarsystem/missions/voyager/voyager1.asset index 14e4e19228..630081d46e 100644 --- a/data/assets/scene/solarsystem/missions/voyager/voyager1.asset +++ b/data/assets/scene/solarsystem/missions/voyager/voyager1.asset @@ -227,9 +227,9 @@ local VoyagerTrailCruiseSaturnInf = { EnableFade = false, Color = { 0.70, 0.50, 0.20 }, StartTime = "1980 NOV 16", - EndTime = "2300 JAN 01", - -- 116558 is the number of days between the Start and End time - SampleInterval = 116558 * 2 + EndTime = "2021 JAN 01", + -- 14656 is the number of days between the Start and End time + SampleInterval = 14656 * 2 }, Tag = { "voyager1_trail" }, GUI = { diff --git a/data/assets/scene/solarsystem/missions/voyager/voyager2.asset b/data/assets/scene/solarsystem/missions/voyager/voyager2.asset index 4c6543dfb4..68cd0c3a89 100644 --- a/data/assets/scene/solarsystem/missions/voyager/voyager2.asset +++ b/data/assets/scene/solarsystem/missions/voyager/voyager2.asset @@ -331,9 +331,9 @@ local VoyagerTrailCruiseNeptuneInf = { EnableFade = false, Color = { 0.70, 0.50, 0.20 }, StartTime = "1989 AUG 26", - EndTime = "2300 JAN 01", - -- 113353 is the number of days between the Start and End time - SampleInterval = 113353 * 2 + EndTime = "2021 JAN 01", + -- 11451 is the number of days between the Start and End time + SampleInterval = 11451 * 2 }, Tag = { "voyager2_trail" }, GUI = { From c424783b5069e9e5945a2f8750355813aa78f3d6 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Thu, 22 Jun 2023 11:08:52 +0200 Subject: [PATCH 032/701] Offset sample coordinate by 0.5 when estimating height values (#2769) * Offset sample coordinate by 0.5 when estimating height values --- modules/globebrowsing/src/renderableglobe.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/globebrowsing/src/renderableglobe.cpp b/modules/globebrowsing/src/renderableglobe.cpp index 00bfcbfbb4..4658e212b1 100644 --- a/modules/globebrowsing/src/renderableglobe.cpp +++ b/modules/globebrowsing/src/renderableglobe.cpp @@ -1436,7 +1436,6 @@ void RenderableGlobe::renderChunkLocally(const Chunk& chunk, const RenderData& d const glm::dmat4 viewTransform = data.camera.combinedViewMatrix(); const glm::dmat4 modelViewTransform = viewTransform * _cachedModelTransform; - std::array cornersCameraSpace; std::array cornersModelSpace; for (int i = 0; i < 4; ++i) { @@ -1992,7 +1991,12 @@ float RenderableGlobe::getHeight(const glm::dvec3& position) const { const glm::uvec3 dimensions = tileTexture->dimensions(); - const glm::vec2 samplePos = transformedUv * glm::vec2(dimensions); + glm::vec2 samplePos = transformedUv * glm::vec2(dimensions); + // @TODO (emmbr, 2023-06-14) This 0.5f offset was added as a bandaid for issue + // #2696. It seems to improve the behavior, but I am not certain of why. And the + // underlying problem is still there and should at some point be looked at again + samplePos -= glm::vec2(0.5f); + glm::uvec2 samplePos00 = samplePos; samplePos00 = glm::clamp( samplePos00, From 2a06a1e9f4fe2d705b36491f394695021e6276ad Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 26 Jun 2023 12:44:15 +0200 Subject: [PATCH 033/701] Create SUPPORT.md --- .github/SUPPORT.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/SUPPORT.md diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md new file mode 100644 index 0000000000..7489d59feb --- /dev/null +++ b/.github/SUPPORT.md @@ -0,0 +1 @@ +In order to get in touch with the developers and to get support about using and contribution to OpenSpace either send an email to support@openspaceproject.com or join our Slack [here](https://join.slack.com/t/openspacesupport/shared_invite/zt-37niq6y9-T0JaCIk4UoFLI4VF5U9Vsw). From 73609daac584c864d0c9df710ed49507214194e3 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 26 Jun 2023 12:47:41 +0200 Subject: [PATCH 034/701] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 31 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 +++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..cd840e9382 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,31 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: 'Type: Bug' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. Windows, Linux (which distribution), MacOS] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000000..a6caefe08d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: 'Type: Enhancement' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From 8084856e6e707d67a48f736f222fc5c658723f15 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 26 Jun 2023 12:48:38 +0200 Subject: [PATCH 035/701] Update issue templates --- .github/ISSUE_TEMPLATE/blank-issue.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/blank-issue.md diff --git a/.github/ISSUE_TEMPLATE/blank-issue.md b/.github/ISSUE_TEMPLATE/blank-issue.md new file mode 100644 index 0000000000..b08518e650 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/blank-issue.md @@ -0,0 +1,10 @@ +--- +name: Blank issue +about: A blank issue without prefilled fields +title: '' +labels: '' +assignees: '' + +--- + + From 9ec3e5b81e2cdba3600452df0bd6059a8dd98696 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 26 Jun 2023 12:50:39 +0200 Subject: [PATCH 036/701] Remove old-style issue template --- .github/ISSUE_TEMPLATE.md | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 6a26096403..0000000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ -<< Description of the problem >> - -<< What did you expect to happen >> -<< What did happen? >> - - -<< Attach screenshots, if possible >> \ No newline at end of file From f4f923914a98496ff37b6f67df8872f27dd215a5 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 26 Jun 2023 12:54:29 +0200 Subject: [PATCH 037/701] Add a config.yml for the issue templates --- .github/ISSUE_TEMPLATE/config.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..2704eb3d22 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,7 @@ +contact_links: + - name: Slack Community Support + url: https://github.com/orgs/community/discussions + about: Please ask and answer questions here. Slack is the easiest and most reliable way of getting in touch with the project members. + - name: Support Email + url: support@openspaceproject.com + about: To get in contact with the project members for people that don't want to use Slack From a05261838524dbf62ca7538142c7c70ce0d0abe7 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 26 Jun 2023 13:18:11 +0200 Subject: [PATCH 038/701] Email doesn't work --- .github/ISSUE_TEMPLATE/config.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 2704eb3d22..f06d14875e 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,6 +2,3 @@ contact_links: - name: Slack Community Support url: https://github.com/orgs/community/discussions about: Please ask and answer questions here. Slack is the easiest and most reliable way of getting in touch with the project members. - - name: Support Email - url: support@openspaceproject.com - about: To get in contact with the project members for people that don't want to use Slack From 67b7330229e453c3f7876942e0251e463479866a Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Mon, 26 Jun 2023 11:43:02 -0400 Subject: [PATCH 039/701] Allow transparency for movies. Closes #2792 --- modules/video/src/videoplayer.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/video/src/videoplayer.cpp b/modules/video/src/videoplayer.cpp index 35a80dfb94..b199aa898f 100644 --- a/modules/video/src/videoplayer.cpp +++ b/modules/video/src/videoplayer.cpp @@ -409,6 +409,9 @@ void VideoPlayer::initializeMpv() { // Starting MPV in a paused state seems to reduce problems with initialization setPropertyStringMpv("pause", ""); + // Allow alpha channels + setPropertyStringMpv("alpha", "yes"); + // Verbose mode for debug purposes // setPropertyStringMpv("msg-level", "all=v"); //mpv_request_log_messages(_mpvHandle, "debug"); From d317c287ebdffb81239f2de986548bf8e547b03b Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Wed, 28 Jun 2023 17:14:14 -0400 Subject: [PATCH 040/701] Update modules/base/shaders/screenspace_fs.glsl Co-authored-by: Alexander Bock --- modules/base/shaders/screenspace_fs.glsl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/base/shaders/screenspace_fs.glsl b/modules/base/shaders/screenspace_fs.glsl index 6478a93dab..1ff3f0fe9c 100644 --- a/modules/base/shaders/screenspace_fs.glsl +++ b/modules/base/shaders/screenspace_fs.glsl @@ -46,7 +46,8 @@ Fragment getFragment() { // Set border color if (vs_st.x < borderWidth.x || vs_st.x > 1 - borderWidth.x || - vs_st.y < borderWidth.y || vs_st.y > 1 - borderWidth.y) { + vs_st.y < borderWidth.y || vs_st.y > 1 - borderWidth.y) + { frag.color = vec4(borderColor, 1.0); } From a67d2937ae22d9b5155ecd01d17e9703b5c0b5b9 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Wed, 28 Jun 2023 17:14:24 -0400 Subject: [PATCH 041/701] Update src/rendering/screenspacerenderable.cpp Co-authored-by: Alexander Bock --- src/rendering/screenspacerenderable.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/screenspacerenderable.cpp b/src/rendering/screenspacerenderable.cpp index 9265964480..8f39aad7f0 100644 --- a/src/rendering/screenspacerenderable.cpp +++ b/src/rendering/screenspacerenderable.cpp @@ -204,7 +204,7 @@ namespace { std::optional radiusAzimuthElevation; // [[codegen::verbatim(BorderWidthInfo.description)]] - std::optional borderWidth; + std::optional borderWidth [[codegen::greater(0.0)]]; // [[codegen::verbatim(BorderColorInfo.description)]] std::optional borderColor [[codegen::color()]]; From 391c5ef3d1c37e7f1db6ef3789fc52f92825afd5 Mon Sep 17 00:00:00 2001 From: Malin E Date: Tue, 4 Jul 2023 10:42:19 +0200 Subject: [PATCH 042/701] Update and rename blank-issue.md to general-issue.md --- .github/ISSUE_TEMPLATE/blank-issue.md | 10 ---------- .github/ISSUE_TEMPLATE/general-issue.md | 10 ++++++++++ 2 files changed, 10 insertions(+), 10 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/blank-issue.md create mode 100644 .github/ISSUE_TEMPLATE/general-issue.md diff --git a/.github/ISSUE_TEMPLATE/blank-issue.md b/.github/ISSUE_TEMPLATE/blank-issue.md deleted file mode 100644 index b08518e650..0000000000 --- a/.github/ISSUE_TEMPLATE/blank-issue.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Blank issue -about: A blank issue without prefilled fields -title: '' -labels: '' -assignees: '' - ---- - - diff --git a/.github/ISSUE_TEMPLATE/general-issue.md b/.github/ISSUE_TEMPLATE/general-issue.md new file mode 100644 index 0000000000..91b21568de --- /dev/null +++ b/.github/ISSUE_TEMPLATE/general-issue.md @@ -0,0 +1,10 @@ +--- +name: General issue +about: An issue without prefilled fields +title: '' +labels: '' +assignees: '' + +--- + + From 380f768e4c3b811b6623e4f1fc93bfbca5994576 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 6 Jul 2023 10:03:44 +0200 Subject: [PATCH 043/701] Allow negative values for KeplerTranslation values (#2784) --- .../space/translation/keplertranslation.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/modules/space/translation/keplertranslation.cpp b/modules/space/translation/keplertranslation.cpp index b6c722bdad..2cf331f892 100644 --- a/modules/space/translation/keplertranslation.cpp +++ b/modules/space/translation/keplertranslation.cpp @@ -121,16 +121,16 @@ namespace { double semiMajorAxis; // [[codegen::verbatim(InclinationInfo.description)]] - double inclination [[codegen::inrange(0.0, 360.0)]]; + double inclination [[codegen::inrange(-360.0, 360.0)]]; // [[codegen::verbatim(AscendingNodeInfo.description)]] - double ascendingNode [[codegen::inrange(0.0, 360.0)]]; + double ascendingNode [[codegen::inrange(-360.0, 360.0)]]; // [[codegen::verbatim(ArgumentOfPeriapsisInfo.description)]] - double argumentOfPeriapsis [[codegen::inrange(0.0, 360.0)]]; + double argumentOfPeriapsis [[codegen::inrange(-360.0, 360.0)]]; // [[codegen::verbatim(MeanAnomalyAtEpochInfo.description)]] - double meanAnomaly [[codegen::inrange(0.0, 360.0)]]; + double meanAnomaly [[codegen::inrange(-360.0, 360.0)]]; // [[codegen::verbatim(EpochInfo.description)]] std::string epoch; @@ -198,10 +198,12 @@ KeplerTranslation::KeplerTranslation(const ghoul::Dictionary& dictionary) setKeplerElements( p.eccentricity, p.semiMajorAxis, - p.inclination, - p.ascendingNode, - p.argumentOfPeriapsis, - p.meanAnomaly, + p.inclination < 0.0 ? p.inclination + 360.0 : p.inclination, + p.ascendingNode < 0.0 ? p.ascendingNode + 360.0 : p.ascendingNode, + p.argumentOfPeriapsis < 0.0 ? + p.argumentOfPeriapsis + 360.0 : + p.argumentOfPeriapsis, + p.meanAnomaly < 0.0 ? p.meanAnomaly + 360.0 : p.meanAnomaly, p.period, p.epoch ); @@ -329,7 +331,6 @@ void KeplerTranslation::setKeplerElements(double eccentricity, double semiMajorA auto isInRange = [](double val, double min, double max) -> bool { return val >= min && val <= max; }; - if (isInRange(eccentricity, 0.0, 1.0)) { _eccentricity = eccentricity; } From 9fa0def25e607196bead94460af8ba29662faa3c Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 6 Jul 2023 14:59:40 +0200 Subject: [PATCH 044/701] Update offline mars map to fix 180 degree offset --- apps/OpenSpace/ext/sgct | 2 +- .../planets/mars/layers/colorlayers/mars_texture.asset | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index 2a4e0fa3fc..e7859b22cf 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit 2a4e0fa3fcd89b655015f67ba28b406086279a7e +Subproject commit e7859b22cf11f7b7be16ebab5e6c44ec8637c540 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mars_texture.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mars_texture.asset index 605155e4d0..090565e026 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mars_texture.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mars_texture.asset @@ -6,7 +6,7 @@ local texturesPath = asset.syncedResource({ Name = "Mars Textures", Type = "HttpSynchronization", Identifier = "mars_textures", - Version = 1 + Version = 3 }) @@ -14,7 +14,7 @@ local Layer = { Identifier = "Mars_Texture", Name = "Mars Texture", Enabled = asset.enabled, - FilePath = texturesPath .. "mars.jpg", + FilePath = texturesPath .. "mars.png", Description = "Default jpg texture for Mars", CacheSettings = { Enabled = false } } From 61a69490fbcbe991ac4190bf95195a0c29b90041 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 12 Jul 2023 10:49:50 +0200 Subject: [PATCH 045/701] Add the ability to specify the angular size of the Sun in the atmosphere --- .../rendering/atmospheredeferredcaster.cpp | 9 ++++++--- .../rendering/atmospheredeferredcaster.h | 5 +++-- .../rendering/renderableatmosphere.cpp | 18 +++++++++++++++++- .../rendering/renderableatmosphere.h | 1 + .../shaders/atmosphere_deferred_fs.glsl | 7 ++++--- 5 files changed, 31 insertions(+), 9 deletions(-) diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp index 5dfd05bcfb..3c9c872413 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp @@ -70,14 +70,14 @@ namespace { constexpr std::string_view _loggerCat = "AtmosphereDeferredcaster"; - constexpr std::array UniformNames = { + constexpr std::array UniformNames = { "cullAtmosphere", "opacity", "Rg", "Rt", "groundRadianceEmission", "HR", "betaRayleigh", "HM", "betaMieExtinction", "mieG", "sunRadiance", "ozoneLayerEnabled", "HO", "betaOzoneExtinction", "SAMPLES_R", "SAMPLES_MU", "SAMPLES_MU_S", "SAMPLES_NU", "inverseModelTransformMatrix", "modelTransformMatrix", "projectionToModelTransformMatrix", "viewToWorldMatrix", "camPosObj", "sunDirectionObj", "hardShadows", "transmittanceTexture", - "irradianceTexture", "inscatterTexture" + "irradianceTexture", "inscatterTexture", "sunAngularSize" }; constexpr float ATM_EPS = 2000.f; @@ -352,6 +352,8 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& data, const Deferred prg.setUniform(_uniformCache.SAMPLES_MU, _muSamples); prg.setUniform(_uniformCache.SAMPLES_MU_S, _muSSamples); prg.setUniform(_uniformCache.SAMPLES_NU, _nuSamples); + // We expose the value as degrees, but the shader wants radians + prg.setUniform(_uniformCache.sunAngularSize, glm::radians(_sunAngularSize)); // Object Space glm::dmat4 invModelMatrix = glm::inverse(_modelTransform); @@ -558,7 +560,7 @@ void AtmosphereDeferredcaster::setParameters(float atmosphereRadius, float plane glm::vec3 ozoneExtinctionCoefficients, glm::vec3 mieScatteringCoefficients, glm::vec3 mieExtinctionCoefficients, - bool sunFollowing) + bool sunFollowing, float sunAngularSize) { _atmosphereRadius = atmosphereRadius; _atmospherePlanetRadius = planetRadius; @@ -575,6 +577,7 @@ void AtmosphereDeferredcaster::setParameters(float atmosphereRadius, float plane _mieScatteringCoeff = std::move(mieScatteringCoefficients); _mieExtinctionCoeff = std::move(mieExtinctionCoefficients); _sunFollowingCameraEnabled = sunFollowing; + _sunAngularSize = sunAngularSize; } void AtmosphereDeferredcaster::setHardShadows(bool enabled) { diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.h b/modules/atmosphere/rendering/atmospheredeferredcaster.h index eae2fa33ca..d5e5960e2a 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.h +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.h @@ -88,7 +88,7 @@ public: float mieHeightScale, float miePhaseConstant, float sunRadiance, glm::vec3 rayScatteringCoefficients, glm::vec3 ozoneExtinctionCoefficients, glm::vec3 mieScatteringCoefficients, glm::vec3 mieExtinctionCoefficients, - bool sunFollowing); + bool sunFollowing, float sunAngularSize); void setHardShadows(bool enabled); @@ -119,7 +119,7 @@ private: betaOzoneExtinction, SAMPLES_R, SAMPLES_MU, SAMPLES_MU_S, SAMPLES_NU, inverseModelTransformMatrix, modelTransformMatrix, projectionToModelTransform, viewToWorldMatrix, camPosObj, sunDirectionObj, hardShadows, transmittanceTexture, - irradianceTexture, inscatterTexture) _uniformCache; + irradianceTexture, inscatterTexture, sunAngularSize) _uniformCache; ghoul::opengl::TextureUnit _transmittanceTableTextureUnit; ghoul::opengl::TextureUnit _irradianceTableTextureUnit; @@ -141,6 +141,7 @@ private: float _mieHeightScale = 0.f; float _miePhaseConstant = 0.f; float _sunRadianceIntensity = 5.f; + float _sunAngularSize = 0.3f; glm::vec3 _rayleighScatteringCoeff = glm::vec3(0.f); glm::vec3 _ozoneExtinctionCoeff = glm::vec3(0.f); diff --git a/modules/atmosphere/rendering/renderableatmosphere.cpp b/modules/atmosphere/rendering/renderableatmosphere.cpp index 00e5a322d5..a49601e4f8 100644 --- a/modules/atmosphere/rendering/renderableatmosphere.cpp +++ b/modules/atmosphere/rendering/renderableatmosphere.cpp @@ -175,6 +175,13 @@ namespace { openspace::properties::Property::Visibility::AdvancedUser }; + constexpr openspace::properties::Property::PropertyInfo SunAngularSize = { + "SunAngularSize", + "Angular Size of the Sun", + "Specifies the angular size of the Sun in degrees", + openspace::properties::Property::Visibility::AdvancedUser + }; + struct [[codegen::Dictionary(RenderableAtmosphere)]] Parameters { struct ShadowGroup { // Individual light sources @@ -260,6 +267,9 @@ namespace { // [[codegen::verbatim(SunsetAngleInfo.description)]] std::optional sunsetAngle; + + // [[codegen::verbatim(SunAngularSize.description)]] + std::optional sunAngularSize [[codegen::inrange(0.0, 180.0)]]; }; #include "renderableatmosphere_codegen.cpp" @@ -305,6 +315,7 @@ RenderableAtmosphere::RenderableAtmosphere(const ghoul::Dictionary& dictionary) SunsetAngleInfo, glm::vec2(95.f, 100.f), glm::vec2(0.f), glm::vec2(180.f) ) + , _sunAngularSize(SunAngularSize, 0.3f, 0.f, 180.f) { auto updateWithCalculation = [this]() { _deferredCasterNeedsUpdate = true; @@ -420,6 +431,10 @@ RenderableAtmosphere::RenderableAtmosphere(const ghoul::Dictionary& dictionary) properties::Property::ViewOptions::MinMaxRange ); addProperty(_atmosphereDimmingSunsetAngle); + + _sunAngularSize = p.sunAngularSize.value_or(_sunAngularSize); + _sunAngularSize.onChange(updateWithoutCalculation); + addProperty(_sunAngularSize); } void RenderableAtmosphere::deinitializeGL() { @@ -494,7 +509,8 @@ void RenderableAtmosphere::updateAtmosphereParameters() { _ozoneCoeff, _mieScatteringCoeff, _mieExtinctionCoeff, - _sunFollowingCameraEnabled + _sunFollowingCameraEnabled, + _sunAngularSize ); _deferredcaster->setHardShadows(_hardShadowsEnabled); } diff --git a/modules/atmosphere/rendering/renderableatmosphere.h b/modules/atmosphere/rendering/renderableatmosphere.h index 5d8cc531e2..a82b33c394 100644 --- a/modules/atmosphere/rendering/renderableatmosphere.h +++ b/modules/atmosphere/rendering/renderableatmosphere.h @@ -96,6 +96,7 @@ private: properties::FloatProperty _sunIntensity; properties::BoolProperty _sunFollowingCameraEnabled; properties::BoolProperty _hardShadowsEnabled; + properties::FloatProperty _sunAngularSize; // Atmosphere dimming properties::FloatProperty _atmosphereDimmingHeight; diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index c0bfdcdc30..11c03304cc 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -77,6 +77,7 @@ uniform vec3 betaMieExtinction; uniform float mieG; uniform float sunRadiance; uniform bool ozoneLayerEnabled; +uniform float sunAngularSize; uniform int SAMPLES_R; uniform int SAMPLES_MU; uniform int SAMPLES_MU_S; @@ -503,11 +504,11 @@ vec3 sunColor(vec3 v, vec3 s, float r, float mu, float irradianceFactor) { // @TODO (abock, 2021-07-01) This value is hard-coded to our sun+earth right now // Convert 0.3 degrees -> radians - const float SunAngularSize = (0.3 * M_PI / 180.0); + // const float SunAngularSize = (0.3 * M_PI / 180.0); const float FuzzyFactor = 0.5; // How fuzzy should the edges be - const float p1 = cos(SunAngularSize); - const float p2 = cos(SunAngularSize * FuzzyFactor); + const float p1 = cos(sunAngularSize); + const float p2 = cos(sunAngularSize * FuzzyFactor); float t = (angle - p1) / (p2 - p1); float scale = clamp(t, 0.0, 1.0); From bef10aca102d0bedef8f168b3f1bb80c180614bb Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 12 Jul 2023 11:16:37 +0200 Subject: [PATCH 046/701] Fix layering of the Sun/Moon during an eclipse --- .../shaders/atmosphere_deferred_fs.glsl | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index 11c03304cc..c0de958617 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -120,11 +120,13 @@ uniform ShadowRenderingStruct shadowDataArray[numberOfShadows]; uniform int shadows; uniform bool hardShadows; -float calcShadow(ShadowRenderingStruct shadowInfoArray[numberOfShadows], dvec3 position, +// Returns whether there is an eclipse in the x component and the strength of the +// shadowing in the y component +vec2 calcShadow(ShadowRenderingStruct shadowInfoArray[numberOfShadows], dvec3 position, bool ground) { if (!shadowInfoArray[0].isShadowing) { - return 1.0; + return vec2(0.0, 1.0); } dvec3 pc = shadowInfoArray[0].casterPositionVec - position; @@ -141,19 +143,19 @@ float calcShadow(ShadowRenderingStruct shadowInfoArray[numberOfShadows], dvec3 p if (length_d < r_u_pi) { // umbra if (hardShadows) { - return ground ? 0.2 : 0.5; + return ground ? vec2(1.0, 0.2) : vec2(1.0, 0.5); } else { // butterworth function - return sqrt(r_u_pi / (r_u_pi + pow(length_d, 4.0))); + return vec2(1.0, sqrt(r_u_pi / (r_u_pi + pow(length_d, 4.0)))); } } else if (length_d < r_p_pi) { // penumbra - return hardShadows ? 0.5 : length_d / r_p_pi; + return hardShadows ? vec2(1.0, 0.5) : vec2(1.0, length_d / r_p_pi); } else { - return 1.0; + return vec2(1.0, 1.0); } } @@ -619,8 +621,8 @@ void main() { pixelDepth -= offset; dvec3 onATMPos = (modelTransformMatrix * dvec4(x * 1000.0, 1.0)).xyz; - float eclipseShadowATM = calcShadow(shadowDataArray, onATMPos, false); - float sunIntensityInscatter = sunRadiance * eclipseShadowATM; + vec2 eclipseShadowATM = calcShadow(shadowDataArray, onATMPos, false); + float sunIntensityInscatter = sunRadiance * eclipseShadowATM.y; float irradianceFactor = 0.0; @@ -632,15 +634,15 @@ void main() { attenuation, groundHit); vec3 atmColor = vec3(0.0); if (groundHit) { - float eclipseShadowPlanet = calcShadow(shadowDataArray, positionWorldCoords.xyz, true); - float sunIntensityGround = sunRadiance * eclipseShadowPlanet; + vec2 eclipseShadowPlanet = calcShadow(shadowDataArray, positionWorldCoords.xyz, true); + float sunIntensityGround = sunRadiance * eclipseShadowPlanet.y; atmColor = groundColor(x, tF, v, s, attenuation, color, normal.xyz, irradianceFactor, normal.w, sunIntensityGround); } else { // In order to get better performance, we are not tracing multiple rays per pixel // when the ray doesn't intersect the ground - atmColor = sunColor(v, s, r, mu, irradianceFactor); + atmColor = sunColor(v, s, r, mu, irradianceFactor) * (1.0 - eclipseShadowATM.x); } // Final Color of ATM plus terrain. We want to support opacity so we blend between the From 80ddf3e1878741ea367fd3cdbc1cf6bd1af210c8 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 12 Jul 2023 12:42:25 +0200 Subject: [PATCH 047/701] Prevent occasional crash in RenderableShadowCylinder when adding an asset at runtime --- .../rendering/renderableshadowcylinder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp b/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp index be1f8efef7..0e1c4ca3cc 100644 --- a/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp +++ b/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp @@ -250,7 +250,7 @@ void RenderableShadowCylinder::deinitializeGL() { } bool RenderableShadowCylinder::isReady() const { - return true; + return _shader; } void RenderableShadowCylinder::render(const RenderData& data, RendererTasks&) { From ce1b024f7bcd2e66c1e7306498a313f72aa3903c Mon Sep 17 00:00:00 2001 From: GPayne Date: Wed, 12 Jul 2023 23:40:02 -0600 Subject: [PATCH 048/701] First pass of adding descriptions to window config files with schema --- apps/OpenSpace/ext/sgct | 2 +- config/equirectangular_gui.json | 9 ++++++++- config/fullscreen1080.json | 9 ++++++++- config/gui_projector.json | 9 ++++++++- config/single.json | 9 ++++++++- config/single_fisheye.json | 9 ++++++++- config/single_fisheye_gui.json | 10 +++++++++- config/single_gui.json | 9 ++++++++- config/single_gui_spout.json | 9 ++++++++- config/single_gui_with_graphics.json | 9 ++++++++- config/single_sbs_stereo.json | 9 ++++++++- config/single_two_win.json | 10 +++++++++- config/spherical_mirror.json | 9 ++++++++- config/spherical_mirror_gui.json | 9 ++++++++- config/spout_output_cubemap.json | 9 ++++++++- config/spout_output_equirectangular.json | 9 ++++++++- config/spout_output_fisheye.json | 9 ++++++++- config/spout_output_flat.json | 9 ++++++++- config/two_nodes.json | 9 ++++++++- 19 files changed, 147 insertions(+), 19 deletions(-) diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index e7859b22cf..19e7e21435 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit e7859b22cf11f7b7be16ebab5e6c44ec8637c540 +Subproject commit 19e7e21435fe4df71eb89d53599b46b68758273d diff --git a/config/equirectangular_gui.json b/config/equirectangular_gui.json index fe744ef269..7d3d2dc303 100644 --- a/config/equirectangular_gui.json +++ b/config/equirectangular_gui.json @@ -54,5 +54,12 @@ "eyeseparation": 0.065, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "Two windows: Primary 1280x720 window with equirectangular projection rendering without menu or text overlays, and a secondary with menu and text overlays minus rendering.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } } diff --git a/config/fullscreen1080.json b/config/fullscreen1080.json index 59ef891571..6b8afbcd3e 100644 --- a/config/fullscreen1080.json +++ b/config/fullscreen1080.json @@ -43,5 +43,12 @@ "eyeseparation": 0.065, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "A single 1920x1080 fullscreen window with planar projection rendering. The display will automatically be set to 1920x1080, regardless of native resolution.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } } diff --git a/config/gui_projector.json b/config/gui_projector.json index 155af25705..c4affe89fd 100644 --- a/config/gui_projector.json +++ b/config/gui_projector.json @@ -59,5 +59,12 @@ "eyeseparation": 0.065, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "Two windows for a side-by-side dual-monitor configuration, where the right-side monitor can be considered a projector. Primary 1920x1080 window with menu and text overlays minus rendering, and a secondary 1920x1080 fullscreen window with planar projection rendering without menu or text overlays.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } } diff --git a/config/single.json b/config/single.json index 925ab5df8f..38004b58c5 100644 --- a/config/single.json +++ b/config/single.json @@ -43,5 +43,12 @@ "eyeseparation": 0.065, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "A single 1280x720 window with planar projection rendering at 2560x1440 resolution.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } } diff --git a/config/single_fisheye.json b/config/single_fisheye.json index adfacbe680..1309a8e623 100644 --- a/config/single_fisheye.json +++ b/config/single_fisheye.json @@ -33,5 +33,12 @@ "eyeseparation": 0.06, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "A single 1024x1024 window with fisheye projection rendering.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } } diff --git a/config/single_fisheye_gui.json b/config/single_fisheye_gui.json index 1d1ca3a909..ef67552cbd 100644 --- a/config/single_fisheye_gui.json +++ b/config/single_fisheye_gui.json @@ -57,5 +57,13 @@ "eyeseparation": 0.06, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "Two windows: Primary 1024x1024 window with menu and text overlays minus rendering, and a secondary 1024x1024 window with fisheye projection rendering without menu and text overlays.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } + } diff --git a/config/single_gui.json b/config/single_gui.json index 0483f62baa..6d67ed64f9 100644 --- a/config/single_gui.json +++ b/config/single_gui.json @@ -66,5 +66,12 @@ "eyeseparation": 0.065, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "Two windows: Primary 1280x720 window with planar projection rendering without menu or text overlays, and a secondary with menu and text overlays minus rendering.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } } diff --git a/config/single_gui_spout.json b/config/single_gui_spout.json index 7f95acd344..5f54282976 100644 --- a/config/single_gui_spout.json +++ b/config/single_gui_spout.json @@ -63,5 +63,12 @@ "eyeseparation": 0.06499999761581421, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "Two windows: Primary 1280x720 window with Spout output (name 'OpenSpace') planar projection rendering without menu or text overlays, and a secondary with menu and text overlays minus rendering.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } } diff --git a/config/single_gui_with_graphics.json b/config/single_gui_with_graphics.json index c866040411..31d1b630ab 100644 --- a/config/single_gui_with_graphics.json +++ b/config/single_gui_with_graphics.json @@ -67,5 +67,12 @@ "eyeseparation": 0.065, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "Two windows: Primary 1280x720 window with planar projection rendering without menu or text overlays, and a secondary with menu and text overlays plus rendering from the primary.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } } diff --git a/config/single_sbs_stereo.json b/config/single_sbs_stereo.json index 2c0019f083..e1fa34337b 100644 --- a/config/single_sbs_stereo.json +++ b/config/single_sbs_stereo.json @@ -42,5 +42,12 @@ "eyeseparation": 0.065, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "A single 1280x720 window containing side-by-side stereo planar projection rendering views.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } } diff --git a/config/single_two_win.json b/config/single_two_win.json index 9e88325d39..6d35594ef0 100644 --- a/config/single_two_win.json +++ b/config/single_two_win.json @@ -55,5 +55,13 @@ "eyeseparation": 0.065, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "Two 1280x720 windows each with identical planar projection rendering. Only the primary window has menu controls, but both have text overlays.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } + } diff --git a/config/spherical_mirror.json b/config/spherical_mirror.json index f8f1e5669c..a422b34d35 100644 --- a/config/spherical_mirror.json +++ b/config/spherical_mirror.json @@ -36,5 +36,12 @@ "eyeseparation": 0.06, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "A single 1280x720 window with spherical projection rendering at 2048x2048 resolution.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } } diff --git a/config/spherical_mirror_gui.json b/config/spherical_mirror_gui.json index 5fbd9baf4e..e96ba89936 100644 --- a/config/spherical_mirror_gui.json +++ b/config/spherical_mirror_gui.json @@ -61,5 +61,12 @@ "eyeseparation": 0.06, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "Two windows: Primary 1280x720 window with menu and text overlays minus rendering, and a secondary 1280x720 window at 2048x2048 resolution with spherical mirror projection rendering without the menu or text overlays.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } } diff --git a/config/spout_output_cubemap.json b/config/spout_output_cubemap.json index 064f48ecfc..a8c2621064 100644 --- a/config/spout_output_cubemap.json +++ b/config/spout_output_cubemap.json @@ -56,5 +56,12 @@ "eyeseparation": 0.05999999865889549, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "A single 1024x1024 window with spout output cubemap projection rendering.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } } diff --git a/config/spout_output_equirectangular.json b/config/spout_output_equirectangular.json index 87a3bd98c2..39de1154a2 100644 --- a/config/spout_output_equirectangular.json +++ b/config/spout_output_equirectangular.json @@ -56,5 +56,12 @@ "eyeseparation": 0.06, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "A single 1024x1024 window with spout output equirectangular projection rendering.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } } diff --git a/config/spout_output_fisheye.json b/config/spout_output_fisheye.json index cd1b2a490e..f95628bd50 100644 --- a/config/spout_output_fisheye.json +++ b/config/spout_output_fisheye.json @@ -56,5 +56,12 @@ "eyeseparation": 0.06, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "A single 1024x1024 window with spout output fisheye projection rendering.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } } diff --git a/config/spout_output_flat.json b/config/spout_output_flat.json index 585a0830e7..c7c8ff2d06 100644 --- a/config/spout_output_flat.json +++ b/config/spout_output_flat.json @@ -55,5 +55,12 @@ "eyeseparation": 0.05999999865889549, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "A single 1024x1024 window with spout output planar/flat projection rendering at 1920x1080 resolution.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } } diff --git a/config/two_nodes.json b/config/two_nodes.json index 621bfbbeb0..9bb4f8cf13 100644 --- a/config/two_nodes.json +++ b/config/two_nodes.json @@ -60,5 +60,12 @@ "eyeseparation": 0.065, "pos": { "x": 0.0, "y": 0.0, "z": 0.0 } } - ] + ], + "meta": { + "author": "OpenSpace Team", + "description": "Two individual nodes, each with a 1280x720 window with planar projection rendering.", + "license": "MIT License", + "name": "Single", + "version": "1.0" + } } From a6522f403849167a6a866e0739a0252be31a72de Mon Sep 17 00:00:00 2001 From: GPayne Date: Fri, 14 Jul 2023 11:08:13 -0600 Subject: [PATCH 049/701] Increased wait time for some visual tests --- tests/visual/apollo/11landing.ostest | 2 +- tests/visual/apollo/11landingsite.ostest | 2 +- tests/visual/apollo/17landingsite.ostest | 2 +- tests/visual/default/MarsHiRISE.ostest | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/visual/apollo/11landing.ostest b/tests/visual/apollo/11landing.ostest index bba09dab7b..e0c4f662bb 100644 --- a/tests/visual/apollo/11landing.ostest +++ b/tests/visual/apollo/11landing.ostest @@ -10,7 +10,7 @@ { "type": "navigationstate", "value": "{Anchor='Apollo11LemPosition',Pitch=0.979095E-1,Position={-2.457687E0,2.504798E1,3.804939E0},ReferenceFrame='Root',Up={-0.682505E0,0.438584E-1,-0.729564E0},Yaw=0.435056E-1}"}, { "type": "wait", - "value": "30"}, + "value": "45"}, { "type": "screenshot", "value": ""} ] diff --git a/tests/visual/apollo/11landingsite.ostest b/tests/visual/apollo/11landingsite.ostest index c051c7ee26..1198a2b22e 100644 --- a/tests/visual/apollo/11landingsite.ostest +++ b/tests/visual/apollo/11landingsite.ostest @@ -12,7 +12,7 @@ { "type": "navigationstate", "value": "{Anchor='Apollo11LemPosition',Pitch=-0.275880E-1,Position={6.249130E0,2.576497E1,-1.435499E1},ReferenceFrame='Root',Up={-0.860897E0,-0.718231E-1,-0.503684E0},Yaw=-0.141143E-3}"}, { "type": "wait", - "value": "20"}, + "value": "45"}, { "type": "screenshot", "value": "11landingsite"} ] diff --git a/tests/visual/apollo/17landingsite.ostest b/tests/visual/apollo/17landingsite.ostest index 6c364a2931..3702f3ea34 100644 --- a/tests/visual/apollo/17landingsite.ostest +++ b/tests/visual/apollo/17landingsite.ostest @@ -10,7 +10,7 @@ { "type": "navigationstate", "value": "{Anchor='Moon',Pitch=0.953555E0,Position={1.399797E6,8.334161E5,5.988283E5},Up={-0.381687E0,-0.228442E-1,0.924009E0},Yaw=-0.789410E-1}"}, { "type": "wait", - "value": "20"}, + "value": "45"}, { "type": "screenshot", "value": "17landingsite"} ] diff --git a/tests/visual/default/MarsHiRISE.ostest b/tests/visual/default/MarsHiRISE.ostest index ece6dae6b3..8ff130ca7e 100644 --- a/tests/visual/default/MarsHiRISE.ostest +++ b/tests/visual/default/MarsHiRISE.ostest @@ -14,7 +14,7 @@ { "type": "script", "value": "openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.ColorLayers.CTX_blended_01.Enabled', true)"}, { "type": "wait", - "value": "60"}, + "value": "100"}, { "type": "navigationstate", "value": "{Anchor='Mars',Pitch=1.347758E0,Position={7.635264E5,-3.287992E6,-3.854482E5},Up={-0.470953E-1,-0.127084E0,0.990773E0},Yaw=0.463204E-1}"}, { "type": "wait", From b5572b0e075d76c2c7e3b9f46e2256d6dfdbba8c Mon Sep 17 00:00:00 2001 From: GPayne Date: Mon, 17 Jul 2023 12:27:25 -0600 Subject: [PATCH 050/701] Remove ISS trail in defaultEarth test --- tests/visual/default/DefaultEarth.ostest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/visual/default/DefaultEarth.ostest b/tests/visual/default/DefaultEarth.ostest index 5372543010..898da9a324 100644 --- a/tests/visual/default/DefaultEarth.ostest +++ b/tests/visual/default/DefaultEarth.ostest @@ -1,6 +1,8 @@ [ { "type": "time", - "value": "2019-01-01T05:00:00.00"}, + "value": "2019-01-01T05:00:00.00"}, + { "type": "script", + "value": "openspace.setPropertyValueSingle('Scene.ISS_trail.Renderable.Enabled', false)"}, { "type": "wait", "value": "20"}, { "type": "screenshot", From 14082cd8d914e663e15fe2d38234759a4729ce57 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Tue, 18 Jul 2023 11:58:17 +0200 Subject: [PATCH 051/701] Add the ability to render an eclipse cone for the Earth and Moon system (#2816) --- .../planets/earth/eclipse_shadow.asset | 43 ++ modules/space/CMakeLists.txt | 2 + .../space/rendering/renderableeclipsecone.cpp | 509 ++++++++++++++++++ .../space/rendering/renderableeclipsecone.h | 87 +++ modules/space/shaders/eclipsecone_fs.glsl | 38 ++ modules/space/shaders/eclipsecone_vs.glsl | 41 ++ modules/space/spacemodule.cpp | 3 + 7 files changed, 723 insertions(+) create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipse_shadow.asset create mode 100644 modules/space/rendering/renderableeclipsecone.cpp create mode 100644 modules/space/rendering/renderableeclipsecone.h create mode 100644 modules/space/shaders/eclipsecone_fs.glsl create mode 100644 modules/space/shaders/eclipsecone_vs.glsl diff --git a/data/assets/scene/solarsystem/planets/earth/eclipse_shadow.asset b/data/assets/scene/solarsystem/planets/earth/eclipse_shadow.asset new file mode 100644 index 0000000000..a3ea5e0a1d --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipse_shadow.asset @@ -0,0 +1,43 @@ +local transforms = asset.require("scene/solarsystem/planets/earth/moon/moon") + +local EarthMoonShadow = { + Identifier = "EarthMoonShadow", + Parent = transforms.Moon.Identifier, + Renderable = { + Type = "RenderableEclipseCone", + Opacity = 1.0, + ShadowLength = 1.0, + UmbralShadowColor = { 0.85, 1.0, 1.0, 0.20 }, + PenumbralShadowColor = { 0.35, 0.35, 0.35, 0.29 }, + LightSource = "SUN", + LightSourceFrame = "IAU_SUN", + Shadower = "MOON", + ShadowerFrame = "IAU_MOON", + Shadowee = "EARTH" + }, + GUI = { + Name = "Earth/Moon Shadow", + Path = "/Solar System/Planets/Earth" + } +} + +asset.onInitialize(function() + openspace.addSceneGraphNode(EarthMoonShadow) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(EarthMoonShadow) +end) + +asset.export(EarthMoonShadow) + + + +asset.meta = { + Name = "Eclipse Shadow", + Version = "1.0", + Description = "The penumbral and umbral shadow eclipses for the Earth-Moon system", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/modules/space/CMakeLists.txt b/modules/space/CMakeLists.txt index 1c5295ce21..d4b308bfeb 100644 --- a/modules/space/CMakeLists.txt +++ b/modules/space/CMakeLists.txt @@ -32,6 +32,7 @@ set(HEADER_FILES rendering/renderableconstellationsbase.h rendering/renderableconstellationbounds.h rendering/renderableconstellationlines.h + rendering/renderableeclipsecone.h rendering/renderablefluxnodes.h rendering/renderablehabitablezone.h rendering/renderablerings.h @@ -55,6 +56,7 @@ set(SOURCE_FILES rendering/renderableconstellationsbase.cpp rendering/renderableconstellationbounds.cpp rendering/renderableconstellationlines.cpp + rendering/renderableeclipsecone.cpp rendering/renderablefluxnodes.cpp rendering/renderablehabitablezone.cpp rendering/renderablerings.cpp diff --git a/modules/space/rendering/renderableeclipsecone.cpp b/modules/space/rendering/renderableeclipsecone.cpp new file mode 100644 index 0000000000..93887214a3 --- /dev/null +++ b/modules/space/rendering/renderableeclipsecone.cpp @@ -0,0 +1,509 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2023 * + * * + * 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::array UniformNames = { + "modelViewProjectionTransform", "shadowColor", "opacity" + }; + + struct VBOLayout { + float x = 0.f; + float y = 0.f; + float z = 0.f; + }; + + constexpr openspace::properties::Property::PropertyInfo NumberPointsInfo = { + "AmountOfPoints", + "Points", + "This value determines the number of control points that is used to construct " + "the shadow geometry. The higher this number, the more detailed the shadow is, " + "but it will have a negative impact on the performance", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo ShadowLengthInfo = { + "ShadowLength", + "Shadow Length", + "This value determines the length of the shadow that is cast by the target " + "object. The total distance of the shadow is equal to the distance from the " + "target to the Sun multiplied with this value", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo ShowUmbralShadowInfo = { + "ShowUmbralShadow", + "Show Umbral Shadow", + "If this is enabled, the umbral portioon of the shadow is shown", + openspace::properties::Property::Visibility::User + }; + + constexpr openspace::properties::Property::PropertyInfo UmbralShadowColorInfo = { + "UmbralShadowColor", + "Umbral Shadow Color", + "This value determines the color that is used for the shadow cylinder of the " + "umbral shadow", + // @VISIBILITY(2.5) + openspace::properties::Property::Visibility::User + }; + + constexpr openspace::properties::Property::PropertyInfo ShowPenumbralShadowInfo = { + "ShowPenumbralShadow", + "Show Penumbral Shadow", + "If this is enabled, the penumbral portioon of the shadow is shown", + openspace::properties::Property::Visibility::User + }; + + constexpr openspace::properties::Property::PropertyInfo PenumbralShadowColorInfo = { + "PenumbralShadowColor", + "Penumbral Shadow Color", + "This value determines the color that is used for the shadow cylinder of the " + "penumbral shadow", + // @VISIBILITY(2.5) + openspace::properties::Property::Visibility::User + }; + + constexpr openspace::properties::Property::PropertyInfo LightSourceInfo = { + "LightSource", + "Light Source", + "This value determines the SPICE name of the object that is used as the " + "illuminator for computing the shadow cylinder", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo LightSourceFrameInfo = { + "LightSourceFrame", + "Light Source Frame", + "This value is the SPICE name of the body-fixed reference frame for the light " + "source", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo ShadowerInfo = { + "Shadower", + "Shadower", + "This value specifies the SPICE name of the object that is casting the shadow on " + "the shadowee", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo ShadowerFrameInfo = { + "ShadowerFrame", + "Shadower Frame", + "This value is the SPICE name of the body-fixed reference frame for the shadower", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo ShadoweeInfo = { + "Shadowee", + "Shadowee", + "This value is the SPICE name of object that is receiving the shadow from the " + "shadower", + openspace::properties::Property::Visibility::AdvancedUser + }; + + struct [[codegen::Dictionary(RenderableEclipseCone)]] Parameters { + // [[codegen::verbatim(NumberPointsInfo.description)]] + std::optional numberOfPoints [[codegen::key("AmountOfPoints")]]; + + // [[codegen::verbatim(ShadowLengthInfo.description)]] + std::optional shadowLength; + + // [[codegen::verbatim(ShowUmbralShadowInfo.description)]] + std::optional showUmbralShadow; + + // [[codegen::verbatim(UmbralShadowColorInfo.description)]] + std::optional umbralShadowColor [[codegen::color()]]; + + // [[codegen::verbatim(ShowPenumbralShadowInfo.description)]] + std::optional showPenumbralShadow; + + // [[codegen::verbatim(PenumbralShadowColorInfo.description)]] + std::optional penumbralShadowColor [[codegen::color()]]; + + // [[codegen::verbatim(LightSourceInfo.description)]] + std::string lightSource; + + // [[codegen::verbatim(LightSourceFrameInfo.description)]] + std::string lightSourceFrame; + + // [[codegen::verbatim(ShadowerInfo.description)]] + std::string shadower; + + // [[codegen::verbatim(ShadowerFrameInfo.description)]] + std::string shadowerFrame; + + // [[codegen::verbatim(ShadoweeInfo.description)]] + std::string shadowee; + }; +#include "renderableeclipsecone_codegen.cpp" +} // namespace + +namespace openspace { + +documentation::Documentation RenderableEclipseCone::Documentation() { + return codegen::doc("space_renderableeclipsecone"); +} + +RenderableEclipseCone::RenderableEclipseCone(const ghoul::Dictionary& dictionary) + : Renderable(dictionary) + , _numberOfPoints(NumberPointsInfo, 190, 1, 300) + , _shadowLength(ShadowLengthInfo, 0.1f, 0.f, 2.f) + , _showUmbralShadow(ShowUmbralShadowInfo, true) + , _umbralShadowColor( + UmbralShadowColorInfo, + glm::vec4(1.f), + glm::vec4(0.f), + glm::vec4(1.f) + ) + , _showPenumbralShadow(ShowPenumbralShadowInfo, true) + , _penumbralShadowColor( + PenumbralShadowColorInfo, + glm::vec4(1.f), + glm::vec4(0.f), + glm::vec4(1.f) + ) + , _lightSource(LightSourceInfo) + , _lightSourceFrame(LightSourceFrameInfo) + , _shadower(ShadowerInfo) + , _shadowerFrame(ShadowerFrameInfo) + , _shadowee(ShadoweeInfo) + //, _test({"ABC", "ABC", ""}, 1, 0, 380) +{ + const Parameters p = codegen::bake(dictionary); + //addProperty(_test); + addProperty(Fadeable::_opacity); + + _numberOfPoints = p.numberOfPoints.value_or(_numberOfPoints); + addProperty(_numberOfPoints); + + _shadowLength = p.shadowLength.value_or(_shadowLength); + addProperty(_shadowLength); + + _showUmbralShadow = p.showUmbralShadow.value_or(_showUmbralShadow); + addProperty(_showUmbralShadow); + _umbralShadowColor = p.umbralShadowColor.value_or(_umbralShadowColor); + _umbralShadowColor.setViewOption(properties::Property::ViewOptions::Color); + addProperty(_umbralShadowColor); + + _showPenumbralShadow = p.showPenumbralShadow.value_or(_showPenumbralShadow); + addProperty(_showPenumbralShadow); + _penumbralShadowColor = p.penumbralShadowColor.value_or(_penumbralShadowColor); + _penumbralShadowColor.setViewOption(properties::Property::ViewOptions::Color); + addProperty(_penumbralShadowColor); + + _lightSource = p.lightSource; + _lightSourceFrame = p.lightSourceFrame; + _shadower = p.shadower; + _shadowee = p.shadowee; + _shadowerFrame = p.shadowerFrame; + + setRenderBin(RenderBin::PostDeferredTransparent); +} + +void RenderableEclipseCone::initializeGL() { + glGenVertexArrays(1, &_vao); + glGenBuffers(1, &_vbo); + + _shader = SpacecraftInstrumentsModule::ProgramObjectManager.request( + "ShadowCylinderProgram", + []() -> std::unique_ptr { + return global::renderEngine->buildRenderProgram( + "ShadowCylinderProgram", + absPath("${MODULE_SPACE}/shaders/eclipsecone_vs.glsl"), + absPath("${MODULE_SPACE}/shaders/eclipsecone_fs.glsl") + ); + } + ); + + ghoul::opengl::updateUniformLocations(*_shader, _uniformCache, UniformNames); +} + +void RenderableEclipseCone::deinitializeGL() { + SpacecraftInstrumentsModule::ProgramObjectManager.release( + "ShadowCylinderProgram", + [](ghoul::opengl::ProgramObject* p) { + global::renderEngine->removeRenderProgram(p); + } + ); + _shader = nullptr; + + glDeleteVertexArrays(1, &_vao); + _vao = 0; + glDeleteBuffers(1, &_vbo); + _vbo = 0; +} + +bool RenderableEclipseCone::isReady() const { + return _shader; +} + +void RenderableEclipseCone::render(const RenderData& data, RendererTasks&) { + glDepthMask(false); + glDisable(GL_CULL_FACE); + + _shader->activate(); + + // Model transform and view transform needs to be in double precision + const glm::dmat4 modelTransform = + glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * + glm::dmat4(data.modelTransform.rotation) * + glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); + glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * modelTransform; + + _shader->setUniform( + _uniformCache.modelViewProjectionTransform, + data.camera.projectionMatrix() * glm::mat4(modelViewTransform) + ); + + _shader->setUniform(_uniformCache.opacity, opacity()); + + glBindVertexArray(_vao); + if (_showUmbralShadow) { + _shader->setUniform(_uniformCache.shadowColor, _umbralShadowColor); + glDrawArrays(GL_TRIANGLE_STRIP, 0, _nVertices); + } + if (_showPenumbralShadow) { + // The shadow vertices live in the same VBO so the start index might be offset + const int startIndex = _showUmbralShadow ? _nVertices : 0; + _shader->setUniform(_uniformCache.shadowColor, _penumbralShadowColor); + glDrawArrays(GL_TRIANGLE_STRIP, startIndex, _nVertices); + } + glBindVertexArray(0); + + _shader->deactivate(); + + glDisable(GL_CULL_FACE); + glDepthMask(true); +} + +void RenderableEclipseCone::update(const UpdateData& data) { + if (_shader->isDirty()) { + _shader->rebuildFromFile(); + ghoul::opengl::updateUniformLocations(*_shader, _uniformCache, UniformNames); + } + createCone(data.time.j2000Seconds()); +} + +std::vector calculateShadowPoints(const std::vector& srcTerminator, + const std::vector& dstTerminator, + const glm::dvec3& shadowerToLightSource, + const glm::dmat3& lightSourceToShadower, + double lengthScale) +{ + ghoul_assert(srcTerminator.size() == dstTerminator.size(), "Unmatched termiator pts"); + + std::vector vertices; + vertices.reserve(dstTerminator.size() * 2); + for (size_t i = 0; i < dstTerminator.size(); i++) { + // Convert the terminator points from the reference frame of the Sun to the + // reference frame of the Moon + const glm::dvec3 src = + lightSourceToShadower * srcTerminator[i] + shadowerToLightSource; + const glm::dvec3 dst = dstTerminator[i]; + const glm::dvec3 dir = glm::normalize(dst - src); + + // The start point is the terminator point on the Moon + glm::vec3 p1 = dst; + vertices.push_back({ p1.x, p1.y, p1.z }); + + // The end point is calculated by forward propagating the incoming direction + glm::vec3 p2 = dst + dir * lengthScale; + vertices.push_back({ p2.x, p2.y, p2.z }); + } + return vertices; +} + +void RenderableEclipseCone::createCone(double et) { + // Big picture for the calculation for this example (lightSource = Sun, + // shadower = Moon, shadowee = Earth). We get the limb (= penumbral terminator) of the + // Sun as viewed from the Moon, then the limb of the Moon as viewed from the Sun. + // The penumbral shadow cone is constructed by connecting the points of the limbs in + // order. The umbral shadow cone is constructed by connecting them 180 deg out of + // phase (meaning top to bottom). We want the cone to eminate from the shadower, so + // we take the distance from the shadower to the shadowee and use that as a scale for + // the resulting vectors we get (also including the _shadowLength) as an additional + // scale factor + + // 1. Get the penumbral terminator of the lightsource from the view of the shadower + SpiceManager::TerminatorEllipseResult resSrc = SpiceManager::ref().terminatorEllipse( + _lightSource, + _shadowee, // The actual value of this doesn't matter + _lightSourceFrame, + _shadower, + SpiceManager::TerminatorType::Penumbral, + { + SpiceManager::AberrationCorrection::Type::None, + SpiceManager::AberrationCorrection::Direction::Reception + }, + et, + _numberOfPoints + ); + // convert to meter + for (glm::dvec3& p : resSrc.terminatorPoints) { + p *= 1000.0; + } + + + // 2. Get the penumbral terminator of the shadower from the lightsource + SpiceManager::TerminatorEllipseResult resDst = SpiceManager::ref().terminatorEllipse( + _shadower, + _shadowee, // The actual value of this doesn't matter + _shadowerFrame, + _lightSource, + SpiceManager::TerminatorType::Penumbral, + { + SpiceManager::AberrationCorrection::Type::None, + SpiceManager::AberrationCorrection::Direction::Reception + }, + et, + _numberOfPoints + ); + // convert to meter + for (glm::dvec3& p : resDst.terminatorPoints) { + p *= 1000.0; + } + // Spice calculates the terminator points in a fixed clockwise/counterclockwise + // direction from the point of the view of the observer. Since we are switching target + // and observer, this means that one of the sets of points is clockwise, while the + // other is counterclockwise. In order for the right points to match up, we need to + // reverse the order of one of them. It doesn't matter which one, so we pick this one + std::reverse(resDst.terminatorPoints.begin(), resDst.terminatorPoints.end()); + + ghoul_assert( + resSrc.terminatorPoints.size() == resDst.terminatorPoints.size(), + "Inconsistent number of terminator points retrieved" + ); + + + // 3. Get the necessary conversion distances and matrices + glm::dvec3 diff = SpiceManager::ref().targetPosition( + _shadowee, + _shadower, + "GALACTIC", + { + SpiceManager::AberrationCorrection::Type::None, + SpiceManager::AberrationCorrection::Direction::Reception + }, + et + ); + const double distance = glm::length(diff) * 1000.0; // to meter + + + const glm::dvec3 shadowerToLightSource = SpiceManager::ref().targetPosition( + _lightSource, + _shadower, + _shadowerFrame, + { + SpiceManager::AberrationCorrection::Type::None, + SpiceManager::AberrationCorrection::Direction::Reception + }, + et + ) * 1000.0; // to meter + glm::dmat3 lightSourceToShadower = SpiceManager::ref().frameTransformationMatrix( + _lightSourceFrame, _shadowerFrame, et + ); + + + // 4. Construct the penumbral shadow + std::vector penumbralVertices; + if (_showPenumbralShadow) { + penumbralVertices = calculateShadowPoints( + resSrc.terminatorPoints, + resDst.terminatorPoints, + shadowerToLightSource, + lightSourceToShadower, + distance * static_cast(_shadowLength) + ); + + // We need to duplicate the first two vertices to close the cylinder at the seam + penumbralVertices.push_back(penumbralVertices[0]); + penumbralVertices.push_back(penumbralVertices[1]); + } + + + // 5. Construct the umbral shadow + std::vector umbralVertices; + if (_showUmbralShadow) { + // For the umbral shadow, we need to mix the terminator points with a 180 + // degree phase shift, so that the top terminator point of the sun gets matched + // with the bottom terminator point of the Moon, etc + std::rotate( + resSrc.terminatorPoints.begin(), + resSrc.terminatorPoints.begin() + resSrc.terminatorPoints.size() / 2, + resSrc.terminatorPoints.end() + ); + umbralVertices = calculateShadowPoints( + resSrc.terminatorPoints, + resDst.terminatorPoints, + shadowerToLightSource, + lightSourceToShadower, + distance * static_cast(_shadowLength) + ); + + // We need to duplicate the first two vertices to close the cylinder at the seam + umbralVertices.push_back(umbralVertices[0]); + umbralVertices.push_back(umbralVertices[1]); + } + + + // 6. Combine vertices + std::vector vertices; + vertices.reserve(umbralVertices.size() + penumbralVertices.size()); + vertices.insert(vertices.end(), umbralVertices.begin(), umbralVertices.end()); + vertices.insert(vertices.end(), penumbralVertices.begin(), penumbralVertices.end()); + + _nVertices = 0; + if (_showPenumbralShadow) { + _nVertices = static_cast(penumbralVertices.size()); + } + if (_showUmbralShadow) { + _nVertices = static_cast(penumbralVertices.size()); + } + + glBindVertexArray(_vao); + glBindBuffer(GL_ARRAY_BUFFER, _vbo); + glBufferData( + GL_ARRAY_BUFFER, + vertices.size() * sizeof(VBOLayout), + vertices.data(), + GL_DYNAMIC_DRAW + ); + + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr); + glBindVertexArray(0); +} + +} // namespace openspace diff --git a/modules/space/rendering/renderableeclipsecone.h b/modules/space/rendering/renderableeclipsecone.h new file mode 100644 index 0000000000..0d7d6253fe --- /dev/null +++ b/modules/space/rendering/renderableeclipsecone.h @@ -0,0 +1,87 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2023 * + * * + * 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_SPACECRAFTINSTRUMENTS___RENDERABLEECLIPSECONE___H__ +#define __OPENSPACE_MODULE_SPACECRAFTINSTRUMENTS___RENDERABLEECLIPSECONE___H__ + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace ghoul::opengl { class ProgramObject; } + +namespace openspace { + +namespace documentation { struct Documentation; } + +struct RenderData; +struct UpdateData; + +class RenderableEclipseCone : public Renderable { +public: + RenderableEclipseCone(const ghoul::Dictionary& dictionary); + + void initializeGL() override; + void deinitializeGL() override; + + bool isReady() const override; + void render(const RenderData& data, RendererTasks& rendererTask) override; + void update(const UpdateData& data) override; + + static documentation::Documentation Documentation(); + +private: + void createCone(double et); + + properties::IntProperty _numberOfPoints; + properties::FloatProperty _shadowLength; + properties::BoolProperty _showUmbralShadow; + properties::Vec4Property _umbralShadowColor; + properties::BoolProperty _showPenumbralShadow; + properties::Vec4Property _penumbralShadowColor; + + properties::StringProperty _lightSource; + properties::StringProperty _lightSourceFrame; + properties::StringProperty _shadower; + properties::StringProperty _shadowerFrame; + properties::StringProperty _shadowee; + + ghoul::opengl::ProgramObject* _shader = nullptr; + UniformCache(modelViewProjectionTransform, shadowColor, opacity) _uniformCache; + + GLuint _vao = 0; + GLuint _vbo = 0; + + int _nVertices = 0; +}; + +} // namespace openspace + +#endif // __OPENSPACE_MODULE_SPACECRAFTINSTRUMENTS___RENDERABLEECLIPSECONE___H__ diff --git a/modules/space/shaders/eclipsecone_fs.glsl b/modules/space/shaders/eclipsecone_fs.glsl new file mode 100644 index 0000000000..a14344c0e6 --- /dev/null +++ b/modules/space/shaders/eclipsecone_fs.glsl @@ -0,0 +1,38 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2023 * + * * + * 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 "fragment.glsl" + +in float vs_depth; + +uniform float opacity; +uniform vec4 shadowColor; + + +Fragment getFragment() { + Fragment frag; + frag.color = vec4(shadowColor.rgb, shadowColor.a * opacity); + frag.depth = vs_depth; + return frag; +} diff --git a/modules/space/shaders/eclipsecone_vs.glsl b/modules/space/shaders/eclipsecone_vs.glsl new file mode 100644 index 0000000000..177f3e04c7 --- /dev/null +++ b/modules/space/shaders/eclipsecone_vs.glsl @@ -0,0 +1,41 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2023 * + * * + * 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. * + ****************************************************************************************/ + +#version __CONTEXT__ + +#include "PowerScaling/powerScaling_vs.hglsl" + +layout(location = 0) in vec3 in_point_position; + +out float vs_depth; + +uniform mat4 modelViewProjectionTransform; + + +void main() { + vec4 positionClipSpace = modelViewProjectionTransform * vec4(in_point_position, 1.0); + vec4 p = z_normalization(positionClipSpace); + vs_depth = p.w; + gl_Position = p; +} diff --git a/modules/space/spacemodule.cpp b/modules/space/spacemodule.cpp index cd975b4eed..f5f8d792cf 100644 --- a/modules/space/spacemodule.cpp +++ b/modules/space/spacemodule.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -85,6 +86,7 @@ void SpaceModule::internalInitialize(const ghoul::Dictionary& dictionary) { fRenderable->registerClass( "RenderableConstellationLines" ); + fRenderable->registerClass("RenderableEclipseCone"); fRenderable->registerClass("RenderableFluxNodes"); fRenderable->registerClass("RenderableHabitableZone"); fRenderable->registerClass("RenderableRings"); @@ -122,6 +124,7 @@ std::vector SpaceModule::documentations() const { KeplerTranslation::Documentation(), RenderableConstellationBounds::Documentation(), RenderableConstellationLines::Documentation(), + RenderableEclipseCone::Documentation(), RenderableFluxNodes::Documentation(), RenderableHabitableZone::Documentation(), RenderableRings::Documentation(), From 8bc890942540c705c28fee1da2afab21f0f50185 Mon Sep 17 00:00:00 2001 From: Gene Payne Date: Tue, 18 Jul 2023 17:51:10 -0600 Subject: [PATCH 052/701] Bump to sgct version with meta info --- apps/OpenSpace/ext/sgct | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index 19e7e21435..7a0b95f703 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit 19e7e21435fe4df71eb89d53599b46b68758273d +Subproject commit 7a0b95f703d59182f57fbc14ea3e591c265038f7 From ceed3fc58a9c1e1d1384dae67f6cf03206ee7a5f Mon Sep 17 00:00:00 2001 From: GPayne Date: Wed, 19 Jul 2023 10:11:11 -0600 Subject: [PATCH 053/701] New visual test of nightsky constellations --- tests/visual/nightsky/constellationlines.ostest | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 tests/visual/nightsky/constellationlines.ostest diff --git a/tests/visual/nightsky/constellationlines.ostest b/tests/visual/nightsky/constellationlines.ostest new file mode 100644 index 0000000000..77916b69cc --- /dev/null +++ b/tests/visual/nightsky/constellationlines.ostest @@ -0,0 +1,12 @@ +[ + { "type": "pause", + "value": "true"}, + { "type": "time", + "value": "2023-03-03T20:00:00.00"}, + { "type": "script", + "value": "openspace.fadeIn('Scene.Constellations.Renderable')"}, + { "type": "wait", + "value": "30"}, + { "type": "screenshot", + "value": "constellationlines"} +] From 72bf7f59d3638b7f0a8bafa2b132f10b78db195c Mon Sep 17 00:00:00 2001 From: Gene Payne Date: Wed, 19 Jul 2023 13:50:59 -0600 Subject: [PATCH 054/701] Implemented tooltips for sgct window config files in launcher dropdown --- .../ext/launcher/src/launcherwindow.cpp | 18 ++++++++++++++++++ apps/OpenSpace/ext/sgct | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp b/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp index 8454551101..7bb25f7e61 100644 --- a/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp +++ b/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp @@ -552,6 +552,17 @@ bool handleConfigurationFile(QComboBox& box, const std::filesystem::directory_en } box.addItem(QString::fromStdString(p.path().filename().string())); + //Add tooltip + if (isJson) { + sgct::config::Meta meta = sgct::readMeta(p.path().string(), true); + if (!meta.description.empty()) { + QString toolTip = QString::fromStdString( + fmt::format("

{}

", meta.description) + ); + box.setItemData(box.count() - 1, toolTip, Qt::ToolTipRole); + } + } + // For now, mark the XML configuration files to show that they are deprecated if (isXml) { box.setItemData(box.count() - 1, QBrush(Qt::darkYellow), Qt::ForegroundRole); @@ -644,6 +655,13 @@ void LauncherWindow::populateWindowConfigsList(std::string preset) { _windowConfigBoxIndexSgctCfgDefault, QString::fromStdString(_sgctConfigName) ); + QString defaultTip = + "

The basic default configuration specified in the .cfg file

"; + _windowConfigBox->setItemData( + _windowConfigBoxIndexSgctCfgDefault, + defaultTip, + Qt::ToolTipRole + ); // Try to find the requested configuration file and set it as the current one. As we // have support for function-generated configuration files that will not be in the // list we need to add a preset that doesn't exist a file for diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index 7a0b95f703..db37bed6d7 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit 7a0b95f703d59182f57fbc14ea3e591c265038f7 +Subproject commit db37bed6d79689202ac3eb195366ba923f109358 From 90d8abcfb10efd0e6a80a5dca97e62b17445a65d Mon Sep 17 00:00:00 2001 From: GPayne Date: Thu, 20 Jul 2023 08:45:45 -0600 Subject: [PATCH 055/701] Bump sgct rev with comment header --- apps/OpenSpace/ext/sgct | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index db37bed6d7..d643b8bf2a 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit db37bed6d79689202ac3eb195366ba923f109358 +Subproject commit d643b8bf2a456006f16c3623ff00d6ce572dff51 From 083ded25f55bc779a9fae603a157d366fe4c96d3 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Tue, 25 Jul 2023 19:24:00 +0200 Subject: [PATCH 056/701] Update CREDITS.md --- CREDITS.md | 46 ++++++---------------------------------------- 1 file changed, 6 insertions(+), 40 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index c8c08729da..91d3244a00 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -1,56 +1,22 @@ # Core Team Alexander Bock Emma Broman -Emil Axelsson +Malin Ejdbo Gene Payne +Emil Axelsson Kalle Bladin Jonathas Costa -Malin Ejdbo -Elon Olsson +Ylva Selling Micah Acinapura +Elon Olsson Jonas Strandstedt Michal Marcinkowski +Adam Rohdin Joakim Kilby Lovisa Hassler Mikael Petterson Erik Sundén Stefan Lindblad +Megan Villa Corrie Roe Eric Myers - -Sebastian Piwell -Erik Broberg -Jonathan Bosson -Michael Nilsson -Jonathan Franzen -ChristianAdamsson -Emilie Ho -Karin Reidarman -Hans-Christian Helltegen -Anton Arbring -Oskar Carlbaum -Matthew Territo -Jonathan Grangien -Klas Eskilson -Aniisa Bihi -Tomas Forsyth Rosin -Niclas Hultberg -Rickard Lindtstedt -Ingela Rossing -Michael Sjöström -Michael Novén -Christoffer Särevall - -# Community Support -Anteige -arfon -DavidLaidlaw -ethanejohnsons -johnriedel -mik3caprio -mingenuity -nbartzokas -nealmcb -noahdasanaike -PTrottier -sa5bke From 5a9c70f22c63a5c3ac8f5da783b035aabe10e5c4 Mon Sep 17 00:00:00 2001 From: GPayne Date: Tue, 25 Jul 2023 13:12:42 -0600 Subject: [PATCH 057/701] Added a JWST visual test --- tests/visual/jwst/earthorbit.ostest | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 tests/visual/jwst/earthorbit.ostest diff --git a/tests/visual/jwst/earthorbit.ostest b/tests/visual/jwst/earthorbit.ostest new file mode 100644 index 0000000000..c27fc78712 --- /dev/null +++ b/tests/visual/jwst/earthorbit.ostest @@ -0,0 +1,12 @@ +[ + { "type": "pause", + "value": "true"}, + { "type": "time", + "value": "2021-12-25T20:12:51.00"}, + { "type": "navigationstate", + "value": "{Anchor='JWSTModel',Pitch=-0.0016564658365626121,Position={29.160003662109375,-2.7035293579101562,-15.113174438476562},ReferenceFrame='Root',Up={0.2476631160089928,0.916590399238525,0.3138869557539424},Yaw=-0.005731161690830819}"}, + { "type": "wait", + "value": "45"}, + { "type": "screenshot", + "value": "earthorbit"} +] From b32183e4a9fa084641af3e719f4e6952d0a469e3 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 26 Jul 2023 22:23:58 +0200 Subject: [PATCH 058/701] Correctly show the Apollo 17 insignia --- .../scene/solarsystem/missions/apollo/insignias_map.asset | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/assets/scene/solarsystem/missions/apollo/insignias_map.asset b/data/assets/scene/solarsystem/missions/apollo/insignias_map.asset index cebfca401f..e00120ffa5 100644 --- a/data/assets/scene/solarsystem/missions/apollo/insignias_map.asset +++ b/data/assets/scene/solarsystem/missions/apollo/insignias_map.asset @@ -200,6 +200,7 @@ asset.onInitialize(function() openspace.addSceneGraphNode(Apollo14) openspace.addSceneGraphNode(Apollo15) openspace.addSceneGraphNode(Apollo16) + openspace.addSceneGraphNode(Apollo17) openspace.action.registerAction(ShowInsignias) openspace.action.registerAction(HideInsignias) @@ -209,6 +210,7 @@ asset.onDeinitialize(function() openspace.action.removeAction(HideInsignias) openspace.action.removeAction(ShowInsignias) + openspace.removeSceneGraphNode(Apollo17) openspace.removeSceneGraphNode(Apollo16) openspace.removeSceneGraphNode(Apollo15) openspace.removeSceneGraphNode(Apollo14) From 59d51a365f04e2004b415dc329134bb20ed7111e Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 31 Jul 2023 13:39:35 +0200 Subject: [PATCH 059/701] Prevent crash when no shadow caster is available --- modules/atmosphere/rendering/atmospheredeferredcaster.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp index 3c9c872413..5223fba086 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp @@ -273,11 +273,11 @@ void AtmosphereDeferredcaster::update(const UpdateData&) {} float AtmosphereDeferredcaster::eclipseShadow(glm::dvec3 position) { // This code is copied from the atmosphere deferred fragment shader // It is used to calculate the eclipse shadow - const ShadowRenderingStruct& shadow = _shadowDataArrayCache.front(); - if (_shadowDataArrayCache.empty() || !shadow.isShadowing) { + if (_shadowDataArrayCache.empty() || !_shadowDataArrayCache.front().isShadowing) { return 1.f; } + const ShadowRenderingStruct& shadow = _shadowDataArrayCache.front(); const glm::dvec3 positionToCaster = shadow.casterPositionVec - position; const glm::dvec3 sourceToCaster = shadow.sourceCasterVec; // Normalized const glm::dvec3 casterShadow = dot(positionToCaster, sourceToCaster) * sourceToCaster; From 25451e08e8faa6d939494597d63eafc7574a45dd Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Wed, 2 Aug 2023 15:56:35 +0200 Subject: [PATCH 060/701] Update GUI hash --- data/assets/util/webgui.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/util/webgui.asset b/data/assets/util/webgui.asset index 98c92d27c7..2892f6e71c 100644 --- a/data/assets/util/webgui.asset +++ b/data/assets/util/webgui.asset @@ -4,7 +4,7 @@ local guiCustomization = asset.require("customization/gui") -- Select which commit hashes to use for the frontend and backend -local frontendHash = "aab5767cdfe004a8a512f18e41217f608b62f131" +local frontendHash = "44a3e3aa89f250b74ffc4b7f3a503a5149c0e8de" local frontend = asset.syncedResource({ Identifier = "WebGuiFrontend", From 32776e7b76318f43ad4572cff8c6e65ad1d90f57 Mon Sep 17 00:00:00 2001 From: Gene Payne Date: Wed, 2 Aug 2023 12:28:27 -0600 Subject: [PATCH 061/701] Fix visual test file Mars terrain typo in CTX layer --- tests/visual/default/MarsHiRISE.ostest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/visual/default/MarsHiRISE.ostest b/tests/visual/default/MarsHiRISE.ostest index 8ff130ca7e..84c03b7386 100644 --- a/tests/visual/default/MarsHiRISE.ostest +++ b/tests/visual/default/MarsHiRISE.ostest @@ -12,7 +12,7 @@ { "type": "script", "value": "openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.ColorLayers.HiRISE-PSP.Enabled', true)"}, { "type": "script", - "value": "openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.ColorLayers.CTX_blended_01.Enabled', true)"}, + "value": "openspace.setPropertyValueSingle('Scene.Mars.Renderable.Layers.ColorLayers.CTX_blended.Enabled', true)"}, { "type": "wait", "value": "100"}, { "type": "navigationstate", From 091697c5b7c5425e05894395e26677cd0407af74 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Thu, 3 Aug 2023 09:46:55 +0200 Subject: [PATCH 062/701] Make geojson file extension parsing more flexible in lua function (closes #2797) Now allows geojson files with caps in the extension, as well as files with the .json extension. Note that .json files will not be handled by drag-n-drop (we might want to use that extension for something else) --- modules/globebrowsing/globebrowsingmodule_lua.inl | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/globebrowsing/globebrowsingmodule_lua.inl b/modules/globebrowsing/globebrowsingmodule_lua.inl index 21268feb04..1332f4889d 100644 --- a/modules/globebrowsing/globebrowsingmodule_lua.inl +++ b/modules/globebrowsing/globebrowsingmodule_lua.inl @@ -612,9 +612,13 @@ getGeoPositionForCamera(bool useEyePosition = false) )); } - if (path.extension() != ".geojson") { + std::string extension = path.extension().string(); + std::transform(extension.begin(), extension.end(), extension.begin(), + [](unsigned char c) { return std::tolower(c); }); + + if (extension != ".geojson" && extension != ".json") { throw ghoul::lua::LuaError(fmt::format( - "Unexpected file type: '{}'. Expected '.geojson' file", filename + "Unexpected file type: '{}'. Expected '.geojson' or '.json' file", filename )); } From c973cee5a12b11f6d464db14120ce602f39f2a4a Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Thu, 3 Aug 2023 10:46:48 +0200 Subject: [PATCH 063/701] Allow reading GeoJson files with null geometry (issue #2811) Present a warning when a null geometry is encountered, as it will not be loaded as of now --- modules/globebrowsing/ext/geos | 2 +- .../src/geojson/geojsoncomponent.cpp | 27 ++++++++++++++----- .../src/geojson/geojsoncomponent.h | 2 +- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/modules/globebrowsing/ext/geos b/modules/globebrowsing/ext/geos index bc93e4c523..e9ca7617f6 160000 --- a/modules/globebrowsing/ext/geos +++ b/modules/globebrowsing/ext/geos @@ -1 +1 @@ -Subproject commit bc93e4c523e92baee3c92608b1309a31453ece06 +Subproject commit e9ca7617f6249a9bbb86721dfc2ebd6283168e53 diff --git a/modules/globebrowsing/src/geojson/geojsoncomponent.cpp b/modules/globebrowsing/src/geojson/geojsoncomponent.cpp index 394f5e4f00..d3f6b43afc 100644 --- a/modules/globebrowsing/src/geojson/geojsoncomponent.cpp +++ b/modules/globebrowsing/src/geojson/geojsoncomponent.cpp @@ -611,8 +611,10 @@ void GeoJsonComponent::readFile() { try { GeoJSONFeatureCollection fc = reader.readFeatures(content); + int count = 1; for (const GeoJSONFeature& feature : fc.getFeatures()) { - parseSingleFeature(feature); + parseSingleFeature(feature, count); + count++; } if (_geometryFeatures.empty()) { @@ -633,16 +635,25 @@ void GeoJsonComponent::readFile() { computeMainFeatureMetaPropeties(); } -void GeoJsonComponent::parseSingleFeature(const geos::io::GeoJSONFeature& feature) { +void GeoJsonComponent::parseSingleFeature(const geos::io::GeoJSONFeature& feature, + int indexInFile +) { // Read the geometry const geos::geom::Geometry* geom = feature.getGeometry(); - ghoul_assert(geom, "No geometry found"); // Read the properties GeoJsonOverrideProperties propsFromFile = propsFromGeoJson(feature); std::vector geomsToAdd; - if (geom->isPuntal()) { + if (!geom) { + // Null geometry => no geometries to add + LWARNING(fmt::format( + "Feature {} in GeoJson file '{}' is a null geometry and will not be loaded", + indexInFile, _geoJsonFile + )); + // @TODO (emmbr26) We should eventually support features with null geometry + } + else if (geom->isPuntal()) { // If points, handle all point features as one feature, even multi-points geomsToAdd = { geom }; } @@ -650,7 +661,10 @@ void GeoJsonComponent::parseSingleFeature(const geos::io::GeoJSONFeature& featur size_t nGeom = geom->getNumGeometries(); geomsToAdd.reserve(nGeom); for (size_t i = 0; i < nGeom; ++i) { - geomsToAdd.push_back(geom->getGeometryN(i)); + const geos::geom::Geometry* subGeometry = geom->getGeometryN(i); + if (subGeometry) { + geomsToAdd.push_back(subGeometry); + } } } @@ -687,7 +701,8 @@ void GeoJsonComponent::parseSingleFeature(const geos::io::GeoJSONFeature& featur catch (const ghoul::MissingCaseException&) { LERROR(fmt::format( "Error creating GeoJson layer with identifier '{}'. Problem reading " - "feature {} in GeoJson file '{}'.", identifier(), index, _geoJsonFile + "feature {} in GeoJson file '{}'.", + identifier(), indexInFile, _geoJsonFile )); // Do nothing } diff --git a/modules/globebrowsing/src/geojson/geojsoncomponent.h b/modules/globebrowsing/src/geojson/geojsoncomponent.h index 5e25c552ff..cad6eb9fbb 100644 --- a/modules/globebrowsing/src/geojson/geojsoncomponent.h +++ b/modules/globebrowsing/src/geojson/geojsoncomponent.h @@ -98,7 +98,7 @@ private: }; void readFile(); - void parseSingleFeature(const geos::io::GeoJSONFeature& feature); + void parseSingleFeature(const geos::io::GeoJSONFeature& feature, int indexInFile); /** * Add meta properties to the feature, to allow things like flying to it, From 2b3226d18d8ac1ea61cae62a5474113cc946fb4c Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Thu, 3 Aug 2023 16:51:13 +0200 Subject: [PATCH 064/701] FIx aspect ratio issue for RenderableVideoPlane (closes #2815) --- modules/video/src/renderablevideoplane.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/video/src/renderablevideoplane.cpp b/modules/video/src/renderablevideoplane.cpp index 49fde34615..5bcba06397 100644 --- a/modules/video/src/renderablevideoplane.cpp +++ b/modules/video/src/renderablevideoplane.cpp @@ -74,7 +74,7 @@ void RenderableVideoPlane::update(const UpdateData& data) { return; } - // Shape the vidoe based on the aspect ration of the film + // Shape the plane based on the aspect ration of the video glm::vec2 textureDim = glm::vec2(_videoPlayer.frameTexture()->dimensions()); if (_textureDimensions != textureDim) { float aspectRatio = textureDim.x / textureDim.y; @@ -83,10 +83,11 @@ void RenderableVideoPlane::update(const UpdateData& data) { if (std::abs(planeAspectRatio - aspectRatio) > std::numeric_limits::epsilon()) { + double scale = _size.value().y; glm::vec2 newSize = aspectRatio > 0.f ? - glm::vec2(_size.value().x * aspectRatio, _size.value().y) : - glm::vec2(_size.value().x, _size.value().y * aspectRatio); + glm::vec2(scale * aspectRatio, scale) : + glm::vec2(scale, scale * aspectRatio); _size = newSize; } From cb7ec8de707cfcdd2aba7cb41afe1bd2417ef307 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 3 Aug 2023 14:30:36 +0200 Subject: [PATCH 065/701] Fix issue where the time is wrong when starting a profile paused (closes #2826) --- include/openspace/util/time.h | 21 +++++---- src/util/time.cpp | 69 +++++++++++++++++++++++++--- src/util/time_lua.inl | 85 +++++++---------------------------- src/util/timemanager.cpp | 15 ++++--- 4 files changed, 98 insertions(+), 92 deletions(-) diff --git a/include/openspace/util/time.h b/include/openspace/util/time.h index 40dc00b6bb..48d70ef3b7 100644 --- a/include/openspace/util/time.h +++ b/include/openspace/util/time.h @@ -70,6 +70,12 @@ public: /// \overload static double convertTime(const std::string& time) static double convertTime(const char* time); + /** + * Returns the current wall time as an ISO 8601 date string (YYYY-MM-DDTHH-MN-SS) in + * the UTC timezone. + */ + static std::string currentWallTime(); + explicit Time(double secondsJ2000 = -1); explicit Time(const std::string& time); Time(const Time& other) = default; @@ -157,16 +163,13 @@ public: double advanceTime(double tickTime); /** - * Sets a relative time from profile. + * Modifies the passed time (first argument) by the delta time (second argument). The + * first argument must be an ISO 8601 date string. The second argument should be a + * string of the form [-]XX(s,m,h,d,M,y] with (s)econds, (m)inutes, (h)ours, (d)ays, + * (M)onths, and (y)ears as units and an optional - sign to move backwards in time. + * The return value is in the form of an ISO 8601 date string. */ - static void setTimeRelativeFromProfile(const std::string& setTime); - - /** - * Sets an absolute time from profile. - * \param setTime a string containing time to set, which must be a valid - * ISO 8601-like date string of the format YYYY-MM-DDTHH:MN:SS - */ - static void setTimeAbsoluteFromProfile(const std::string& setTime); + static std::string advancedTime(std::string base, std::string change); /** * Returns the Lua library that contains all Lua functions available to change the diff --git a/src/util/time.cpp b/src/util/time.cpp index 883b7848bb..d83b6378da 100644 --- a/src/util/time.cpp +++ b/src/util/time.cpp @@ -60,6 +60,18 @@ double Time::convertTime(const char* time) { return SpiceManager::ref().ephemerisTimeFromDate(time); } +std::string Time::currentWallTime() { + std::time_t t = std::time(nullptr); + std::tm* utcTime = std::gmtime(&t); + + std::string time = fmt::format( + "{:04d}-{:02d}-{:02d}T{:02d}:{:02d}:{:02d}", + utcTime->tm_year + 1900, utcTime->tm_mon + 1, utcTime->tm_mday, + utcTime->tm_hour, utcTime->tm_min, utcTime->tm_sec + ); + return time; +} + Time::Time(double secondsJ2000) : _time(secondsJ2000) {} Time::Time(const std::string& time) : @@ -132,14 +144,57 @@ void Time::ISO8601(char* buffer) const { SpiceManager::ref().dateFromEphemerisTime(_time, buffer, S, Format); } -void Time::setTimeRelativeFromProfile(const std::string& setTime) { - std::string t = currentWallTime(); - std::variant t2 = advancedTime(t, setTime); - ::setTime(std::get(t2)); -} +std::string Time::advancedTime(std::string base, std::string change) { + double j2000Seconds = Time::convertTime(base); -void Time::setTimeAbsoluteFromProfile(const std::string& setTime) { - ::setTime(setTime); + double dt = 0.0; + if (change.empty()) { + throw ghoul::RuntimeError("Modifier string must not be empty"); + } + ghoul::trimWhitespace(change); + bool isNegative = false; + if (change[0] == '-') { + isNegative = true; + change = change.substr(1); + } + + auto it = std::find_if( + change.begin(), change.end(), + [](unsigned char c) { + const bool digit = std::isdigit(c) != 0; + const bool isDot = c == '.'; + return !digit && !isDot; + } + ); + + try { + double value = std::stod(std::string(change.begin(), it)); + std::string uName = std::string(it, change.end()); + + TimeUnit unit = TimeUnit::Second; + if (uName == "s") { unit = TimeUnit::Second; } + else if (uName == "m") { unit = TimeUnit::Minute; } + else if (uName == "h") { unit = TimeUnit::Hour; } + else if (uName == "d") { unit = TimeUnit::Day; } + else if (uName == "M") { unit = TimeUnit::Month; } + else if (uName == "y") { unit = TimeUnit::Year; } + else { + throw ghoul::RuntimeError(fmt::format("Unknown unit '{}'", uName)); + } + + dt = openspace::convertTime(value, unit, TimeUnit::Second); + if (isNegative) { + dt *= -1.0; + } + } + catch (...) { + throw ghoul::RuntimeError(fmt::format( + "Error parsing relative time offset '{}'", change + )); + } + + std::string_view ret = Time(j2000Seconds + dt).ISO8601(); + return std::string(ret); } scripting::LuaLibrary Time::luaLibrary() { diff --git a/src/util/time_lua.inl b/src/util/time_lua.inl index 171773f2b5..e32ff13bdf 100644 --- a/src/util/time_lua.inl +++ b/src/util/time_lua.inl @@ -291,15 +291,7 @@ namespace { * UTC timezone. */ [[codegen::luawrap]] std::string currentWallTime() { - std::time_t t = std::time(nullptr); - std::tm* utcTime = std::gmtime(&t); - - std::string time = fmt::format( - "{:04d}-{:02d}-{:02d}T{:02d}:{:02d}:{:02d}", - utcTime->tm_year + 1900, utcTime->tm_mon + 1, utcTime->tm_mday, - utcTime->tm_hour, utcTime->tm_min, utcTime->tm_sec - ); - return time; + return openspace::Time::currentWallTime(); } /** @@ -323,77 +315,30 @@ namespace { std::variant base, std::variant change) { - using namespace openspace; - - double j2000Seconds = -1.0; - bool usesISO = false; + std::string b; if (std::holds_alternative(base)) { - j2000Seconds = Time::convertTime(std::get(base)); - usesISO = true; + b = std::get(base); } else { - j2000Seconds = std::get(base); - usesISO = false; + b = openspace::Time(std::get(base)).ISO8601(); } - - double dt = 0.0; - if (std::holds_alternative(change)) { - dt = std::get(change); + + std::string c; + if (std::holds_alternative(change)) { + c = std::get(change); } else { - std::string modifier = std::get(change); - if (modifier.empty()) { - throw ghoul::lua::LuaError("Modifier string must not be empty"); - } - ghoul::trimWhitespace(modifier); - bool isNegative = false; - if (modifier[0] == '-') { - isNegative = true; - modifier = modifier.substr(1); - } - - auto it = std::find_if( - modifier.begin(), modifier.end(), - [](unsigned char c) { - const bool digit = std::isdigit(c) != 0; - const bool isDot = c == '.'; - return !digit && !isDot; - } - ); - - try { - double value = std::stod(std::string(modifier.begin(), it)); - std::string uName = std::string(it, modifier.end()); - - TimeUnit unit = TimeUnit::Second; - if (uName == "s") { unit = TimeUnit::Second; } - else if (uName == "m") { unit = TimeUnit::Minute; } - else if (uName == "h") { unit = TimeUnit::Hour; } - else if (uName == "d") { unit = TimeUnit::Day; } - else if (uName == "M") { unit = TimeUnit::Month; } - else if (uName == "y") { unit = TimeUnit::Year; } - else { - throw ghoul::lua::LuaError(fmt::format("Unknown unit '{}'", uName)); - } - - dt = convertTime(value, unit, TimeUnit::Second); - if (isNegative) { - dt *= -1.0; - } - } - catch (...) { - throw ghoul::lua::LuaError(fmt::format( - "Error parsing relative time offset '{}'", modifier - )); - } + double v = std::get(change); + c = fmt::format("{}s", v); } - if (usesISO) { - std::string_view ret = Time(j2000Seconds + dt).ISO8601(); - return std::string(ret); + std::string res = openspace::Time::advancedTime(std::move(b), std::move(c)); + + if (std::holds_alternative(base)) { + return res; } else { - return j2000Seconds + dt; + return openspace::Time::convertTime(res); } } diff --git a/src/util/timemanager.cpp b/src/util/timemanager.cpp index e400f3dec0..94ed7f7700 100644 --- a/src/util/timemanager.cpp +++ b/src/util/timemanager.cpp @@ -941,13 +941,17 @@ void TimeManager::setTimeFromProfile(const Profile& p) { if (p.time.has_value()) { switch (p.time->type) { case Profile::Time::Type::Relative: - Time::setTimeRelativeFromProfile(p.time->value); + { + std::string t = Time::currentWallTime(); + std::variant t2 = + Time::advancedTime(t, p.time->value); + ghoul_assert(std::holds_alternative(t2), "Wrong type"); + _currentTime.data() = Time(std::get(t2)); break; - + } case Profile::Time::Type::Absolute: - Time::setTimeAbsoluteFromProfile(p.time->value); + _currentTime.data() = Time(p.time->value); break; - default: throw ghoul::MissingCaseException(); } @@ -956,8 +960,7 @@ void TimeManager::setTimeFromProfile(const Profile& p) { } else { // No value was specified so we are using 'now' instead - std::string now = std::string(Time::now().UTC()); - Time::setTimeAbsoluteFromProfile(now); + _currentTime.data() = Time::now(); } } From 30b80843c34273ef9f30eb785e496f2eb259e4d8 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 3 Aug 2023 14:46:39 +0200 Subject: [PATCH 066/701] Add a new Lua function that resets the camera back to the start position (closes #2825) --- src/engine/openspaceengine.cpp | 34 +++++++++++++++++++++--------- src/engine/openspaceengine_lua.inl | 7 ++++++ 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index 6e526a3f7d..10d9b57e69 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -1690,7 +1690,8 @@ scripting::LuaLibrary OpenSpaceEngine::luaLibrary() { codegen::lua::CreateSingleColorImage, codegen::lua::IsMaster, codegen::lua::Version, - codegen::lua::ReadCSVFile + codegen::lua::ReadCSVFile, + codegen::lua::ResetCamera }, { absPath("${SCRIPTS}/core_scripts.lua") @@ -1717,19 +1718,28 @@ void setCameraFromProfile(const Profile& p) { return; } + auto checkNodeExists = [](const std::string& node) { + if (global::renderEngine->scene()->sceneGraphNode(node) == nullptr) { + throw ghoul::RuntimeError(fmt::format("Could not find node '{}'", node)); + } + }; + std::visit( - overloaded{ - [](const Profile::CameraNavState& navStateProfile) { + overloaded { + [&checkNodeExists](const Profile::CameraNavState& navStateProfile) { interaction::NavigationState nav; nav.anchor = navStateProfile.anchor; + checkNodeExists(nav.anchor); if (navStateProfile.aim.has_value()) { nav.aim = navStateProfile.aim.value(); + checkNodeExists(nav.aim); } if (navStateProfile.referenceFrame.empty()) { nav.referenceFrame = nav.anchor; } else { nav.referenceFrame = navStateProfile.referenceFrame; + checkNodeExists(navStateProfile.referenceFrame); } nav.position = navStateProfile.position; if (navStateProfile.up.has_value()) { @@ -1743,11 +1753,12 @@ void setCameraFromProfile(const Profile& p) { } global::navigationHandler->setNavigationStateNextFrame(nav); }, - [](const Profile::CameraGoToGeo& geo) { - // Instead of direct calls to navigation state code, lua commands with + [&checkNodeExists](const Profile::CameraGoToGeo& geo) { + // Instead of direct calls to navigation state code, Lua commands with // globebrowsing goToGeo are used because this prevents a module // dependency in this core code. Eventually, goToGeo will be incorporated // in the OpenSpace core and this code will change. + checkNodeExists(geo.anchor); std::string geoScript = fmt::format("openspace.globebrowsing.goToGeo" "([[{}]], {}, {}", geo.anchor, geo.latitude, geo.longitude); if (geo.altitude.has_value()) { @@ -1759,13 +1770,16 @@ void setCameraFromProfile(const Profile& p) { scripting::ScriptEngine::RemoteScripting::Yes ); }, - [](const Profile::CameraGoToNode& node) { + [&checkNodeExists](const Profile::CameraGoToNode& node) { using namespace interaction; - NodeCameraStateSpec spec; - spec.identifier = node.anchor; - spec.height = node.height; - spec.useTargetUpDirection = true; + checkNodeExists(node.anchor); + + NodeCameraStateSpec spec = { + .identifier = node.anchor, + .height = node.height, + .useTargetUpDirection = true + }; global::navigationHandler->setCameraFromNodeSpecNextFrame(spec); } }, diff --git a/src/engine/openspaceengine_lua.inl b/src/engine/openspaceengine_lua.inl index 96a7d0c29d..8c57caf881 100644 --- a/src/engine/openspaceengine_lua.inl +++ b/src/engine/openspaceengine_lua.inl @@ -228,4 +228,11 @@ namespace { return res; } +/** + * Resets the camera position to the same position where the profile originally started + */ +[[codegen::luawrap]] void resetCamera() { + openspace::setCameraFromProfile(*openspace::global::profile); +} + #include "openspaceengine_lua_codegen.cpp" From 8d42537d6d7d4f5a42004ae7d02e6b4184ed431b Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 3 Aug 2023 15:34:13 +0200 Subject: [PATCH 067/701] Set the user position to be (0,0,0) which fixed the creation of Fisheye configurations (closes #2818) --- apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp b/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp index 2f15244b02..2a98f99b78 100644 --- a/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp +++ b/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp @@ -498,7 +498,7 @@ void SgctEdit::generateConfigUsers() { if (!_didImportValues) { sgct::config::User user; user.eyeSeparation = 0.065f; - user.position = { 0.f, 0.f, 4.f }; + user.position = { 0.f, 0.f, 0.f }; _cluster.users = { user }; } } From ecb8b06df6cf74131aa8c3c7a3ee6c1a894e7ce1 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 3 Aug 2023 16:57:01 +0200 Subject: [PATCH 068/701] Add new Lua function to remove all loaded assets (closes #2812). Fix crash that would occur when trying to unload an asset that requires a root asset --- include/openspace/scene/assetmanager.h | 17 ++++++++++++++++ src/scene/asset.cpp | 10 +++++++--- src/scene/assetmanager.cpp | 18 ++++++++++++++++- src/scene/assetmanager_lua.inl | 27 ++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 4 deletions(-) diff --git a/include/openspace/scene/assetmanager.h b/include/openspace/scene/assetmanager.h index 7c4a4d42d4..6343d07653 100644 --- a/include/openspace/scene/assetmanager.h +++ b/include/openspace/scene/assetmanager.h @@ -92,8 +92,25 @@ public: */ std::vector allAssets() const; + /** + * Returns all root assets, which are assets that have been loaded directly from the + * profile or by calling the #add method. + * + * \return A list of all root assets + */ + std::vector rootAssets() const; + std::vector allSynchronizations() const; + /** + * Returns whether the provided \p asset has been loaded directly by the user or + * loaded through a profile file. + * + * \param asset The asset that should be tested + * \return Whether the \p asset has been loaded directly or included in a profile + */ + bool isRootAsset(const Asset* asset) const; + /** * Loads the provided \p asset as a child of the provided \p parent. Loading an asset * means that asset file gets executed and the meta information is extracted from it. diff --git a/src/scene/asset.cpp b/src/scene/asset.cpp index b8e3fe806c..e25f119d12 100644 --- a/src/scene/asset.cpp +++ b/src/scene/asset.cpp @@ -260,10 +260,12 @@ void Asset::unload() { child->_parentAssets.erase(parentIt); - if (!child->hasInitializedParent()) { + // We only want to deinitialize the child if noone is keeping track of it, + // which is either a still initialized parent or that it is loaded as a root + if (!child->hasInitializedParent() && !_manager.isRootAsset(child)) { child->deinitialize(); } - if (!child->hasLoadedParent()) { + if (!child->hasLoadedParent() && !_manager.isRootAsset(child)) { child->unload(); } } @@ -324,7 +326,9 @@ void Asset::deinitialize() { // 1. Deinitialize unwanted requirements for (Asset* dependency : _requiredAssets) { - if (!dependency->hasInitializedParent()) { + // We only want to deinitialize the dependency if noone is keeping track of it, + // which is either a still initialized parent or that it is loaded as a root + if (!dependency->hasInitializedParent() && !_manager.isRootAsset(dependency)) { dependency->deinitialize(); } } diff --git a/src/scene/assetmanager.cpp b/src/scene/assetmanager.cpp index 6bc58caa48..418ff1e5fa 100644 --- a/src/scene/assetmanager.cpp +++ b/src/scene/assetmanager.cpp @@ -320,6 +320,15 @@ std::vector AssetManager::allAssets() const { return res; } +std::vector AssetManager::rootAssets() const { + std::vector res; + res.reserve(_rootAssets.size()); + for (Asset* asset : _rootAssets) { + res.push_back(asset); + } + return res; +} + std::vector AssetManager::allSynchronizations() const { std::vector res; res.reserve(_synchronizations.size()); @@ -331,6 +340,11 @@ std::vector AssetManager::allSynchronizations() return res; } +bool AssetManager::isRootAsset(const Asset* asset) const { + auto it = std::find(_rootAssets.begin(), _rootAssets.end(), asset); + return it != _rootAssets.end(); +} + bool AssetManager::loadAsset(Asset* asset, Asset* parent) { ghoul_precondition(asset, "Asset must not be nullptr"); @@ -941,8 +955,10 @@ scripting::LuaLibrary AssetManager::luaLibrary() { { codegen::lua::Add, codegen::lua::Remove, + codegen::lua::RemoveAll, codegen::lua::IsLoaded, - codegen::lua::AllAssets + codegen::lua::AllAssets, + codegen::lua::RootAssets } }; } diff --git a/src/scene/assetmanager_lua.inl b/src/scene/assetmanager_lua.inl index 6a56192b38..d3a7e181ca 100644 --- a/src/scene/assetmanager_lua.inl +++ b/src/scene/assetmanager_lua.inl @@ -41,6 +41,18 @@ namespace { openspace::global::openSpaceEngine->assetManager().remove(assetName); } +/** + * Removes all assets that are currently loaded + */ +[[codegen::luawrap]] void removeAll() { + using namespace openspace; + std::vector as = global::openSpaceEngine->assetManager().rootAssets(); + std::reverse(as.begin(), as.end()); + for (const Asset* asset : as) { + global::openSpaceEngine->assetManager().remove(asset->path().string()); + } +} + /** * Returns true if the referenced asset already has been loaded. Otherwise false is * returned. The parameter to this function is the path of the asset that should be @@ -72,6 +84,21 @@ namespace { return res; } +/** + * Returns the paths to all loaded root assets, which are assets that are loaded directly + * either through a profile or by calling the `openspace.asset.add` method. + */ +[[codegen::luawrap]] std::vector rootAssets() { + using namespace openspace; + std::vector as = global::openSpaceEngine->assetManager().rootAssets(); + std::vector res; + res.reserve(as.size()); + for (const Asset* a : as) { + res.push_back(a->path().string()); + } + return res; +} + #include "assetmanager_lua_codegen.cpp" } // namespace From 1593ab50aa69363b77377ca048b9811251d5845a Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 3 Aug 2023 18:55:54 +0200 Subject: [PATCH 069/701] Rename TileLayer to TileProvider classes (closes #2767). Breaking change in assets that load Layers: - DefaultTileLayer -> DefaultTileProvider - SingleImageTileLayer -> SingleImageProvider - ImageSequenceTileLayer -> ImageSequenceTileProvider - SpoutImageTileLayer -> SpoutImageProvider - TemporalTileLayer -> TemporalTileProvider - TileIndexTileLayer -> TileIndexTileProvider - SizeReferenceTileLayer -> SizeReferenceTileProvider - ByLevelTileLayer -> TileProviderByLevel - ByIndexTileLayer -> TileProviderByIndex --- .../examples/temperature_land_highres.asset | 4 +- ...om_w1_sea_ice_concentration_temporal.asset | 2 +- .../colorlayers/aqua_modis_temporal.asset | 2 +- .../colorlayers/esri_noaa20_combo.asset | 4 +- .../layers/colorlayers/esri_viirs_combo.asset | 4 +- ...mur_sea_surface_temperature_temporal.asset | 2 +- .../modis_terra_chlorophyll_a_temporal.asset | 2 +- .../colorlayers/terra_modis_temporal.asset | 2 +- .../colorlayers/terra_texture_spout.asset | 2 +- .../colorlayers/viirs_noaa20_temporal.asset | 2 +- .../colorlayers/viirs_snpp_temporal.asset | 2 +- .../nightlayers/earth_at_night_temporal.asset | 2 +- .../earth_at_night_temporal_blue_yellow.asset | 2 +- .../layers/overlays/size_reference.asset | 2 +- .../earth/layers/overlays/tile_indices.asset | 2 +- .../moon/layers/overlays/size_reference.asset | 2 +- .../moon/layers/overlays/tile_indices.asset | 2 +- .../atmosphere/2000_carbon_monoxide.asset | 2 +- .../atmosphere/2004_ir_hurricane.asset | 2 +- .../atmosphere/2005_hurricane-grayir.asset | 2 +- .../atmosphere/2005_hurricane-wvsst.asset | 2 +- .../noaa-sos/atmosphere/2012_hurricane.asset | 4 +- .../atmosphere/aerosol_blackcarbon.asset | 2 +- .../aerosol_blackcarbon_and_sulfate.asset | 2 +- .../noaa-sos/atmosphere/aerosol_sulfate.asset | 2 +- .../noaa-sos/atmosphere/airtraffic.asset | 2 +- .../earth/noaa-sos/atmosphere/all_sats.asset | 2 +- .../noaa-sos/atmosphere/aqua_swath.asset | 2 +- .../noaa-sos/atmosphere/carbonflux.asset | 2 +- .../carbontracker_2000_2100-fixed_scale.asset | 4 +- ...arbontracker_2000_2100-sliding_scale.asset | 4 +- .../earth/noaa-sos/atmosphere/co_gmd.asset | 2 +- .../earth/noaa-sos/atmosphere/fim_chem.asset | 2 +- .../noaa-sos/atmosphere/fossil_fuel.asset | 2 +- .../earth/noaa-sos/atmosphere/fukushima.asset | 2 +- .../earth/noaa-sos/atmosphere/geo_sat.asset | 2 +- .../earth/noaa-sos/atmosphere/geo_scan.asset | 2 +- .../noaa-sos/atmosphere/giss_temp_anom.asset | 2 +- .../atmosphere/globe-insolation.asset | 2 +- .../noaa-sos/atmosphere/globe-rainfall.asset | 2 +- .../atmosphere/harvey-clouds_precip.asset | 2 +- .../atmosphere/hurricane_season_2017.asset | 2 +- .../hurricane_season_2017_wvsst.asset | 2 +- .../earth/noaa-sos/atmosphere/isaac.asset | 4 +- .../earth/noaa-sos/atmosphere/land_temp.asset | 2 +- .../noaa-sos/atmosphere/ltg_vaisala.asset | 2 +- .../earth/noaa-sos/atmosphere/nasa_sats.asset | 2 +- .../atmosphere/nccs_models-carbon.asset | 2 +- .../atmosphere/nccs_models-chem.asset | 2 +- .../atmosphere/nccs_models-winds.asset | 2 +- .../earth/noaa-sos/atmosphere/no2_omsi.asset | 2 +- .../earth/noaa-sos/atmosphere/pclim.asset | 2 +- .../earth/noaa-sos/atmosphere/poes_sat.asset | 2 +- .../atmosphere/reanalysis-antarctic.asset | 2 +- .../atmosphere/reanalysis-elnino.asset | 2 +- .../atmosphere/reanalysis-hurricane.asset | 2 +- .../earth/noaa-sos/atmosphere/sandy.asset | 2 +- .../noaa-sos/atmosphere/sunsync_sat.asset | 2 +- .../earth/noaa-sos/atmosphere/temp_anom.asset | 2 +- .../atmosphere/typhoon_haiyan-wvsst.asset | 2 +- .../noaa-sos/atmosphere/typhoon_haiyan.asset | 2 +- .../noaa-sos/atmosphere/volcano_ash.asset | 2 +- .../planets/earth/noaa-sos/land/birds.asset | 2 +- .../land/blue_marble-blue_marble_topo.asset | 2 +- .../blue_marble-blue_marble_topo_bathy.asset | 2 +- .../land/blue_marble-nightlights.asset | 2 +- .../blue_marble-seasonal_blue_marble.asset | 2 +- .../earth/noaa-sos/land/dams-global.asset | 2 +- .../noaa-sos/land/dams-mississippi.asset | 2 +- .../earth/noaa-sos/land/dams-yangtze.asset | 2 +- .../noaa-sos/land/day_night-06z_only.asset | 2 +- .../noaa-sos/land/day_night-full_year.asset | 2 +- .../noaa-sos/land/day_night-oneday.asset | 2 +- .../land/earthquake-1980_1995_quakes.asset | 2 +- .../land/earthquakes_and_eruptions.asset | 2 +- .../earths_magnetism_magnetic_lines.asset | 2 +- .../land/earths_magnetism_magnets.asset | 2 +- .../planets/earth/noaa-sos/land/fire.asset | 2 +- .../earth/noaa-sos/land/fire_veg.asset | 2 +- .../noaa-sos/land/global_vegetation.asset | 2 +- .../earth/noaa-sos/land/hot_topo.asset | 2 +- .../noaa-sos/land/irsat_nightlights.asset | 2 +- .../earth/noaa-sos/land/japan_quake.asset | 2 +- .../koppen_climate-koppen_1901_2100.asset | 2 +- .../noaa-sos/land/land_cover-animation.asset | 2 +- .../earth/noaa-sos/land/land_ratio.asset | 2 +- .../noaa-sos/land/magnetic_declination.asset | 2 +- .../noaa-sos/land/nuclear_earthquake.asset | 2 +- .../earth/noaa-sos/land/plate_movement.asset | 2 +- .../noaa-sos/land/river_discharge_2010.asset | 2 +- .../land/seismic_waves-1994northridge.asset | 2 +- .../noaa-sos/land/surface_temperature.asset | 2 +- .../earth/noaa-sos/models/bm10000.asset | 2 +- .../earth/noaa-sos/models/gfdl_seaice.asset | 2 +- .../noaa-sos/models/ipcc_temp-ccsm-a1b.asset | 2 +- .../noaa-sos/models/ipcc_temp-ccsm-b1.asset | 2 +- .../noaa-sos/models/ipcc_temp-gfdl-a1b.asset | 2 +- .../noaa-sos/models/ipcc_temp-gfdl-b1.asset | 2 +- .../noaa-sos/models/ipcc_temp-had-a1b.asset | 2 +- .../noaa-sos/models/ipcc_temp-had-b1.asset | 2 +- .../earth/noaa-sos/models/rcp-ga26.asset | 2 +- .../earth/noaa-sos/models/rcp-ga45.asset | 2 +- .../earth/noaa-sos/models/rcp-ga60.asset | 2 +- .../earth/noaa-sos/models/rcp-ga85.asset | 2 +- .../earth/noaa-sos/models/ukmet-a1b.asset | 2 +- .../earth/noaa-sos/models/ukmet-e1.asset | 2 +- .../noaa-sos/oceans/2009_ice_animation.asset | 2 +- .../noaa-sos/oceans/animal_tracking.asset | 2 +- .../noaa-sos/oceans/argo_buoy_tracks.asset | 2 +- .../noaa-sos/oceans/argo_buoy_waterfall.asset | 2 +- .../earth/noaa-sos/oceans/atl_turtle.asset | 2 +- .../noaa-sos/oceans/chlorophyll_model.asset | 2 +- .../noaa-sos/oceans/ecco2_sst-gray_land.asset | 2 +- .../noaa-sos/oceans/ecco2_sst-veg_land.asset | 2 +- .../oceans/gfdl_sst-black_background.asset | 2 +- .../oceans/gfdl_sst-land_background.asset | 2 +- .../noaa-sos/oceans/greenland_melt.asset | 2 +- .../noaa-sos/oceans/japan_tsunami_waves.asset | 2 +- .../oceans/loggerheadseaturtletracks.asset | 2 +- .../oceans/mexico_turtles_947293.asset | 2 +- .../oceans/mexico_turtles_958002.asset | 2 +- .../earth/noaa-sos/oceans/modis_sst.asset | 2 +- .../earth/noaa-sos/oceans/nasa_speed.asset | 2 +- .../earth/noaa-sos/oceans/nasa_sst.asset | 2 +- .../noaa-sos/oceans/ocean_acid-co2_flux.asset | 2 +- .../earth/noaa-sos/oceans/ocean_acid-ph.asset | 2 +- .../oceans/ocean_acid-saturation.asset | 2 +- .../noaa-sos/oceans/ocean_depths_temp.asset | 4 +- .../noaa-sos/oceans/ocean_drain-gray.asset | 2 +- .../earth/noaa-sos/oceans/pac_turtle.asset | 2 +- .../earth/noaa-sos/oceans/phytoplankton.asset | 2 +- .../earth/noaa-sos/oceans/pr_tsunami.asset | 2 +- .../earth/noaa-sos/oceans/sea_level.asset | 2 +- .../oceans/sea_surface_height_anomaly.asset | 2 +- .../noaa-sos/oceans/seaice_monthly.asset | 2 +- .../oceans/seawifs-land_background.asset | 2 +- .../noaa-sos/oceans/seawifs-no_holes.asset | 2 +- .../noaa-sos/oceans/seawifs-polar_holes.asset | 2 +- .../planets/earth/noaa-sos/oceans/shark.asset | 2 +- .../planets/earth/noaa-sos/oceans/sss.asset | 2 +- .../earth/noaa-sos/oceans/sst_1980_1999.asset | 2 +- .../earth/noaa-sos/oceans/vector_winds.asset | 2 +- .../oceans/vent_discoveries_animation.asset | 2 +- .../earth/noaa-sos/oceans/vorticity.asset | 2 +- .../oceans/waves-wave_height_2012.asset | 2 +- .../oceans/waves-wave_height_katrina.asset | 2 +- .../oceans/waves-wave_height_sandy.asset | 2 +- .../oceans/waves-wave_power_2012.asset | 2 +- .../oceans/weeklyseaice-10day_seaice.asset | 2 +- .../oceans/weeklyseaice-sept_seaice.asset | 2 +- .../mars/layers/overlays/indices.asset | 2 +- .../mars/layers/overlays/size_reference.asset | 2 +- .../colorlayers/clouds_magellan_combo.asset | 2 +- .../clouds_magellan_combo_newyork.asset | 2 +- modules/globebrowsing/globebrowsingmodule.cpp | 18 ++--- .../shaders/texturetilemapping.glsl | 18 ++--- modules/globebrowsing/src/gpulayergroup.cpp | 40 +++++----- modules/globebrowsing/src/layer.cpp | 73 ++++++++++--------- modules/globebrowsing/src/layergroupid.h | 60 +++++++-------- .../src/tileprovider/tileproviderbyindex.cpp | 4 +- .../src/tileprovider/tileproviderbylevel.cpp | 2 +- modules/video/videomodule.cpp | 2 +- 162 files changed, 271 insertions(+), 270 deletions(-) diff --git a/data/assets/examples/temperature_land_highres.asset b/data/assets/examples/temperature_land_highres.asset index 5fbe0db6e5..75217b70df 100644 --- a/data/assets/examples/temperature_land_highres.asset +++ b/data/assets/examples/temperature_land_highres.asset @@ -13,7 +13,7 @@ local path = asset.syncedResource({ local LayerPrototype = { Identifier = "ERA5_Land_HighRes_Monthly_2M_Temperature_Temporal_prototype", Name = "ERA5 Land HighRes Monthly 2M Temperature (Temporal) [Prototype]", - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Prototyped", Prototyped = { Time = { @@ -32,7 +32,7 @@ local LayerPrototype = { local LayerFolder = { Identifier = "ERA5_Land_HighRes_Monthly_2M_Temperature_Temporal_folder", Name = "ERA5 Land HighRes Monthly 2M Temperature (Temporal) [Folder]", - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = path, diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/amsr2_gcom_w1_sea_ice_concentration_temporal.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/amsr2_gcom_w1_sea_ice_concentration_temporal.asset index 1eccf39e08..5a41542027 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/amsr2_gcom_w1_sea_ice_concentration_temporal.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/amsr2_gcom_w1_sea_ice_concentration_temporal.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "AMSR2_GCOM_W1_Sea_Ice_Concentration_Temporal", Name = "AMSR2 GCOM W1 Sea Ice Concentration (Temporal)", Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Prototyped", Prototyped = { Time = { diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/aqua_modis_temporal.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/aqua_modis_temporal.asset index 10cc8fa385..b175332afd 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/aqua_modis_temporal.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/aqua_modis_temporal.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Aqua_Modis_Temporal", Name = "Aqua Modis (Temporal)", Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Prototyped", Prototyped = { Time = { diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_noaa20_combo.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_noaa20_combo.asset index 6ab7e6c7e6..82dbdcf012 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_noaa20_combo.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_noaa20_combo.asset @@ -6,14 +6,14 @@ local Layer = { Identifier = "ESRI_NOAA20_Combo", Name = "ESRI NOAA20 Combo", Enabled = asset.enabled, - Type = "ByLevelTileLayer", + Type = "TileProviderByLevel", LevelTileProviders = { { MaxLevel = 4, TileProvider = { Identifier = "Temporal_VIIRS_NOAA20", Name = "Temporal VIIRS NOAA20", - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Prototyped", Prototyped = { Time = { diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_viirs_combo.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_viirs_combo.asset index 8a3bb8da0a..4449baadd4 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_viirs_combo.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_viirs_combo.asset @@ -6,14 +6,14 @@ local Layer = { Identifier = "ESRI_VIIRS_Combo", Name = "ESRI VIIRS Combo", Enabled = asset.enabled, - Type = "ByLevelTileLayer", + Type = "TileProviderByLevel", LevelTileProviders = { { MaxLevel = 4, TileProvider = { Identifier = "Temporal_VIIRS_SNPP", Name = "Temporal VIIRS SNPP", - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Prototyped", Prototyped = { Time = { diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/ghrsst_l4_mur_sea_surface_temperature_temporal.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/ghrsst_l4_mur_sea_surface_temperature_temporal.asset index fc016ab893..19212a0627 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/ghrsst_l4_mur_sea_surface_temperature_temporal.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/ghrsst_l4_mur_sea_surface_temperature_temporal.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "GHRSST_L4_MUR_Sea_Surface_Temperature_Temporal", Name = "GHRSST L4 MUR Sea Surface Temperature (Temporal)", Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Prototyped", Prototyped = { Time = { diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/modis_terra_chlorophyll_a_temporal.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/modis_terra_chlorophyll_a_temporal.asset index 12dcbb3d36..dda1ca392f 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/modis_terra_chlorophyll_a_temporal.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/modis_terra_chlorophyll_a_temporal.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "MODIS_Terra_Chlorophyll_A_Temporal", Name = "MODIS Terra Chlorophyll A (Temporal)", Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Prototyped", Prototyped = { Time = { diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/terra_modis_temporal.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/terra_modis_temporal.asset index d58a03a00b..7d268390f8 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/terra_modis_temporal.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/terra_modis_temporal.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Terra_Modis_Temporal", Name = "Terra Modis (Temporal)", Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Prototyped", Prototyped = { Time = { diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/terra_texture_spout.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/terra_texture_spout.asset index 7f83b74402..1fa4595d02 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/terra_texture_spout.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/terra_texture_spout.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "TextureSpout", Enabled = asset.enabled, SpoutName = "SPOUT_TERRA_RECEIVER", - Type = "SpoutImageTileLayer" + Type = "SpoutImageProvider" } diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/viirs_noaa20_temporal.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/viirs_noaa20_temporal.asset index 4798202aa7..49f87efd0c 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/viirs_noaa20_temporal.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/viirs_noaa20_temporal.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "VIIRS_NOAA20_Temporal", Name = "VIIRS NOAA20 (Temporal)", Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Prototyped", Prototyped = { Time = { diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/viirs_snpp_temporal.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/viirs_snpp_temporal.asset index 81209d74a8..d6aebe676d 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/viirs_snpp_temporal.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/viirs_snpp_temporal.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "VIIRS_SNPP_Temporal", Name = "VIIRS SNPP (Temporal)", Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Prototyped", Prototyped = { Time = { diff --git a/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_at_night_temporal.asset b/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_at_night_temporal.asset index cec806e322..db35ca1dc2 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_at_night_temporal.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_at_night_temporal.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Earth_at_Night_Temporal", Name = "Earth at Night (Temporal)", Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Prototyped", Prototyped = { Time = { diff --git a/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_at_night_temporal_blue_yellow.asset b/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_at_night_temporal_blue_yellow.asset index 0f017472f1..d53e454119 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_at_night_temporal_blue_yellow.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_at_night_temporal_blue_yellow.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Earth_at_Night_Temporal_Blue_Yellow", Name = "Earth at Night Blue Yellow (Temporal)", Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Prototyped", Prototyped = { Time = { diff --git a/data/assets/scene/solarsystem/planets/earth/layers/overlays/size_reference.asset b/data/assets/scene/solarsystem/planets/earth/layers/overlays/size_reference.asset index 5f6e75648b..4e3f0b46b8 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/overlays/size_reference.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/overlays/size_reference.asset @@ -6,7 +6,7 @@ local Layer ={ Identifier = "Size_Reference", Name = "Size Reference", Enabled = asset.enabled, - Type = "SizeReferenceTileLayer", + Type = "SizeReferenceTileProvider", Radii = globe.Earth.Renderable.Radii } diff --git a/data/assets/scene/solarsystem/planets/earth/layers/overlays/tile_indices.asset b/data/assets/scene/solarsystem/planets/earth/layers/overlays/tile_indices.asset index 83acd1c8dd..b61a0713f2 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/overlays/tile_indices.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/overlays/tile_indices.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Tile_Indices", Name = "Tile Indices", Enabled = asset.enabled, - Type = "TileIndexTileLayer" + Type = "TileIndexTileProvider" } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/overlays/size_reference.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/overlays/size_reference.asset index 684ffeb1fc..71193ff4cb 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/overlays/size_reference.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/overlays/size_reference.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Size_Reference", Name = "Size Reference", Enabled = asset.enabled, - Type = "SizeReferenceTileLayer", + Type = "SizeReferenceTileProvider", Radii = globe.Moon.Renderable.Radii } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/overlays/tile_indices.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/overlays/tile_indices.asset index b1edc92ce2..ec88eb72fe 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/overlays/tile_indices.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/overlays/tile_indices.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Tile_Indices", Name = "Tile Indices", Enabled = asset.enabled, - Type = "TileIndexTileLayer" + Type = "TileIndexTileProvider" } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2000_carbon_monoxide.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2000_carbon_monoxide.asset index e75087f08e..e627c703e4 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2000_carbon_monoxide.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2000_carbon_monoxide.asset @@ -29,7 +29,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "1024", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2004_ir_hurricane.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2004_ir_hurricane.asset index 9fc8d2bd1d..b7c88a2d5e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2004_ir_hurricane.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2004_ir_hurricane.asset @@ -29,7 +29,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "2048", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2005_hurricane-grayir.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2005_hurricane-grayir.asset index 8a9924cb22..22d4c3ffa4 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2005_hurricane-grayir.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2005_hurricane-grayir.asset @@ -26,7 +26,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "images", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2005_hurricane-wvsst.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2005_hurricane-wvsst.asset index bad7dcadac..b904040628 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2005_hurricane-wvsst.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2005_hurricane-wvsst.asset @@ -25,7 +25,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "2048", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2012_hurricane.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2012_hurricane.asset index e7c2bfcfe1..3d1c11732e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2012_hurricane.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2012_hurricane.asset @@ -33,7 +33,7 @@ local satDestination = syncedDirectory .. "sat" local LayerNames = { Identifier = Identifier .. "-names", Name = Name .. " (Names)", - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = namesDestination, Description = Description } @@ -41,7 +41,7 @@ local LayerNames = { local LayerSat = { Identifier = Identifier .. "-sat", Name = Name .. " (Satellites)", - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = satDestination, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_blackcarbon.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_blackcarbon.asset index 091cc58877..46d0b31305 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_blackcarbon.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_blackcarbon.asset @@ -33,7 +33,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048_png", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_blackcarbon_and_sulfate.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_blackcarbon_and_sulfate.asset index 73802bd770..635dd828d8 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_blackcarbon_and_sulfate.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_blackcarbon_and_sulfate.asset @@ -33,7 +33,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048_png", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_sulfate.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_sulfate.asset index 80348b6bd3..68f8a0bd14 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_sulfate.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_sulfate.asset @@ -33,7 +33,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048_png", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/airtraffic.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/airtraffic.asset index cca34ed3ed..fcddb6a034 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/airtraffic.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/airtraffic.asset @@ -29,7 +29,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "images", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/all_sats.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/all_sats.asset index e2b6d6eebb..7a1467473a 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/all_sats.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/all_sats.asset @@ -33,7 +33,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aqua_swath.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aqua_swath.asset index bdcca74f10..f272694ac0 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aqua_swath.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aqua_swath.asset @@ -33,7 +33,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "images", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbonflux.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbonflux.asset index 6e8b16bab4..1f9b8a1bb3 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbonflux.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbonflux.asset @@ -31,7 +31,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2160", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbontracker_2000_2100-fixed_scale.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbontracker_2000_2100-fixed_scale.asset index 4d118bcc3f..f56bd621f2 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbontracker_2000_2100-fixed_scale.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbontracker_2000_2100-fixed_scale.asset @@ -34,7 +34,7 @@ local colorbarDestination = syncedDirectory .. "colorbar" local LayerField = { Identifier = Identifier .. "-field", Name = Name .. " (Field)", - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = fieldDestination, @@ -48,7 +48,7 @@ local LayerField = { local LayerObs = { Identifier = Identifier .. "-obs", Name = Name .. " (Observed)", - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = obsDestination, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbontracker_2000_2100-sliding_scale.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbontracker_2000_2100-sliding_scale.asset index 3f2c8eea71..d63b070c1b 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbontracker_2000_2100-sliding_scale.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbontracker_2000_2100-sliding_scale.asset @@ -33,7 +33,7 @@ local colorbarDestination = syncedDirectory .. "colorbar" local LayerField = { Identifier = Identifier .. "-field", Name = Name .. " (Field)", - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = fieldDestination, @@ -47,7 +47,7 @@ local LayerField = { local LayerObs = { Identifier = Identifier .. "-obs", Name = Name .. " (Observed)", - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = obsDestination, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/co_gmd.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/co_gmd.asset index b8e4372857..d65682d582 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/co_gmd.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/co_gmd.asset @@ -33,7 +33,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "images", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fim_chem.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fim_chem.asset index 6549bbb405..a8d9eaa785 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fim_chem.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fim_chem.asset @@ -28,7 +28,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "composite", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fossil_fuel.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fossil_fuel.asset index 5d47783d20..340d39938a 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fossil_fuel.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fossil_fuel.asset @@ -35,7 +35,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "3100", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fukushima.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fukushima.asset index 1f50cb2727..5745f85178 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fukushima.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fukushima.asset @@ -27,7 +27,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2054", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/geo_sat.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/geo_sat.asset index 13b6159c0f..c1b307452d 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/geo_sat.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/geo_sat.asset @@ -31,7 +31,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/geo_scan.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/geo_scan.asset index a8208b645a..ea7f80eaa2 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/geo_scan.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/geo_scan.asset @@ -31,7 +31,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/giss_temp_anom.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/giss_temp_anom.asset index 4952fdefae..93c0bb28bb 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/giss_temp_anom.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/giss_temp_anom.asset @@ -23,7 +23,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2012", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/globe-insolation.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/globe-insolation.asset index 30b837be1b..169c523ede 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/globe-insolation.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/globe-insolation.asset @@ -27,7 +27,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "1440", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/globe-rainfall.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/globe-rainfall.asset index 2c7ee2c672..8ad3926164 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/globe-rainfall.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/globe-rainfall.asset @@ -27,7 +27,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "1440", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/harvey-clouds_precip.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/harvey-clouds_precip.asset index ccbb01db89..c41747a256 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/harvey-clouds_precip.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/harvey-clouds_precip.asset @@ -27,7 +27,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_season_2017.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_season_2017.asset index 5249aa670f..c380649be9 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_season_2017.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_season_2017.asset @@ -31,7 +31,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "images", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_season_2017_wvsst.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_season_2017_wvsst.asset index 111508eead..b1aba5e1e8 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_season_2017_wvsst.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_season_2017_wvsst.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "2048", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/isaac.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/isaac.asset index 455d2b7101..19782cbd5a 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/isaac.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/isaac.asset @@ -30,7 +30,7 @@ local satDestination = syncedDirectory .. "sat" local LayerRadar = { Identifier = Identifier .. "-radar", Name = Name .. " (Radar)", - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = radarDestination, @@ -44,7 +44,7 @@ local LayerRadar = { local LayerSat = { Identifier = Identifier .. "-sat", Name = Name .. " (Sat)", - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = satDestination, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/land_temp.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/land_temp.asset index 65d92b1c53..a592db0723 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/land_temp.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/land_temp.asset @@ -27,7 +27,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/ltg_vaisala.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/ltg_vaisala.asset index 15644f0bca..9b7feb1d1f 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/ltg_vaisala.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/ltg_vaisala.asset @@ -32,7 +32,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "2160", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nasa_sats.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nasa_sats.asset index b8b001f2d0..43bf62187a 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nasa_sats.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nasa_sats.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-carbon.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-carbon.asset index 8855568da7..d059ba1cd8 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-carbon.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-carbon.asset @@ -27,7 +27,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-chem.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-chem.asset index ed13bc7eec..30ca95c704 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-chem.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-chem.asset @@ -28,7 +28,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "images", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-winds.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-winds.asset index 047c59a294..29759ea97c 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-winds.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-winds.asset @@ -28,7 +28,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "images", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/no2_omsi.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/no2_omsi.asset index 74950f8713..6cdf0ac2b7 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/no2_omsi.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/no2_omsi.asset @@ -28,7 +28,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "2880", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/pclim.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/pclim.asset index d80064cdda..ad471808da 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/pclim.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/pclim.asset @@ -25,7 +25,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "raw", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/poes_sat.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/poes_sat.asset index 3a1beb5dd7..ca3c100c52 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/poes_sat.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/poes_sat.asset @@ -28,7 +28,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "2048", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-antarctic.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-antarctic.asset index 0682f6b83a..396092394f 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-antarctic.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-antarctic.asset @@ -39,7 +39,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-elnino.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-elnino.asset index 8f9b8a3acf..dd23e40a4f 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-elnino.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-elnino.asset @@ -39,7 +39,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-hurricane.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-hurricane.asset index c3b0e5ce21..8e591c95fe 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-hurricane.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-hurricane.asset @@ -39,7 +39,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048_png", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/sandy.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/sandy.asset index 191563f601..2b02f27780 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/sandy.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/sandy.asset @@ -23,7 +23,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/sunsync_sat.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/sunsync_sat.asset index 2c45958d75..4d0494246b 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/sunsync_sat.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/sunsync_sat.asset @@ -28,7 +28,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "2048", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/temp_anom.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/temp_anom.asset index e7455f18da..490c0d6d37 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/temp_anom.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/temp_anom.asset @@ -31,7 +31,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096_new", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/typhoon_haiyan-wvsst.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/typhoon_haiyan-wvsst.asset index fbbbd6af65..6ffe5657f2 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/typhoon_haiyan-wvsst.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/typhoon_haiyan-wvsst.asset @@ -25,7 +25,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/typhoon_haiyan.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/typhoon_haiyan.asset index 1cdff01fa8..0f6f98766e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/typhoon_haiyan.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/typhoon_haiyan.asset @@ -25,7 +25,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "2048", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/volcano_ash.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/volcano_ash.asset index 7529963294..2fef56cbb0 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/volcano_ash.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/volcano_ash.asset @@ -31,7 +31,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2992", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/birds.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/birds.asset index 8b42aa16b3..14823d0289 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/birds.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/birds.asset @@ -26,7 +26,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "birds", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble_topo.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble_topo.asset index e6c3b197bf..b18ff1a6f0 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble_topo.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble_topo.asset @@ -26,7 +26,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "5400", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble_topo_bathy.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble_topo_bathy.asset index 966f8ca018..3c12994ae2 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble_topo_bathy.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble_topo_bathy.asset @@ -26,7 +26,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "5400", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-nightlights.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-nightlights.asset index 2756a119e3..d9881cd218 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-nightlights.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-nightlights.asset @@ -33,7 +33,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "images", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-seasonal_blue_marble.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-seasonal_blue_marble.asset index fcfa08d84a..1ed2f90abc 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-seasonal_blue_marble.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-seasonal_blue_marble.asset @@ -27,7 +27,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-global.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-global.asset index ab5686d954..7dadc485b7 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-global.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-global.asset @@ -24,7 +24,7 @@ local syncedDirectory = asset.syncedResource({ local Layer = { Identifier = Identifier, Name = Name, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-mississippi.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-mississippi.asset index 8e0a677ce0..02c0b651ef 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-mississippi.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-mississippi.asset @@ -25,7 +25,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-yangtze.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-yangtze.asset index 1a272bc7ef..9e1b70a16b 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-yangtze.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-yangtze.asset @@ -25,7 +25,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-06z_only.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-06z_only.asset index 62832a4efa..7dff94800c 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-06z_only.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-06z_only.asset @@ -27,7 +27,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "2048", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-full_year.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-full_year.asset index c52b4ebcb8..f6c7b80fa5 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-full_year.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-full_year.asset @@ -28,7 +28,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "images", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-oneday.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-oneday.asset index 00e7952031..8e5a5136fc 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-oneday.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-oneday.asset @@ -26,7 +26,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquake-1980_1995_quakes.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquake-1980_1995_quakes.asset index b84996ad10..4414257e03 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquake-1980_1995_quakes.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquake-1980_1995_quakes.asset @@ -34,7 +34,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "1024", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquakes_and_eruptions.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquakes_and_eruptions.asset index 365c23f778..8341231db6 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquakes_and_eruptions.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquakes_and_eruptions.asset @@ -27,7 +27,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earths_magnetism_magnetic_lines.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earths_magnetism_magnetic_lines.asset index b29f26799c..c844a389e5 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earths_magnetism_magnetic_lines.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earths_magnetism_magnetic_lines.asset @@ -32,7 +32,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earths_magnetism_magnets.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earths_magnetism_magnets.asset index 8846b8617d..359e6060ca 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earths_magnetism_magnets.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earths_magnetism_magnets.asset @@ -32,7 +32,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/fire.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/fire.asset index 6f0fb0148c..0e5c6596a3 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/fire.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/fire.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/fire_veg.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/fire_veg.asset index 1e08cc27fa..33606bda10 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/fire_veg.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/fire_veg.asset @@ -29,7 +29,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/global_vegetation.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/global_vegetation.asset index cff0605334..e690559e05 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/global_vegetation.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/global_vegetation.asset @@ -45,7 +45,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = imagesDestination, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/hot_topo.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/hot_topo.asset index 73f3409ba2..1722b454f5 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/hot_topo.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/hot_topo.asset @@ -34,7 +34,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "images", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/irsat_nightlights.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/irsat_nightlights.asset index a54dfe3f8d..75adb14afb 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/irsat_nightlights.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/irsat_nightlights.asset @@ -27,7 +27,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/japan_quake.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/japan_quake.asset index 728ef25be7..c10f56cd42 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/japan_quake.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/japan_quake.asset @@ -27,7 +27,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/koppen_climate-koppen_1901_2100.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/koppen_climate-koppen_1901_2100.asset index c902c48aa9..d27f83c2aa 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/koppen_climate-koppen_1901_2100.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/koppen_climate-koppen_1901_2100.asset @@ -27,7 +27,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_cover-animation.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_cover-animation.asset index 1274a7f916..d09fc82a7c 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_cover-animation.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_cover-animation.asset @@ -32,7 +32,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "3600", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_ratio.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_ratio.asset index 32a40ad221..8f245c37e8 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_ratio.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_ratio.asset @@ -22,7 +22,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/magnetic_declination.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/magnetic_declination.asset index ae8d56a7d7..39ee251726 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/magnetic_declination.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/magnetic_declination.asset @@ -26,7 +26,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/nuclear_earthquake.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/nuclear_earthquake.asset index 41e56bf74f..86f8b078f3 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/nuclear_earthquake.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/nuclear_earthquake.asset @@ -60,7 +60,7 @@ local LayerNuclear = { local LayerImages = { Identifier = Identifier .. "-images", Name = Name .. " (Images)", - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = imagesDestination, Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/plate_movement.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/plate_movement.asset index 44d933793b..6444d42a3e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/plate_movement.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/plate_movement.asset @@ -34,7 +34,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/river_discharge_2010.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/river_discharge_2010.asset index 7cbfd7b115..46b10fdd5a 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/river_discharge_2010.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/river_discharge_2010.asset @@ -25,7 +25,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/seismic_waves-1994northridge.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/seismic_waves-1994northridge.asset index 56e91232cc..c580a32d93 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/seismic_waves-1994northridge.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/seismic_waves-1994northridge.asset @@ -44,7 +44,7 @@ local LayerStations = { local LayerImages = { Identifier = Identifier .. "-images", Name = Name .. " (Images)", - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = imagesDestination, Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/surface_temperature.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/surface_temperature.asset index f474ee11d5..66a3736839 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/surface_temperature.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/surface_temperature.asset @@ -28,7 +28,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/bm10000.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/bm10000.asset index c6f090b852..e7e97f9b28 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/bm10000.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/bm10000.asset @@ -50,7 +50,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/gfdl_seaice.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/gfdl_seaice.asset index 8f91d3ab72..48d53c5b82 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/gfdl_seaice.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/gfdl_seaice.asset @@ -34,7 +34,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "images", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-ccsm-a1b.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-ccsm-a1b.asset index f089002eab..848febb8f9 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-ccsm-a1b.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-ccsm-a1b.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4095", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-ccsm-b1.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-ccsm-b1.asset index 6f08d18a47..2e1a4f97b0 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-ccsm-b1.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-ccsm-b1.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4095", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-gfdl-a1b.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-gfdl-a1b.asset index 7bc8cf03eb..77775a04bc 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-gfdl-a1b.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-gfdl-a1b.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4095", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-gfdl-b1.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-gfdl-b1.asset index 7d57b7e60a..3363e76a50 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-gfdl-b1.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-gfdl-b1.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4095", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-had-a1b.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-had-a1b.asset index 63f6155941..0969862c73 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-had-a1b.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-had-a1b.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4095", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-had-b1.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-had-b1.asset index 9a0c2fc0db..77b3a7b8ca 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-had-b1.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-had-b1.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4095", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga26.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga26.asset index 9f50f66f96..13902c9a57 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga26.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga26.asset @@ -22,7 +22,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga45.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga45.asset index f8c306561e..3f9ac61d06 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga45.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga45.asset @@ -22,7 +22,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga60.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga60.asset index 40b5bc8ea5..a25f860df7 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga60.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga60.asset @@ -22,7 +22,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga85.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga85.asset index d08173408c..fdbf42c66b 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga85.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga85.asset @@ -22,7 +22,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ukmet-a1b.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ukmet-a1b.asset index e89ebe3083..8384c9f5bd 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ukmet-a1b.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ukmet-a1b.asset @@ -32,7 +32,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "2100", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ukmet-e1.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ukmet-e1.asset index aa01f2247a..593d54ba07 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ukmet-e1.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ukmet-e1.asset @@ -31,7 +31,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "2100", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/2009_ice_animation.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/2009_ice_animation.asset index 2cb6719612..8c19cd9782 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/2009_ice_animation.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/2009_ice_animation.asset @@ -31,7 +31,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/animal_tracking.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/animal_tracking.asset index 1ae81f532a..187f6e42d7 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/animal_tracking.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/animal_tracking.asset @@ -28,7 +28,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/argo_buoy_tracks.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/argo_buoy_tracks.asset index 6e16a28e71..1e18740f11 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/argo_buoy_tracks.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/argo_buoy_tracks.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/argo_buoy_waterfall.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/argo_buoy_waterfall.asset index 66568c8570..81e673f004 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/argo_buoy_waterfall.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/argo_buoy_waterfall.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/atl_turtle.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/atl_turtle.asset index 2deeedd2f5..c2c5499355 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/atl_turtle.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/atl_turtle.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "2048", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/chlorophyll_model.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/chlorophyll_model.asset index 8f9c7bf587..fea17dc984 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/chlorophyll_model.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/chlorophyll_model.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "3232", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ecco2_sst-gray_land.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ecco2_sst-gray_land.asset index 37ad56e6f0..9beda39568 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ecco2_sst-gray_land.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ecco2_sst-gray_land.asset @@ -33,7 +33,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "images", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ecco2_sst-veg_land.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ecco2_sst-veg_land.asset index e8eec99c36..c07834ffd6 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ecco2_sst-veg_land.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ecco2_sst-veg_land.asset @@ -33,7 +33,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "images", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/gfdl_sst-black_background.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/gfdl_sst-black_background.asset index a8b4cac5bc..866a3fb9e0 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/gfdl_sst-black_background.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/gfdl_sst-black_background.asset @@ -27,7 +27,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "images", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/gfdl_sst-land_background.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/gfdl_sst-land_background.asset index 49bc327946..ff77be0d3d 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/gfdl_sst-land_background.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/gfdl_sst-land_background.asset @@ -27,7 +27,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "images", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/greenland_melt.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/greenland_melt.asset index 13e9b5733a..95d515789b 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/greenland_melt.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/greenland_melt.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "2048", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/japan_tsunami_waves.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/japan_tsunami_waves.asset index 111503e0b4..910dbd1868 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/japan_tsunami_waves.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/japan_tsunami_waves.asset @@ -33,7 +33,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/loggerheadseaturtletracks.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/loggerheadseaturtletracks.asset index ff43991c66..daef08d4c6 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/loggerheadseaturtletracks.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/loggerheadseaturtletracks.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/mexico_turtles_947293.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/mexico_turtles_947293.asset index 20eb8a2b80..40b6035177 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/mexico_turtles_947293.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/mexico_turtles_947293.asset @@ -29,7 +29,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "2048", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/mexico_turtles_958002.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/mexico_turtles_958002.asset index 57df62b3b4..edf064cf59 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/mexico_turtles_958002.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/mexico_turtles_958002.asset @@ -29,7 +29,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "2048", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/modis_sst.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/modis_sst.asset index 44f12a17db..caba554a45 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/modis_sst.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/modis_sst.asset @@ -28,7 +28,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/nasa_speed.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/nasa_speed.asset index 5ec4f01cf3..ddb23c4a85 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/nasa_speed.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/nasa_speed.asset @@ -28,7 +28,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4000", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/nasa_sst.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/nasa_sst.asset index f3c37b0358..813324aa22 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/nasa_sst.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/nasa_sst.asset @@ -26,7 +26,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4000", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-co2_flux.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-co2_flux.asset index 8a996a24a2..7ce6e84ed0 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-co2_flux.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-co2_flux.asset @@ -25,7 +25,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "images", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-ph.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-ph.asset index 0f910888ef..855b08afa1 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-ph.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-ph.asset @@ -28,7 +28,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "images", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-saturation.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-saturation.asset index e99b96ee99..7371f28050 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-saturation.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-saturation.asset @@ -33,7 +33,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "images", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_depths_temp.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_depths_temp.asset index 46b62e8f2a..846f34d8dd 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_depths_temp.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_depths_temp.asset @@ -31,7 +31,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = imagesDestination, Description = Description } @@ -40,7 +40,7 @@ local LayerByDepth = { Identifier = Identifier .. "-bydepth", Name = Name .. " (by Depth)", Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = imagesByDepthDestination, Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_drain-gray.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_drain-gray.asset index 22d0d9fc8f..b3c491381a 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_drain-gray.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_drain-gray.asset @@ -26,7 +26,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/pac_turtle.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/pac_turtle.asset index 75041aaea1..f3a36de299 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/pac_turtle.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/pac_turtle.asset @@ -28,7 +28,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "2048", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/phytoplankton.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/phytoplankton.asset index 77f36009ea..6eb6fa12eb 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/phytoplankton.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/phytoplankton.asset @@ -33,7 +33,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "images", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/pr_tsunami.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/pr_tsunami.asset index e4e99ebfe8..5019d5de8f 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/pr_tsunami.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/pr_tsunami.asset @@ -29,7 +29,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_level.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_level.asset index 3275d9f5d9..88749947cc 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_level.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_level.asset @@ -34,7 +34,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4000", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_surface_height_anomaly.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_surface_height_anomaly.asset index aac8596353..fbde95f363 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_surface_height_anomaly.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_surface_height_anomaly.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "images", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seaice_monthly.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seaice_monthly.asset index 71776524d7..6043d8e4ac 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seaice_monthly.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seaice_monthly.asset @@ -28,7 +28,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-land_background.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-land_background.asset index dda7d3718f..993e9e9022 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-land_background.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-land_background.asset @@ -23,7 +23,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-no_holes.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-no_holes.asset index bbb48f8618..c0a0c6082a 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-no_holes.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-no_holes.asset @@ -24,7 +24,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "2048", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-polar_holes.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-polar_holes.asset index bcd447cacb..012ebd28de 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-polar_holes.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-polar_holes.asset @@ -24,7 +24,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4320_png", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/shark.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/shark.asset index 9ca297201e..ca0c3360c4 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/shark.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/shark.asset @@ -29,7 +29,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "2048", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sss.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sss.asset index 8420f0cd6b..0ab1905034 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sss.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sss.asset @@ -27,7 +27,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sst_1980_1999.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sst_1980_1999.asset index 29654f0f29..c8b742970e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sst_1980_1999.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sst_1980_1999.asset @@ -29,7 +29,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vector_winds.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vector_winds.asset index 121737a56c..fa7f73d43f 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vector_winds.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vector_winds.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "images", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vent_discoveries_animation.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vent_discoveries_animation.asset index 11285fea5b..9354c87045 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vent_discoveries_animation.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vent_discoveries_animation.asset @@ -26,7 +26,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "new", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vorticity.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vorticity.asset index d258f60bd7..20a3fb3f8a 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vorticity.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vorticity.asset @@ -27,7 +27,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "frames", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_2012.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_2012.asset index 7aca8b703e..aae1c3c290 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_2012.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_2012.asset @@ -24,7 +24,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_katrina.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_katrina.asset index ff5f904c85..3b9e4435e6 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_katrina.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_katrina.asset @@ -26,7 +26,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_sandy.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_sandy.asset index bbb7b24e8c..174650547f 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_sandy.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_sandy.asset @@ -26,7 +26,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_power_2012.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_power_2012.asset index bd07070dc0..c1fbc68467 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_power_2012.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_power_2012.asset @@ -24,7 +24,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "ImageSequenceTileLayer", + Type = "ImageSequenceTileProvider", FolderPath = syncedDirectory .. "4096", Description = Description } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/weeklyseaice-10day_seaice.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/weeklyseaice-10day_seaice.asset index 9ffd591f30..6d5533fd1a 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/weeklyseaice-10day_seaice.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/weeklyseaice-10day_seaice.asset @@ -30,7 +30,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096_png", diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/weeklyseaice-sept_seaice.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/weeklyseaice-sept_seaice.asset index b4e006454e..b299b2de26 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/weeklyseaice-sept_seaice.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/weeklyseaice-sept_seaice.asset @@ -38,7 +38,7 @@ local Layer = { Identifier = Identifier, Name = Name, Enabled = asset.enabled, - Type = "TemporalTileLayer", + Type = "TemporalTileProvider", Mode = "Folder", Folder = { Folder = syncedDirectory .. "4096", diff --git a/data/assets/scene/solarsystem/planets/mars/layers/overlays/indices.asset b/data/assets/scene/solarsystem/planets/mars/layers/overlays/indices.asset index eba0ee9243..9b0e288b66 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/overlays/indices.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/overlays/indices.asset @@ -4,7 +4,7 @@ local globe = asset.require("../../mars") local Layer = { Identifier = "Indices", - Type = "TileIndexTileLayer", + Type = "TileIndexTileProvider", Enabled = asset.enabled } diff --git a/data/assets/scene/solarsystem/planets/mars/layers/overlays/size_reference.asset b/data/assets/scene/solarsystem/planets/mars/layers/overlays/size_reference.asset index 179cf96cee..ae7e657a10 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/overlays/size_reference.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/overlays/size_reference.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Size_Reference", Name = "Size Reference", Enabled = asset.enabled, - Type = "SizeReferenceTileLayer", + Type = "SizeReferenceTileProvider", Radii = globe.Mars.Renderable.Radii } diff --git a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo.asset b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo.asset index 74d459010f..504cdfad08 100644 --- a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo.asset +++ b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo.asset @@ -14,7 +14,7 @@ local Layer = { Identifier = "Clouds_Magellan_Combo", Name = "Clouds Magellan Combo", Enabled = asset.enabled, - Type = "ByLevelTileLayer", + Type = "TileProviderByLevel", LevelTileProviders = { { MaxLevel = 4, diff --git a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo_newyork.asset b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo_newyork.asset index 87477b880b..172fee7f3a 100644 --- a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo_newyork.asset +++ b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo_newyork.asset @@ -14,7 +14,7 @@ local Layer = { Identifier = "Clouds_Magellan_Combo_NewYork", Name = "Clouds Magellan Combo [New York]", Enabled = asset.enabled, - Type = "ByLevelTileLayer", + Type = "TileProviderByLevel", LevelTileProviders = { { MaxLevel = 4, diff --git a/modules/globebrowsing/globebrowsingmodule.cpp b/modules/globebrowsing/globebrowsingmodule.cpp index 5850ce5b0c..cbfb1b10c7 100644 --- a/modules/globebrowsing/globebrowsingmodule.cpp +++ b/modules/globebrowsing/globebrowsingmodule.cpp @@ -302,15 +302,15 @@ void GlobeBrowsingModule::internalInitialize(const ghoul::Dictionary& dict) { ghoul_assert(fTileProvider, "TileProvider factory was not created"); - fTileProvider->registerClass("DefaultTileLayer"); - fTileProvider->registerClass("SingleImageTileLayer"); - fTileProvider->registerClass("ImageSequenceTileLayer"); - fTileProvider->registerClass("SpoutImageTileLayer"); - fTileProvider->registerClass("TemporalTileLayer"); - fTileProvider->registerClass("TileIndexTileLayer"); - fTileProvider->registerClass("SizeReferenceTileLayer"); - fTileProvider->registerClass("ByLevelTileLayer"); - fTileProvider->registerClass("ByIndexTileLayer"); + fTileProvider->registerClass("DefaultTileProvider"); + fTileProvider->registerClass("SingleImageProvider"); + fTileProvider->registerClass("ImageSequenceTileProvider"); + fTileProvider->registerClass("SpoutImageProvider"); + fTileProvider->registerClass("TemporalTileProvider"); + fTileProvider->registerClass("TileIndexTileProvider"); + fTileProvider->registerClass("SizeReferenceTileProvider"); + fTileProvider->registerClass("TileProviderByLevel"); + fTileProvider->registerClass("TileProviderByIndex"); ghoul::TemplateFactory* fDashboard = FactoryManager::ref().factory(); diff --git a/modules/globebrowsing/shaders/texturetilemapping.glsl b/modules/globebrowsing/shaders/texturetilemapping.glsl index 74811b8331..d7e39c3431 100644 --- a/modules/globebrowsing/shaders/texturetilemapping.glsl +++ b/modules/globebrowsing/shaders/texturetilemapping.glsl @@ -146,25 +146,25 @@ vec4 getSample#{layerGroup}#{i}(vec2 uv, vec3 levelWeights, vec4 c = vec4(0.0, 0.0, 0.0, 1.0); // All tile layers are the same. Sample from texture -#if (#{#{layerGroup}#{i}LayerType} == 0) // DefaultTileLayer +#if (#{#{layerGroup}#{i}LayerType} == 0) // DefaultTileProvider c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); -#elif (#{#{layerGroup}#{i}LayerType} == 1) // SingleImageTileLayer +#elif (#{#{layerGroup}#{i}LayerType} == 1) // SingleImageProvider c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); -#elif (#{#{layerGroup}#{i}LayerType} == 2) // ImageSequenceTileLayer +#elif (#{#{layerGroup}#{i}LayerType} == 2) // ImageSequenceTileProvider c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); -#elif (#{#{layerGroup}#{i}LayerType} == 3) // SizeReferenceTileLayer +#elif (#{#{layerGroup}#{i}LayerType} == 3) // SizeReferenceTileProvider c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); -#elif (#{#{layerGroup}#{i}LayerType} == 4) // TemporalTileLayer +#elif (#{#{layerGroup}#{i}LayerType} == 4) // TemporalTileProvider c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); -#elif (#{#{layerGroup}#{i}LayerType} == 5) // TileIndexTileLayer +#elif (#{#{layerGroup}#{i}LayerType} == 5) // TileIndexTileProvider c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); -#elif (#{#{layerGroup}#{i}LayerType} == 6) // ByIndexTileLayer +#elif (#{#{layerGroup}#{i}LayerType} == 6) // TileProviderByIndex c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); -#elif (#{#{layerGroup}#{i}LayerType} == 7) // ByLevelTileLayer +#elif (#{#{layerGroup}#{i}LayerType} == 7) // TileProviderByLevel c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); #elif (#{#{layerGroup}#{i}LayerType} == 8) // SolidColor c.rgb = #{layerGroup}[#{i}].color; -#elif (#{#{layerGroup}#{i}LayerType} == 9) // SpoutImageTileLayer +#elif (#{#{layerGroup}#{i}LayerType} == 9) // SpoutImageProvider c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); #elif (#{#{layerGroup}#{i}LayerType} == 10) // VideoTileProvider c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); diff --git a/modules/globebrowsing/src/gpulayergroup.cpp b/modules/globebrowsing/src/gpulayergroup.cpp index 1f27869a97..adc2f7b6ea 100644 --- a/modules/globebrowsing/src/gpulayergroup.cpp +++ b/modules/globebrowsing/src/gpulayergroup.cpp @@ -66,16 +66,16 @@ void GPULayerGroup::setValue(ghoul::opengl::ProgramObject& program, switch (al.type()) { // Intentional fall through. Same for all tile layers - case layers::Layer::ID::DefaultTileLayer: - case layers::Layer::ID::SingleImageTileLayer: - case layers::Layer::ID::SpoutImageTileLayer: - case layers::Layer::ID::VideoTileLayer: - case layers::Layer::ID::ImageSequenceTileLayer: - case layers::Layer::ID::SizeReferenceTileLayer: - case layers::Layer::ID::TemporalTileLayer: - case layers::Layer::ID::TileIndexTileLayer: - case layers::Layer::ID::ByIndexTileLayer: - case layers::Layer::ID::ByLevelTileLayer: { + case layers::Layer::ID::DefaultTileProvider: + case layers::Layer::ID::SingleImageProvider: + case layers::Layer::ID::SpoutImageProvider: + case layers::Layer::ID::VideoTileProvider: + case layers::Layer::ID::ImageSequenceTileProvider: + case layers::Layer::ID::SizeReferenceTileProvider: + case layers::Layer::ID::TemporalTileProvider: + case layers::Layer::ID::TileIndexTileProvider: + case layers::Layer::ID::TileProviderByIndex: + case layers::Layer::ID::TileProviderByLevel: { const ChunkTilePile& ctp = al.chunkTilePile( tileIndex, layerGroup.pileSize() @@ -146,16 +146,16 @@ void GPULayerGroup::bind(ghoul::opengl::ProgramObject& p, const LayerGroup& laye switch (al.type()) { // Intentional fall through. Same for all tile layers - case layers::Layer::ID::DefaultTileLayer: - case layers::Layer::ID::SingleImageTileLayer: - case layers::Layer::ID::SpoutImageTileLayer: - case layers::Layer::ID::VideoTileLayer: - case layers::Layer::ID::ImageSequenceTileLayer: - case layers::Layer::ID::SizeReferenceTileLayer: - case layers::Layer::ID::TemporalTileLayer: - case layers::Layer::ID::TileIndexTileLayer: - case layers::Layer::ID::ByIndexTileLayer: - case layers::Layer::ID::ByLevelTileLayer: { + case layers::Layer::ID::DefaultTileProvider: + case layers::Layer::ID::SingleImageProvider: + case layers::Layer::ID::SpoutImageProvider: + case layers::Layer::ID::VideoTileProvider: + case layers::Layer::ID::ImageSequenceTileProvider: + case layers::Layer::ID::SizeReferenceTileProvider: + case layers::Layer::ID::TemporalTileProvider: + case layers::Layer::ID::TileIndexTileProvider: + case layers::Layer::ID::TileProviderByIndex: + case layers::Layer::ID::TileProviderByLevel: { gal.gpuChunkTiles.resize(pileSize); for (size_t j = 0; j < gal.gpuChunkTiles.size(); ++j) { GPULayer::GPUChunkTile& t = gal.gpuChunkTiles[j]; diff --git a/modules/globebrowsing/src/layer.cpp b/modules/globebrowsing/src/layer.cpp index b051f6f37d..f9da70aa1a 100644 --- a/modules/globebrowsing/src/layer.cpp +++ b/modules/globebrowsing/src/layer.cpp @@ -121,11 +121,12 @@ namespace { std::optional color [[codegen::color()]]; // Specifies the type of layer that is to be added. If this value is not - // specified, the layer is a DefaultTileLayer - std::optional type [[codegen::inlist("DefaultTileLayer", - "SingleImageTileLayer", "ImageSequenceTileLayer", "SizeReferenceTileLayer", - "TemporalTileLayer", "TileIndexTileLayer", "ByIndexTileLayer", - "ByLevelTileLayer", "SolidColor", "SpoutImageTileLayer", "VideoTileLayer")]]; + // specified, the layer is a DefaultTileProvider + std::optional type [[codegen::inlist("DefaultTileProvider", + "SingleImageProvider", "ImageSequenceTileProvider", + "SizeReferenceTileProvider", "TemporalTileProvider", "TileIndexTileProvider", + "TileProviderByIndex", "TileProviderByLevel", "SolidColor", + "SpoutImageProvider", "VideoTileProvider")]]; // Determine whether the layer is enabled or not. If this value is not specified, // the layer is disabled @@ -220,7 +221,7 @@ Layer::Layer(layers::Group::ID id, const ghoul::Dictionary& layerDict, LayerGrou } } else { - typeID = layers::Layer::ID::DefaultTileLayer; + typeID = layers::Layer::ID::DefaultTileProvider; } initializeBasedOnType(typeID, layerDict); @@ -320,16 +321,16 @@ Layer::Layer(layers::Group::ID id, const ghoul::Dictionary& layerDict, LayerGrou _typeOption.onChange([this]() { switch (type()) { // Intentional fall through. Same for all tile layers - case layers::Layer::ID::DefaultTileLayer: - case layers::Layer::ID::SingleImageTileLayer: - case layers::Layer::ID::SpoutImageTileLayer: - case layers::Layer::ID::ImageSequenceTileLayer: - case layers::Layer::ID::SizeReferenceTileLayer: - case layers::Layer::ID::TemporalTileLayer: - case layers::Layer::ID::TileIndexTileLayer: - case layers::Layer::ID::ByIndexTileLayer: - case layers::Layer::ID::ByLevelTileLayer: - case layers::Layer::ID::VideoTileLayer: + case layers::Layer::ID::DefaultTileProvider: + case layers::Layer::ID::SingleImageProvider: + case layers::Layer::ID::SpoutImageProvider: + case layers::Layer::ID::ImageSequenceTileProvider: + case layers::Layer::ID::SizeReferenceTileProvider: + case layers::Layer::ID::TemporalTileProvider: + case layers::Layer::ID::TileIndexTileProvider: + case layers::Layer::ID::TileProviderByIndex: + case layers::Layer::ID::TileProviderByLevel: + case layers::Layer::ID::VideoTileProvider: if (_tileProvider) { removePropertySubOwner(*_tileProvider); } @@ -495,16 +496,16 @@ glm::vec2 Layer::tileUvToTextureSamplePosition(const TileUvTransform& uvTransfor void Layer::initializeBasedOnType(layers::Layer::ID id, ghoul::Dictionary initDict) { switch (id) { // Intentional fall through. Same for all tile layers - case layers::Layer::ID::DefaultTileLayer: - case layers::Layer::ID::SingleImageTileLayer: - case layers::Layer::ID::SpoutImageTileLayer: - case layers::Layer::ID::ImageSequenceTileLayer: - case layers::Layer::ID::SizeReferenceTileLayer: - case layers::Layer::ID::TemporalTileLayer: - case layers::Layer::ID::TileIndexTileLayer: - case layers::Layer::ID::ByIndexTileLayer: - case layers::Layer::ID::ByLevelTileLayer: - case layers::Layer::ID::VideoTileLayer: + case layers::Layer::ID::DefaultTileProvider: + case layers::Layer::ID::SingleImageProvider: + case layers::Layer::ID::SpoutImageProvider: + case layers::Layer::ID::ImageSequenceTileProvider: + case layers::Layer::ID::SizeReferenceTileProvider: + case layers::Layer::ID::TemporalTileProvider: + case layers::Layer::ID::TileIndexTileProvider: + case layers::Layer::ID::TileProviderByIndex: + case layers::Layer::ID::TileProviderByLevel: + case layers::Layer::ID::VideoTileProvider: // We add the id to the dictionary since it needs to be known by // the tile provider initDict.setValue( @@ -530,16 +531,16 @@ void Layer::initializeBasedOnType(layers::Layer::ID id, ghoul::Dictionary initDi void Layer::addVisibleProperties() { switch (type()) { // Intentional fall through. Same for all tile layers - case layers::Layer::ID::DefaultTileLayer: - case layers::Layer::ID::SingleImageTileLayer: - case layers::Layer::ID::SpoutImageTileLayer: - case layers::Layer::ID::ImageSequenceTileLayer: - case layers::Layer::ID::SizeReferenceTileLayer: - case layers::Layer::ID::TemporalTileLayer: - case layers::Layer::ID::TileIndexTileLayer: - case layers::Layer::ID::ByIndexTileLayer: - case layers::Layer::ID::ByLevelTileLayer: - case layers::Layer::ID::VideoTileLayer: + case layers::Layer::ID::DefaultTileProvider: + case layers::Layer::ID::SingleImageProvider: + case layers::Layer::ID::SpoutImageProvider: + case layers::Layer::ID::ImageSequenceTileProvider: + case layers::Layer::ID::SizeReferenceTileProvider: + case layers::Layer::ID::TemporalTileProvider: + case layers::Layer::ID::TileIndexTileProvider: + case layers::Layer::ID::TileProviderByIndex: + case layers::Layer::ID::TileProviderByLevel: + case layers::Layer::ID::VideoTileProvider: if (_tileProvider) { addPropertySubOwner(*_tileProvider); } diff --git a/modules/globebrowsing/src/layergroupid.h b/modules/globebrowsing/src/layergroupid.h index d6c4d55dfe..146482621f 100644 --- a/modules/globebrowsing/src/layergroupid.h +++ b/modules/globebrowsing/src/layergroupid.h @@ -78,17 +78,17 @@ constexpr std::array Groups = { struct Layer { enum class ID { - DefaultTileLayer = 0, - SingleImageTileLayer, - ImageSequenceTileLayer, - SizeReferenceTileLayer, - TemporalTileLayer, - TileIndexTileLayer, - ByIndexTileLayer, - ByLevelTileLayer, + DefaultTileProvider = 0, + SingleImageProvider, + ImageSequenceTileProvider, + SizeReferenceTileProvider, + TemporalTileProvider, + TileIndexTileProvider, + TileProviderByIndex, + TileProviderByLevel, SolidColor, - SpoutImageTileLayer, - VideoTileLayer, + SpoutImageProvider, + VideoTileProvider, Unknown }; @@ -98,48 +98,48 @@ struct Layer { constexpr std::array Layers = { Layer { - .id = Layer::ID::DefaultTileLayer, - .identifier = "DefaultTileLayer" + .id = Layer::ID::DefaultTileProvider, + .identifier = "DefaultTileProvider" }, Layer { - .id = Layer::ID::SingleImageTileLayer, - .identifier = "SingleImageTileLayer" + .id = Layer::ID::SingleImageProvider, + .identifier = "SingleImageProvider" }, Layer { - .id = Layer::ID::ImageSequenceTileLayer, - .identifier = "ImageSequenceTileLayer" + .id = Layer::ID::ImageSequenceTileProvider, + .identifier = "ImageSequenceTileProvider" }, Layer { - .id = Layer::ID::SizeReferenceTileLayer, - .identifier = "SizeReferenceTileLayer" + .id = Layer::ID::SizeReferenceTileProvider, + .identifier = "SizeReferenceTileProvider" }, Layer { - .id = Layer::ID::TemporalTileLayer, - .identifier = "TemporalTileLayer" + .id = Layer::ID::TemporalTileProvider, + .identifier = "TemporalTileProvider" }, Layer { - .id = Layer::ID::TileIndexTileLayer, - .identifier = "TileIndexTileLayer" + .id = Layer::ID::TileIndexTileProvider, + .identifier = "TileIndexTileProvider" }, Layer { - .id = Layer::ID::ByIndexTileLayer, - .identifier = "ByIndexTileLayer" + .id = Layer::ID::TileProviderByIndex, + .identifier = "TileProviderByIndex" }, Layer { - .id = Layer::ID::ByLevelTileLayer, - .identifier = "ByLevelTileLayer" + .id = Layer::ID::TileProviderByLevel, + .identifier = "TileProviderByLevel" }, Layer { .id = Layer::ID::SolidColor, .identifier = "SolidColor" }, Layer { - .id = Layer::ID::SpoutImageTileLayer, - .identifier = "SpoutImageTileLayer" + .id = Layer::ID::SpoutImageProvider, + .identifier = "SpoutImageProvider" }, Layer { - .id = Layer::ID::VideoTileLayer, - .identifier = "VideoTileLayer" + .id = Layer::ID::VideoTileProvider, + .identifier = "VideoTileProvider" } }; diff --git a/modules/globebrowsing/src/tileprovider/tileproviderbyindex.cpp b/modules/globebrowsing/src/tileprovider/tileproviderbyindex.cpp index 30428e5724..4b05839083 100644 --- a/modules/globebrowsing/src/tileprovider/tileproviderbyindex.cpp +++ b/modules/globebrowsing/src/tileprovider/tileproviderbyindex.cpp @@ -69,7 +69,7 @@ TileProviderByIndex::TileProviderByIndex(const ghoul::Dictionary& dictionary) { const Parameters p = codegen::bake(dictionary); - layers::Layer::ID typeID = layers::Layer::ID::DefaultTileLayer; + layers::Layer::ID typeID = layers::Layer::ID::DefaultTileProvider; if (p.defaultProvider.hasValue("Type")) { std::string type = p.defaultProvider.value("Type"); typeID = ghoul::from_string(type); @@ -88,7 +88,7 @@ TileProviderByIndex::TileProviderByIndex(const ghoul::Dictionary& dictionary) { static_cast(ip.tileIndex.level) ); - layers::Layer::ID providerID = layers::Layer::ID::DefaultTileLayer; + layers::Layer::ID providerID = layers::Layer::ID::DefaultTileProvider; if (ip.tileProvider.hasValue("Type")) { std::string type = ip.tileProvider.value("Type"); providerID = ghoul::from_string(type); diff --git a/modules/globebrowsing/src/tileprovider/tileproviderbylevel.cpp b/modules/globebrowsing/src/tileprovider/tileproviderbylevel.cpp index da1228fa40..b86fbca700 100644 --- a/modules/globebrowsing/src/tileprovider/tileproviderbylevel.cpp +++ b/modules/globebrowsing/src/tileprovider/tileproviderbylevel.cpp @@ -56,7 +56,7 @@ TileProviderByLevel::TileProviderByLevel(const ghoul::Dictionary& dictionary) { ghoul::Dictionary& tileProviderDict = provider.tileProvider; tileProviderDict.setValue("LayerGroupID", static_cast(group)); - layers::Layer::ID typeID = layers::Layer::ID::DefaultTileLayer; + layers::Layer::ID typeID = layers::Layer::ID::DefaultTileProvider; if (tileProviderDict.hasValue("Type")) { std::string type = tileProviderDict.value("Type"); typeID = ghoul::from_string(type); diff --git a/modules/video/videomodule.cpp b/modules/video/videomodule.cpp index 7963296979..9c67becbb1 100644 --- a/modules/video/videomodule.cpp +++ b/modules/video/videomodule.cpp @@ -65,7 +65,7 @@ void VideoModule::internalInitialize(const ghoul::Dictionary& dict) { ghoul::TemplateFactory* fTileProvider = FactoryManager::ref().factory(); ghoul_assert(fTileProvider, "TileProvider factory was not created"); - fTileProvider->registerClass("VideoTileLayer"); + fTileProvider->registerClass("VideoTileProvider"); ghoul::TemplateFactory* fSsRenderable = FactoryManager::ref().factory(); From f78f42fbd5aa348f56e5a7e41f3e94839a86e720 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Fri, 4 Aug 2023 08:31:49 +0200 Subject: [PATCH 070/701] Fix miguiding RotationSpeedFactor documentation, and increase default value (closes #2838) --- src/navigation/pathnavigator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/navigation/pathnavigator.cpp b/src/navigation/pathnavigator.cpp index 4d4fa5c36b..f61478fcb5 100644 --- a/src/navigation/pathnavigator.cpp +++ b/src/navigation/pathnavigator.cpp @@ -101,7 +101,7 @@ namespace { "Rotation Speed Factor (Linear Path)", "Affects how fast the camera rotates to the target rotation during a linear " "path. A value of 1 means that the camera will rotate 90 degrees in about 5 " - "seconds. A value of 2 means twice that fast, and so on", + "seconds. A value of 2 means twice that time, i.e. 10 seconds, and so on", // @VISIBILITY(2.5) openspace::properties::Property::Visibility::User }; @@ -137,7 +137,7 @@ PathNavigator::PathNavigator() , _speedScale(SpeedScaleInfo, 1.f, 0.01f, 2.f) , _applyIdleBehaviorOnFinish(IdleBehaviorOnFinishInfo, false) , _arrivalDistanceFactor(ArrivalDistanceFactorInfo, 2.0, 0.1, 20.0) - , _linearRotationSpeedFactor(RotationSpeedFactorInfo, 1.f, 0.1f, 2.f) + , _linearRotationSpeedFactor(RotationSpeedFactorInfo, 1.5f, 0.1f, 3.f) , _minValidBoundingSphere(MinBoundingSphereInfo, 10.0, 1.0, 3e10) , _relevantNodeTags(RelevantNodeTagsInfo) { From 57fafe48f4e764c59f58e7b87b898a22febe96ca Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Sat, 5 Aug 2023 19:20:08 +0200 Subject: [PATCH 071/701] Rename Lua function to bring them more in line with the function naming in C++ (#2840) * Rename Lua function to bring them more in line with the function naming in C++ --- .../actions/planets/planet_lighting.asset | 4 +- .../planets/scale_planets_and_moons.asset | 4 +- .../trails/on_off_all_minor_moons.asset | 16 ++-- .../toggle_all_dwarf_planet_trails.asset | 4 +- .../trails/toggle_all_minor_moon_trails.asset | 4 +- .../actions/trails/toggle_all_trails.asset | 14 ++-- ...gle_all_trails_planets_moons_instant.asset | 8 +- data/assets/actions/trails/toggle_trail.asset | 2 +- .../trails/toggle_trails_planets_moons.asset | 6 +- .../actions/trails/trail_appearance.asset | 10 +-- data/assets/base_keybindings.asset | 4 +- data/assets/default_keybindings.asset | 4 +- data/assets/events/toggle_sun.asset | 2 +- .../modules/exoplanets/exoplanets_data.asset | 4 +- .../exoplanets/exoplanets_textures.asset | 10 +-- data/assets/nightsky/planets.asset | 2 +- .../2012/sun_earth_2012_fieldlines_pfss.asset | 2 +- .../bastille_day/density_volume.asset | 6 +- .../heliosphere/bastille_day/fieldlines.asset | 6 +- .../heliosphere/bastille_day/fluxnodes.asset | 6 +- .../bastille_day/fluxnodescutplane.asset | 12 +-- .../bastille_day/fluxnodeslegend.asset | 8 +- .../solarsystem/missions/apollo/actions.asset | 2 +- .../apollo/apollo_globebrowsing.asset | 2 +- .../missions/artemis/toggle_trail.asset | 4 +- .../missions/newhorizons/actions.asset | 32 ++++---- .../missions/osirisrex/actions.asset | 2 +- .../solarsystem/missions/rosetta/67p.asset | 2 +- .../missions/rosetta/actions.asset | 4 +- .../missions/rosetta/rosetta.asset | 4 +- .../missions/voyager/actions.asset | 4 +- .../solarsystem/planets/earth/earth.asset | 4 +- .../solarsystem/planets/earth/moon/moon.asset | 2 +- .../planets/jupiter/major_moons.asset | 16 ++-- .../planets/jupiter/minor_moons.asset | 16 ++-- .../planets/neptune/major_moons.asset | 16 ++-- .../planets/neptune/minor_moons.asset | 16 ++-- .../planets/saturn/major_moons.asset | 16 ++-- .../planets/saturn/minor_moons.asset | 16 ++-- .../planets/uranus/major_moons.asset | 16 ++-- .../planets/uranus/minor_moons.asset | 16 ++-- .../scene/solarsystem/sun/EUV_layer.asset | 6 +- .../solarsystem/telescopes/jwst/actions.asset | 28 +++---- .../telescopes/jwst/timelapse.asset | 2 +- .../telescopes/jwst/toggle_trail.asset | 6 +- data/assets/util/dpiscaling.asset | 8 +- data/assets/util/property_helper.asset | 6 +- data/assets/util/screenshots_endpoint.asset | 4 +- modules/exoplanets/exoplanetsmodule.cpp | 3 +- modules/exoplanets/exoplanetsmodule_lua.inl | 16 +++- modules/globebrowsing/globebrowsingmodule.cpp | 9 ++- .../globebrowsing/globebrowsingmodule_lua.inl | 73 +++++++++++++++++-- src/scene/scene.cpp | 15 +++- src/scene/scene_lua.inl | 25 ++++++- 54 files changed, 321 insertions(+), 208 deletions(-) diff --git a/data/assets/actions/planets/planet_lighting.asset b/data/assets/actions/planets/planet_lighting.asset index 5a8923845f..95da0b5b6c 100644 --- a/data/assets/actions/planets/planet_lighting.asset +++ b/data/assets/actions/planets/planet_lighting.asset @@ -6,7 +6,7 @@ local function illuminationCommand(node, global) if (global) then commandString = commandString .. [[ if (openspace.hasProperty("Scene."..node..".Renderable.UseAccurateNormals")) then - local list = openspace.getProperty("Scene." .. node .. ".Renderable.Layers.NightLayers.*.Enabled") + local list = openspace.property("Scene." .. node .. ".Renderable.Layers.NightLayers.*.Enabled") if (#list > 0) then openspace.setPropertyValue("Scene." .. node .. ".Renderable.Layers.NightLayers.*.Enabled", false) else @@ -24,7 +24,7 @@ end]] else --todo @micahnyc this 40 wont do once we have more rings commandString = commandString .. [[if (openspace.hasProperty("Scene."..node..".Renderable.UseAccurateNormals")) then -local list = openspace.getProperty("Scene." .. node .. ".Renderable.Layers.NightLayers.*.Enabled") +local list = openspace.property("Scene." .. node .. ".Renderable.Layers.NightLayers.*.Enabled") if (#list > 0) then openspace.setPropertyValue(list[1], true) else diff --git a/data/assets/actions/planets/scale_planets_and_moons.asset b/data/assets/actions/planets/scale_planets_and_moons.asset index 10ee22dd18..7db5f9c182 100644 --- a/data/assets/actions/planets/scale_planets_and_moons.asset +++ b/data/assets/actions/planets/scale_planets_and_moons.asset @@ -29,12 +29,12 @@ local function toggleScaleAction(identifier, scale, name, speedup, speeddown) Identifier = "os.toggle_" .. string.gsub(name, "%s+", "") .. "_scale", Name = "Toggle " .. name .. " scale", Command = [[ -local list = openspace.getProperty("]] .. identifier .. [[.Scale.Scale") +local list = openspace.property("]] .. identifier .. [[.Scale.Scale") if #list == 0 then openspace.printWarning("No planets to resize") else local prop = list[1] - local currentScale = openspace.getPropertyValue(prop) + local currentScale = openspace.propertyValue(prop) local newScale = 1 if (currentScale == 1) then ]] .. scaleCommand(identifier, scale, speedup) .. [[ diff --git a/data/assets/actions/trails/on_off_all_minor_moons.asset b/data/assets/actions/trails/on_off_all_minor_moons.asset index a70f772b9e..e0441c6ac4 100644 --- a/data/assets/actions/trails/on_off_all_minor_moons.asset +++ b/data/assets/actions/trails/on_off_all_minor_moons.asset @@ -2,11 +2,11 @@ local MinorMoonsOn = { Identifier = "os.MinorMoonsOn", Name = "Turn on minor moons and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_minor}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_minor}.Renderable.Fade") + local trails = openspace.property("{moonTrail_minor}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_minor}.Renderable.Fade") - local moons = openspace.getProperty("{moon_minor}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_minor}.Renderable.Fade") + local moons = openspace.property("{moon_minor}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_minor}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle(trails[i], true) @@ -27,11 +27,11 @@ local MinorMoonsOff = { Identifier = "os.MinorMoonsOff", Name = "Turn off minor moons and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_minor}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_minor}.Renderable.Fade") + local trails = openspace.property("{moonTrail_minor}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_minor}.Renderable.Fade") - local moons = openspace.getProperty("{moon_minor}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_minor}.Renderable.Fade") + local moons = openspace.property("{moon_minor}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_minor}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle( diff --git a/data/assets/actions/trails/toggle_all_dwarf_planet_trails.asset b/data/assets/actions/trails/toggle_all_dwarf_planet_trails.asset index 3fc127643f..d57b55886c 100644 --- a/data/assets/actions/trails/toggle_all_dwarf_planet_trails.asset +++ b/data/assets/actions/trails/toggle_all_dwarf_planet_trails.asset @@ -2,9 +2,9 @@ local ToggleDwarfPlanetTrails = { Identifier = "os.ToggleDwarfPlanetTrails", Name = "Toggle dwarf planet trails", Command = [[ - local list = openspace.getProperty("{planetTrail_dwarf}.Renderable.Enabled") + local list = openspace.property("{planetTrail_dwarf}.Renderable.Enabled") for _,v in pairs(list) do - openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + openspace.setPropertyValueSingle(v, not openspace.propertyValue(v)) end ]], Documentation = "Toggle on/off trails for all dwarf planets in the solar system", diff --git a/data/assets/actions/trails/toggle_all_minor_moon_trails.asset b/data/assets/actions/trails/toggle_all_minor_moon_trails.asset index 65c508dea8..d86ff3c470 100644 --- a/data/assets/actions/trails/toggle_all_minor_moon_trails.asset +++ b/data/assets/actions/trails/toggle_all_minor_moon_trails.asset @@ -2,9 +2,9 @@ local ToggleMinorMoonTrails = { Identifier = "os.ToggleMinorMoonTrails", Name = "Toggle minor moon trails", Command = [[ - local list = openspace.getProperty("{moonTrail_minor}.Renderable.Enabled") + local list = openspace.property("{moonTrail_minor}.Renderable.Enabled") for _,v in pairs(list) do - openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + openspace.setPropertyValueSingle(v, not openspace.propertyValue(v)) end ]], Documentation = "Toggle on/off minor moon trails for all planets in the solar system", diff --git a/data/assets/actions/trails/toggle_all_trails.asset b/data/assets/actions/trails/toggle_all_trails.asset index e3a7cf6e19..22bc7fdb68 100644 --- a/data/assets/actions/trails/toggle_all_trails.asset +++ b/data/assets/actions/trails/toggle_all_trails.asset @@ -2,11 +2,11 @@ local FadeUpTrails = { Identifier = "os.FadeUpTrails", Name = "Show all trails", Command = [[ - local capList = openspace.getProperty("Scene.*Trail.Renderable.Fade") + local capList = openspace.property("Scene.*Trail.Renderable.Fade") for _,v in ipairs(capList) do openspace.setPropertyValueSingle(v, 1, 2) end - local list = openspace.getProperty("Scene.*trail.Renderable.Fade") + local list = openspace.property("Scene.*trail.Renderable.Fade") for _,v in ipairs(list) do openspace.setPropertyValueSingle(v, 1, 2) end @@ -20,11 +20,11 @@ local FadeDownTrails = { Identifier = "os.FadeDownTrails", Name = "Hide all trails", Command = [[ - local capList = openspace.getProperty("Scene.*Trail.Renderable.Fade") + local capList = openspace.property("Scene.*Trail.Renderable.Fade") for _,v in ipairs(capList) do openspace.setPropertyValueSingle(v, 0, 2) end - local list = openspace.getProperty("Scene.*trail.Renderable.Fade") + local list = openspace.property("Scene.*trail.Renderable.Fade") for _,v in ipairs(list) do openspace.setPropertyValueSingle(v, 0, 2) end @@ -38,8 +38,8 @@ local ToggleTrails = { Identifier = "os.ToggleTrails", Name = "Toggle all trails", Command = [[ - local capList = openspace.getProperty("*Trail.Renderable.Fade") - local list = openspace.getProperty("*trail.Renderable.Fade") + local capList = openspace.property("*Trail.Renderable.Fade") + local list = openspace.property("*trail.Renderable.Fade") if (#capList == 0) and (#list == 0) then openspace.printWarning("No trails to toggle") else @@ -49,7 +49,7 @@ local ToggleTrails = { else prop = list[1] end - local currentFade = openspace.getPropertyValue(prop) + local currentFade = openspace.propertyValue(prop) local newFade = 0 if currentFade < 1 then newFade = 1 diff --git a/data/assets/actions/trails/toggle_all_trails_planets_moons_instant.asset b/data/assets/actions/trails/toggle_all_trails_planets_moons_instant.asset index 19f84a8eb0..a351ddb0ef 100644 --- a/data/assets/actions/trails/toggle_all_trails_planets_moons_instant.asset +++ b/data/assets/actions/trails/toggle_all_trails_planets_moons_instant.asset @@ -2,14 +2,14 @@ local ToggleTrailsInstant = { Identifier = "os.ToggleTrailsInstant", Name = "Toggle planet and moon trails (instant)", Command = [[ - local list = openspace.getProperty("{planetTrail_solarSystem}.Renderable.Enabled") + local list = openspace.property("{planetTrail_solarSystem}.Renderable.Enabled") for _,v in pairs(list) do - openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + openspace.setPropertyValueSingle(v, not openspace.propertyValue(v)) end - local moonlist = openspace.getProperty("{moonTrail_solarSystem}.Renderable.Enabled") + local moonlist = openspace.property("{moonTrail_solarSystem}.Renderable.Enabled") for _,v in pairs(moonlist) do - openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + openspace.setPropertyValueSingle(v, not openspace.propertyValue(v)) end ]], Documentation = "Toggles the visibility of planet and moon trails", diff --git a/data/assets/actions/trails/toggle_trail.asset b/data/assets/actions/trails/toggle_trail.asset index e5c03871e5..1acd99a14c 100644 --- a/data/assets/actions/trails/toggle_trail.asset +++ b/data/assets/actions/trails/toggle_trail.asset @@ -29,7 +29,7 @@ local ToggleTrail = { return end else - visibility = not openspace.getPropertyValue("Scene." .. trail .. ".Renderable.Enabled") + visibility = not openspace.propertyValue("Scene." .. trail .. ".Renderable.Enabled") end if visibility then diff --git a/data/assets/actions/trails/toggle_trails_planets_moons.asset b/data/assets/actions/trails/toggle_trails_planets_moons.asset index c4d54ca718..7792fdbeb4 100644 --- a/data/assets/actions/trails/toggle_trails_planets_moons.asset +++ b/data/assets/actions/trails/toggle_trails_planets_moons.asset @@ -26,8 +26,8 @@ local ToggleTrails = { Identifier = "os.planetsmoons.ToggleTrails", Name = "Toggle planet and moon trails", Command = [[ - local capList = openspace.getProperty("{planetTrail_solarSystem}.Renderable.Fade") - local list = openspace.getProperty("{moonTrail_solarSystem}.Renderable.Fade") + local capList = openspace.property("{planetTrail_solarSystem}.Renderable.Fade") + local list = openspace.property("{moonTrail_solarSystem}.Renderable.Fade") if (#capList == 0) and (#list == 0) then openspace.printWarning("No trails to toggle") else @@ -37,7 +37,7 @@ local ToggleTrails = { else prop = list[1] end - local currentFade = openspace.getPropertyValue(prop) + local currentFade = openspace.propertyValue(prop) local newFade = 0 if currentFade < 1 then newFade = 1 diff --git a/data/assets/actions/trails/trail_appearance.asset b/data/assets/actions/trails/trail_appearance.asset index 6bc20d15b1..4c7cf6fabe 100644 --- a/data/assets/actions/trails/trail_appearance.asset +++ b/data/assets/actions/trails/trail_appearance.asset @@ -29,12 +29,12 @@ local function toggleHighlightAction(identifierString, value, nameString) Identifier = "os.toggle_" .. identifierString .. "_trail_highlight", Name = "Toggle " .. nameString .. " trail highlight", Command = [[ -local list = openspace.getProperty("]] .. identifierString .. [[.Renderable.Appearance.Fade") +local list = openspace.property("]] .. identifierString .. [[.Renderable.Appearance.Fade") if #list == 0 then openspace.printWarning("No planets to resize") else local prop = list[1] - local fadeValue = openspace.getPropertyValue(prop) + local fadeValue = openspace.propertyValue(prop) if fadeValue > 1 then ]] .. highlightCommand(identifierString, 1, nameString) .. "\n" .. [[ else @@ -76,8 +76,8 @@ local ToggleTrailFading = { Identifier = "os.ToggleTrailFading", Name = "Toggle trail fading", Command = [[ - local capList = openspace.getProperty("*Trail.Renderable.Appearance.EnableFade") - local list = openspace.getProperty("*trail.Renderable.Appearance.EnableFade") + local capList = openspace.property("*Trail.Renderable.Appearance.EnableFade") + local list = openspace.property("*trail.Renderable.Appearance.EnableFade") if (#capList == 0) and (#list == 0) then openspace.printWarning("No trails to toggle") else @@ -87,7 +87,7 @@ local ToggleTrailFading = { else prop = list[1] end - local currentFade = openspace.getPropertyValue(prop) + local currentFade = openspace.propertyValue(prop) local newFade = not currentFade openspace.setPropertyValue("Scene.*Trail.Renderable.Appearance.EnableFade", newFade) openspace.setPropertyValue("Scene.*trail.Renderable.Appearance.EnableFade", newFade) diff --git a/data/assets/base_keybindings.asset b/data/assets/base_keybindings.asset index f2d19ffbf2..95d3a1ce23 100644 --- a/data/assets/base_keybindings.asset +++ b/data/assets/base_keybindings.asset @@ -7,9 +7,9 @@ local TogglePlanetLabels = { Identifier = "os_default.TogglePlanetLabels", Name = "Toggle planet labels", Command = [[ - local list = openspace.getProperty("{solarsystem_labels}.Renderable.Enabled") + local list = openspace.property("{solarsystem_labels}.Renderable.Enabled") for _,v in pairs(list) do - openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + openspace.setPropertyValueSingle(v, not openspace.propertyValue(v)) end ]], Documentation = "Turns on visibility for all solar system labels", diff --git a/data/assets/default_keybindings.asset b/data/assets/default_keybindings.asset index fa0e93aa2e..06883e32b3 100644 --- a/data/assets/default_keybindings.asset +++ b/data/assets/default_keybindings.asset @@ -78,7 +78,7 @@ local FadeToBlack = { Identifier = "os.FadeToBlack", Name = "Fade to/from black", Command = [[ - if openspace.getPropertyValue("RenderEngine.BlackoutFactor") > 0.5 then + if openspace.propertyValue("RenderEngine.BlackoutFactor") > 0.5 then openspace.setPropertyValueSingle("RenderEngine.BlackoutFactor", 0.0, 3) else openspace.setPropertyValueSingle("RenderEngine.BlackoutFactor", 1.0, 3) @@ -102,7 +102,7 @@ local ToggleOverlays = { Identifier = "os.ToggleOverlays", Name = "Toggle dashboard and overlays", Command = [[ - local isEnabled = openspace.getPropertyValue("Dashboard.IsEnabled") + local isEnabled = openspace.propertyValue("Dashboard.IsEnabled") openspace.setPropertyValueSingle("Dashboard.IsEnabled", not isEnabled) openspace.setPropertyValueSingle("RenderEngine.ShowLog", not isEnabled) openspace.setPropertyValueSingle("RenderEngine.ShowVersion", not isEnabled) diff --git a/data/assets/events/toggle_sun.asset b/data/assets/events/toggle_sun.asset index bb1a09a17d..c772471f5c 100644 --- a/data/assets/events/toggle_sun.asset +++ b/data/assets/events/toggle_sun.asset @@ -7,7 +7,7 @@ local ToggleSun = { return end - if not openspace.getPropertyValue("Scene.Sun.Renderable.Enabled") then + if not openspace.propertyValue("Scene.Sun.Renderable.Enabled") then openspace.setPropertyValueSingle("Scene.Sun.Renderable.Enabled", true) end diff --git a/data/assets/modules/exoplanets/exoplanets_data.asset b/data/assets/modules/exoplanets/exoplanets_data.asset index d7b40e7a6b..adc8290eac 100644 --- a/data/assets/modules/exoplanets/exoplanets_data.asset +++ b/data/assets/modules/exoplanets/exoplanets_data.asset @@ -17,12 +17,12 @@ asset.onInitialize(function() -- Set the default data files used for the exoplanet system creation -- (Check if already set, to not override value set in another file) local p1 = "Modules.Exoplanets.DataFolder" - if (openspace.getPropertyValue(p1) == "") then + if (openspace.propertyValue(p1) == "") then openspace.setPropertyValueSingle(p1, dataPath) end local p2 = "Modules.Exoplanets.BvColormap" - if (openspace.getPropertyValue(p2) == "") then + if (openspace.propertyValue(p2) == "") then openspace.setPropertyValueSingle(p2, colormaps .. "colorbv.cmap") end end) diff --git a/data/assets/modules/exoplanets/exoplanets_textures.asset b/data/assets/modules/exoplanets/exoplanets_textures.asset index 410faca805..94258024f0 100644 --- a/data/assets/modules/exoplanets/exoplanets_textures.asset +++ b/data/assets/modules/exoplanets/exoplanets_textures.asset @@ -31,27 +31,27 @@ asset.onInitialize(function() -- Set the default textures used for the exoplanet system creation -- (Check if already set, to not override value set in another file) local p1 = "Modules.Exoplanets.StarTexture" - if (openspace.getPropertyValue(p1) == "") then + if (openspace.propertyValue(p1) == "") then openspace.setPropertyValueSingle(p1, starTexture) end local p2 = "Modules.Exoplanets.StarGlareTexture" - if (openspace.getPropertyValue(p2) == "") then + if (openspace.propertyValue(p2) == "") then openspace.setPropertyValueSingle(p2, starGlareTexture) end local p3 = "Modules.Exoplanets.NoDataTexture" - if (openspace.getPropertyValue(p3) == "") then + if (openspace.propertyValue(p3) == "") then openspace.setPropertyValueSingle(p3, noDataTexture) end local p4 = "Modules.Exoplanets.OrbitDiscTexture" - if (openspace.getPropertyValue(p4) == "") then + if (openspace.propertyValue(p4) == "") then openspace.setPropertyValueSingle(p4, discTexture) end local p5 = "Modules.Exoplanets.HabitableZoneTexture" - if (openspace.getPropertyValue(p5) == "") then + if (openspace.propertyValue(p5) == "") then openspace.setPropertyValueSingle(p5, hzTexture) end end) diff --git a/data/assets/nightsky/planets.asset b/data/assets/nightsky/planets.asset index 79f649cd51..f5855cf4a7 100644 --- a/data/assets/nightsky/planets.asset +++ b/data/assets/nightsky/planets.asset @@ -156,7 +156,7 @@ local ToggleNightSkyPlanets = { openspace.toggleFade("Scene.NightSkyMars.Renderable") openspace.toggleFade("Scene.NightSkyJupiter.Renderable") openspace.toggleFade("Scene.NightSkySaturn.Renderable") - local scale = openspace.getPropertyValue("Scene.Moon.Scale.Scale") + local scale = openspace.propertyValue("Scene.Moon.Scale.Scale") if (scale > 1) then openspace.setPropertyValueSingle("Scene.Moon.Scale.Scale", 1.0) else 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 6053429e3d..f3dc419f1e 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 @@ -23,7 +23,7 @@ local DarkSun = { Name = "Dark sun", Command = [[ local property = "Scene.Sun.Renderable.Layers.ColorLayers.Texture.Settings.Multiplier" - local textureMultiplier = openspace.getPropertyValue(property) + local textureMultiplier = openspace.propertyValue(property) if (textureMultiplier < 0.01) then openspace.setPropertyValueSingle(property, 1.0, 1) else diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/density_volume.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/density_volume.asset index 0ea120b38c..bd70b8a781 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/density_volume.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/density_volume.asset @@ -56,11 +56,11 @@ local ToggleVolume = { Identifier = "os.bastilleday.densityvolume.ToggleVolume", Name = "Toggle volume", Command = [[ - if openspace.getPropertyValue("Scene.MAS-MHD-Density-bastille-day-2000.Renderable.Enabled") then + if openspace.propertyValue("Scene.MAS-MHD-Density-bastille-day-2000.Renderable.Enabled") then openspace.setPropertyValueSingle( "Scene.MAS-MHD-Density-bastille-day-2000.Renderable.Fade", 0.0, - openspace.getPropertyValue("OpenSpaceEngine.FadeDuration"), + openspace.propertyValue("OpenSpaceEngine.FadeDuration"), "Linear", 'openspace.setPropertyValueSingle("Scene.MAS-MHD-Density-bastille-day-2000.Renderable.Enabled", false)' ) @@ -69,7 +69,7 @@ local ToggleVolume = { openspace.setPropertyValueSingle( "Scene.MAS-MHD-Density-bastille-day-2000.Renderable.Fade", 1.0, - openspace.getPropertyValue("OpenSpaceEngine.FadeDuration"), + openspace.propertyValue("OpenSpaceEngine.FadeDuration"), "Linear" ) end diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/fieldlines.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/fieldlines.asset index 63eb7fd446..6331867a88 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/fieldlines.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/fieldlines.asset @@ -55,11 +55,11 @@ local ToggleFieldlines = { Identifier = "os.bastilleday.fieldlines.ToggleFieldlines", Name = "Toggle fieldlines", Command = [[ - if openspace.getPropertyValue("Scene.MAS-MHD-Fieldlines-bastille-day-2000.Renderable.Enabled") then + if openspace.propertyValue("Scene.MAS-MHD-Fieldlines-bastille-day-2000.Renderable.Enabled") then openspace.setPropertyValueSingle( "Scene.MAS-MHD-Fieldlines-bastille-day-2000.Renderable.Fade", 0.0, - openspace.getPropertyValue("OpenSpaceEngine.FadeDuration"), + openspace.propertyValue("OpenSpaceEngine.FadeDuration"), "Linear", 'openspace.setPropertyValueSingle("Scene.MAS-MHD-Fieldlines-bastille-day-2000.Renderable.Enabled", false)' ) @@ -68,7 +68,7 @@ local ToggleFieldlines = { openspace.setPropertyValueSingle( "Scene.MAS-MHD-Fieldlines-bastille-day-2000.Renderable.Fade", 1.0, - openspace.getPropertyValue("OpenSpaceEngine.FadeDuration"), + openspace.propertyValue("OpenSpaceEngine.FadeDuration"), "Linear" ) end diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodes.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodes.asset index cf83463d8c..283a18a4c9 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodes.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodes.asset @@ -40,11 +40,11 @@ local ToggleFluxnodes = { Identifier = "os.bastilleday.fluxnodes.ToggleFluxnodes", Name = "Toggle flux nodes", Command = [[ - if openspace.getPropertyValue("Scene.MAS-MHD-FluxNodes-bastille-day-2000.Renderable.Enabled") then + if openspace.propertyValue("Scene.MAS-MHD-FluxNodes-bastille-day-2000.Renderable.Enabled") then openspace.setPropertyValueSingle( "Scene.MAS-MHD-FluxNodes-bastille-day-2000.Renderable.Fade", 0.0, - openspace.getPropertyValue("OpenSpaceEngine.FadeDuration"), + openspace.propertyValue("OpenSpaceEngine.FadeDuration"), "Linear", 'openspace.setPropertyValueSingle("Scene.MAS-MHD-FluxNodes-bastille-day-2000.Renderable.Enabled", false)' ) @@ -53,7 +53,7 @@ local ToggleFluxnodes = { openspace.setPropertyValueSingle( "Scene.MAS-MHD-FluxNodes-bastille-day-2000.Renderable.Fade", 1.0, - openspace.getPropertyValue("OpenSpaceEngine.FadeDuration"), + openspace.propertyValue("OpenSpaceEngine.FadeDuration"), "Linear" ) end diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodescutplane.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodescutplane.asset index ecc8466874..bcda52593c 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodescutplane.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodescutplane.asset @@ -78,11 +78,11 @@ local ToggleEquatorial = { Identifier = "os.bastilleday.fluxnodescutplane.ToggleEquatorial", Name = "Toggle equatorial cutplane", Command = [[ - if openspace.getPropertyValue("Scene.EquatorialCutplane-bastille-day-2000.Renderable.Enabled") then + if openspace.propertyValue("Scene.EquatorialCutplane-bastille-day-2000.Renderable.Enabled") then openspace.setPropertyValueSingle( "Scene.EquatorialCutplane-bastille-day-2000.Renderable.Fade", 0.0, - openspace.getPropertyValue("OpenSpaceEngine.FadeDuration"), + openspace.propertyValue("OpenSpaceEngine.FadeDuration"), "Linear", 'openspace.setPropertyValueSingle("Scene.EquatorialCutplane-bastille-day-2000.Renderable.Enabled", false)' ) @@ -91,7 +91,7 @@ local ToggleEquatorial = { openspace.setPropertyValueSingle( "Scene.EquatorialCutplane-bastille-day-2000.Renderable.Fade", 1.0, - openspace.getPropertyValue("OpenSpaceEngine.FadeDuration"), + openspace.propertyValue("OpenSpaceEngine.FadeDuration"), "Linear" ) end @@ -104,11 +104,11 @@ local ToggleMeridial = { Identifier = "os.bastilleday.fluxnodescutplane.ToggleMeridial", Name = "Toggle meridial cutplane", Command = [[ - if openspace.getPropertyValue("Scene.MeridialCutplane-bastille-day-2000.Renderable.Enabled") then + if openspace.propertyValue("Scene.MeridialCutplane-bastille-day-2000.Renderable.Enabled") then openspace.setPropertyValueSingle( "Scene.MeridialCutplane-bastille-day-2000.Renderable.Fade", 0.0, - openspace.getPropertyValue("OpenSpaceEngine.FadeDuration"), + openspace.propertyValue("OpenSpaceEngine.FadeDuration"), "Linear", 'openspace.setPropertyValueSingle("Scene.MeridialCutplane-bastille-day-2000.Renderable.Enabled", false)' ) @@ -117,7 +117,7 @@ local ToggleMeridial = { openspace.setPropertyValueSingle( "Scene.MeridialCutplane-bastille-day-2000.Renderable.Fade", 1.0, - openspace.getPropertyValue("OpenSpaceEngine.FadeDuration"), + openspace.propertyValue("OpenSpaceEngine.FadeDuration"), "Linear" ) end diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodeslegend.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodeslegend.asset index 8b34675423..d9a3044da8 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodeslegend.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodeslegend.asset @@ -23,11 +23,11 @@ local ToggleLegend = { Identifier = "os.bastilleday.fluxnodelegend.ToggleLegend", Name = "Toggle the legend image", Command = [[ - if openspace.getPropertyValue("ScreenSpace.LegendFluxNodes-bastille-day-2000.Enabled") then + if openspace.propertyValue("ScreenSpace.LegendFluxNodes-bastille-day-2000.Enabled") then openspace.setPropertyValueSingle( "ScreenSpace.LegendFluxNodes-bastille-day-2000.Fade", 0.0, - openspace.getPropertyValue("OpenSpaceEngine.FadeDuration"), + openspace.propertyValue("OpenSpaceEngine.FadeDuration"), "Linear", 'openspace.setPropertyValueSingle("ScreenSpace.LegendFluxNodes-bastille-day-2000.Enabled", false)' ) @@ -36,7 +36,7 @@ local ToggleLegend = { openspace.setPropertyValueSingle( "ScreenSpace.LegendFluxNodes-bastille-day-2000.Fade", 1.0, - openspace.getPropertyValue("OpenSpaceEngine.FadeDuration"), + openspace.propertyValue("OpenSpaceEngine.FadeDuration"), "Linear" ) end @@ -53,7 +53,7 @@ local HideLegend = { openspace.setPropertyValueSingle( "ScreenSpace.LegendFluxNodes-bastille-day-2000.Fade", 0.0, - openspace.getPropertyValue("OpenSpaceEngine.FadeDuration"), + openspace.propertyValue("OpenSpaceEngine.FadeDuration"), "Linear", 'openspace.setPropertyValueSingle("ScreenSpace.LegendFluxNodes-bastille-day-2000.Enabled", false)' ) diff --git a/data/assets/scene/solarsystem/missions/apollo/actions.asset b/data/assets/scene/solarsystem/missions/apollo/actions.asset index 078b57781e..fdd6fd0c53 100644 --- a/data/assets/scene/solarsystem/missions/apollo/actions.asset +++ b/data/assets/scene/solarsystem/missions/apollo/actions.asset @@ -4,7 +4,7 @@ local ToggleMoonShading = { Command = [[ openspace.setPropertyValueSingle( "Scene.Moon.Renderable.PerformShading", - not openspace.getPropertyValue("Scene.Moon.Renderable.PerformShading") + not openspace.propertyValue("Scene.Moon.Renderable.PerformShading") ) ]], Documentation = "Toggles the shading of the Moon", diff --git a/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset b/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset index 25ff907125..207ec3ed99 100644 --- a/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset +++ b/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset @@ -40,7 +40,7 @@ local ToggleKaguyaLayer = { Command = [[ openspace.setPropertyValueSingle( "Scene.Moon.Renderable.Layers.ColorLayers.Kaguya_Utah.Enabled", - not openspace.getPropertyValue("Scene.Moon.Renderable.Layers.ColorLayers.Kaguya_Utah.Enabled") + not openspace.propertyValue("Scene.Moon.Renderable.Layers.ColorLayers.Kaguya_Utah.Enabled") ) ]], Documentation = "Toggles Moon Kaguya color layer", diff --git a/data/assets/scene/solarsystem/missions/artemis/toggle_trail.asset b/data/assets/scene/solarsystem/missions/artemis/toggle_trail.asset index 28bee49bc8..b8f15cf8cc 100644 --- a/data/assets/scene/solarsystem/missions/artemis/toggle_trail.asset +++ b/data/assets/scene/solarsystem/missions/artemis/toggle_trail.asset @@ -27,8 +27,8 @@ local ToggleTrail = { end else visibility = not ( - (openspace.getPropertyValue("Scene." .. earthTrail .. ".Renderable.Fade") == 1) or - (openspace.getPropertyValue("Scene." .. moonTrail .. ".Renderable.Fade") == 1) + (openspace.propertyValue("Scene." .. earthTrail .. ".Renderable.Fade") == 1) or + (openspace.propertyValue("Scene." .. moonTrail .. ".Renderable.Fade") == 1) ) end diff --git a/data/assets/scene/solarsystem/missions/newhorizons/actions.asset b/data/assets/scene/solarsystem/missions/newhorizons/actions.asset index 68e637aaca..af6d36c9e4 100644 --- a/data/assets/scene/solarsystem/missions/newhorizons/actions.asset +++ b/data/assets/scene/solarsystem/missions/newhorizons/actions.asset @@ -54,7 +54,7 @@ local ToggleImageProjection = { Identifier = "os.newhorizons.ToggleImageProjection", Name = "Toggle NH image projection", Command = [[ - local enabled = openspace.getPropertyValue("Scene.PlutoProjection.Renderable.ProjectionComponent.PerformProjection") + local enabled = openspace.propertyValue("Scene.PlutoProjection.Renderable.ProjectionComponent.PerformProjection") openspace.setPropertyValue("Scene.PlutoProjection.Renderable.ProjectionComponent.PerformProjection", not enabled) openspace.setPropertyValue("Scene.CharonProjection.Renderable.ProjectionComponent.PerformProjection", not enabled) ]], @@ -94,7 +94,7 @@ local IncreaseHeightmapPluto = { Command = [[ openspace.setPropertyValueSingle( "Scene.PlutoProjection.Renderable.HeightExaggeration", - openspace.getPropertyValue("Scene.PlutoProjection.Renderable.HeightExaggeration") + 5000 + openspace.propertyValue("Scene.PlutoProjection.Renderable.HeightExaggeration") + 5000 ) ]], Documentation = "Increases the height map exaggeration on Pluto", @@ -108,7 +108,7 @@ local DecreaseHeightmapPluto = { Command = [[ openspace.setPropertyValueSingle( "Scene.PlutoProjection.Renderable.HeightExaggeration", - openspace.getPropertyValue("Scene.PlutoProjection.Renderable.HeightExaggeration") - 5000 + openspace.propertyValue("Scene.PlutoProjection.Renderable.HeightExaggeration") - 5000 ) ]], Documentation = "Decreases the height map exaggeration on Pluto", @@ -122,7 +122,7 @@ local IncreaseHeightmapCharon = { Command = [[ openspace.setPropertyValueSingle( "Scene.CharonProjection.Renderable.HeightExaggeration", - openspace.getPropertyValue("Scene.CharonProjection.Renderable.HeightExaggeration") + 5000 + openspace.propertyValue("Scene.CharonProjection.Renderable.HeightExaggeration") + 5000 ) ]], Documentation = "Increases the height map exaggeration on Charon", @@ -136,7 +136,7 @@ local DecreaseHeightmapCharon = { Command = [[ openspace.setPropertyValueSingle( "Scene.CharonProjection.Renderable.HeightExaggeration", - openspace.getPropertyValue("Scene.CharonProjection.Renderable.HeightExaggeration") - 5000 + openspace.propertyValue("Scene.CharonProjection.Renderable.HeightExaggeration") - 5000 ) ]], Documentation = "Decreases the height map exaggeration on Charon", @@ -150,7 +150,7 @@ local TogglePlutoTrail = { Command = [[ openspace.setPropertyValueSingle( "Scene.PlutoBarycentricTrail.Renderable.Enabled", - not openspace.getPropertyValue("Scene.PlutoBarycentricTrail.Renderable.Enabled") + not openspace.propertyValue("Scene.PlutoBarycentricTrail.Renderable.Enabled") ) ]], Documentation = "Toggles the visibility of the trail behind Pluto", @@ -164,27 +164,27 @@ local TogglePlutoLabels = { Command = [[ openspace.setPropertyValueSingle( "Scene.PlutoText.Renderable.Enabled", - not openspace.getPropertyValue("Scene.PlutoText.Renderable.Enabled") + not openspace.propertyValue("Scene.PlutoText.Renderable.Enabled") ) openspace.setPropertyValueSingle( "Scene.CharonText.Renderable.Enabled", - not openspace.getPropertyValue("Scene.CharonText.Renderable.Enabled") + not openspace.propertyValue("Scene.CharonText.Renderable.Enabled") ) openspace.setPropertyValueSingle( "Scene.HydraText.Renderable.Enabled", - not openspace.getPropertyValue("Scene.HydraText.Renderable.Enabled") + not openspace.propertyValue("Scene.HydraText.Renderable.Enabled") ) openspace.setPropertyValueSingle( "Scene.NixText.Renderable.Enabled", - not openspace.getPropertyValue("Scene.NixText.Renderable.Enabled") + not openspace.propertyValue("Scene.NixText.Renderable.Enabled") ) openspace.setPropertyValueSingle( "Scene.KerberosText.Renderable.Enabled", - not openspace.getPropertyValue("Scene.KerberosText.Renderable.Enabled") + not openspace.propertyValue("Scene.KerberosText.Renderable.Enabled") ) openspace.setPropertyValueSingle( "Scene.StyxText.Renderable.Enabled", - not openspace.getPropertyValue("Scene.StyxText.Renderable.Enabled") + not openspace.propertyValue("Scene.StyxText.Renderable.Enabled") ) ]], Documentation = "Toggles the visibility of the text labels of Pluto, Charon, Hydra, Nix, Kerberos, and Styx", @@ -196,7 +196,7 @@ local ToggleNewHorizonsLabels = { Identifier = "os.newhorizons.ToggleNewHorizonsLabels", Name = "Toggle New Horizons labels", Command = [[ - local v = openspace.getPropertyValue("Scene.Labels.Renderable.Opacity") + local v = openspace.propertyValue("Scene.Labels.Renderable.Opacity") if v <= 0.5 then openspace.setPropertyValueSingle("Scene.Labels.Renderable.Opacity", 1.0, 2.0) else @@ -214,11 +214,11 @@ local ToggleShadows = { Command = [[ openspace.setPropertyValueSingle( "Scene.PlutoShadow.Renderable.Enabled", - not openspace.getPropertyValue("Scene.PlutoShadow.Renderable.Enabled") + not openspace.propertyValue("Scene.PlutoShadow.Renderable.Enabled") ) openspace.setPropertyValueSingle( "Scene.CharonShadow.Renderable.Enabled", - not openspace.getPropertyValue("Scene.CharonShadow.Renderable.Enabled") + not openspace.propertyValue("Scene.CharonShadow.Renderable.Enabled") ) ]], Documentation = "Toggles the visibility of the shadow visualization of Pluto and Charon", @@ -232,7 +232,7 @@ local ToggleNewHorizonsTrail = { Command = [[ openspace.setPropertyValueSingle( "Scene.NewHorizonsTrailPluto.Renderable.Enabled", - not openspace.getPropertyValue("Scene.NewHorizonsTrailPluto.Renderable.Enabled") + not openspace.propertyValue("Scene.NewHorizonsTrailPluto.Renderable.Enabled") ) ]], Documentation = "Toggles the trail of New Horizons", diff --git a/data/assets/scene/solarsystem/missions/osirisrex/actions.asset b/data/assets/scene/solarsystem/missions/osirisrex/actions.asset index c44984a77a..dc1889a966 100644 --- a/data/assets/scene/solarsystem/missions/osirisrex/actions.asset +++ b/data/assets/scene/solarsystem/missions/osirisrex/actions.asset @@ -78,7 +78,7 @@ local ToggleSunMarker = { Command = [[ openspace.setPropertyValueSingle( "Scene.SunMarker.Renderable.Enabled", - not openspace.getPropertyValue("Scene.SunMarker.Renderable.Enabled") + not openspace.propertyValue("Scene.SunMarker.Renderable.Enabled") ) ]], Documentation = "Toggles the visibility of the text marking the location of the Sun", diff --git a/data/assets/scene/solarsystem/missions/rosetta/67p.asset b/data/assets/scene/solarsystem/missions/rosetta/67p.asset index b472df33f6..42377f4cfe 100644 --- a/data/assets/scene/solarsystem/missions/rosetta/67p.asset +++ b/data/assets/scene/solarsystem/missions/rosetta/67p.asset @@ -161,7 +161,7 @@ local Toggle67pProjection = { Command = [[ openspace.setPropertyValueSingle( "Scene.67P.Renderable.ProjectionComponent.PerformProjection", - not openspace.getPropertyValue("Scene.67P.Renderable.ProjectionComponent.PerformProjection") + not openspace.propertyValue("Scene.67P.Renderable.ProjectionComponent.PerformProjection") ) ]], Documentation = "Enables or disables the image projection on 67P", diff --git a/data/assets/scene/solarsystem/missions/rosetta/actions.asset b/data/assets/scene/solarsystem/missions/rosetta/actions.asset index 3b97f170f7..48c096def2 100644 --- a/data/assets/scene/solarsystem/missions/rosetta/actions.asset +++ b/data/assets/scene/solarsystem/missions/rosetta/actions.asset @@ -2,9 +2,9 @@ local ToggleOuterPlanetaryTrails = { Identifier = "os.rosetta.ToggleOuterPlanetaryTrails", Name = "Toggle outer planetary trails", Command = [[ - local list = openspace.getProperty("{planetTrail_giants}.Renderable.Enabled") + local list = openspace.property("{planetTrail_giants}.Renderable.Enabled") for _,v in pairs(list) do - openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + openspace.setPropertyValueSingle(v, not openspace.propertyValue(v)) end ]], Documentation = "Toggles the visibility of all trails further from the Sun than 67P", diff --git a/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset b/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset index c18ba5bfa2..1d794f3130 100644 --- a/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset +++ b/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset @@ -298,7 +298,7 @@ local ToggleImagePlane = { Command = [[ openspace.setPropertyValueSingle( "Scene.ImagePlaneRosetta.Renderable.Enabled", - not openspace.getPropertyValue("Scene.ImagePlaneRosetta.Renderable.Enabled") + not openspace.propertyValue("Scene.ImagePlaneRosetta.Renderable.Enabled") ) ]], Documentation = "Toggles the visibility of the free floating image plane", @@ -312,7 +312,7 @@ local TogglePhilaeTrail = { Command = [[ openspace.setPropertyValueSingle( "Scene.PhilaeTrail.Renderable.Enabled", - not openspace.getPropertyValue("Scene.PhilaeTrail.Renderable.Enabled") + not openspace.propertyValue("Scene.PhilaeTrail.Renderable.Enabled") ) ]], Documentation = "Toggles the visibility of Philae's trail", diff --git a/data/assets/scene/solarsystem/missions/voyager/actions.asset b/data/assets/scene/solarsystem/missions/voyager/actions.asset index 44d11901c6..d8e1a39f4f 100644 --- a/data/assets/scene/solarsystem/missions/voyager/actions.asset +++ b/data/assets/scene/solarsystem/missions/voyager/actions.asset @@ -50,9 +50,9 @@ local ToggleMinorMoonTrails = { Identifier = "os.voyager.ToggleMinorMoonTrails", Name = "Toggle minor trails", Command = [[ - local list = openspace.getProperty("{moonTrail_minor}.Renderable.Enabled") + local list = openspace.property("{moonTrail_minor}.Renderable.Enabled") for _,v in pairs(list) do - openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + openspace.setPropertyValueSingle(v, not openspace.propertyValue(v)) end ]], Documentation = "Toggles the trails of the minor moons", diff --git a/data/assets/scene/solarsystem/planets/earth/earth.asset b/data/assets/scene/solarsystem/planets/earth/earth.asset index e970802f7f..2c65e6484d 100644 --- a/data/assets/scene/solarsystem/planets/earth/earth.asset +++ b/data/assets/scene/solarsystem/planets/earth/earth.asset @@ -93,9 +93,9 @@ local ToggleSatelliteTrails = { Identifier = "os.solarsystem.ToggleSatelliteTrails", Name = "Toggle satellite trails", Command = [[ - local list = openspace.getProperty("{earth_satellites}.Renderable.Enabled") + local list = openspace.property("{earth_satellites}.Renderable.Enabled") for _,v in pairs(list) do - openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + openspace.setPropertyValueSingle(v, not openspace.propertyValue(v)) end ]], Documentation = "Toggle trails on or off for satellites around Earth", diff --git a/data/assets/scene/solarsystem/planets/earth/moon/moon.asset b/data/assets/scene/solarsystem/planets/earth/moon/moon.asset index a0105c1798..6d2e79612b 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/moon.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/moon.asset @@ -103,7 +103,7 @@ local ToggleMoonShading = { Command = [[ openspace.setPropertyValueSingle( "Scene.Moon.Renderable.PerformShading", - not openspace.getPropertyValue("Scene.Moon.Renderable.PerformShading") + not openspace.propertyValue("Scene.Moon.Renderable.PerformShading") ) ]], Documentation = "Toggles the shading of the Moon", diff --git a/data/assets/scene/solarsystem/planets/jupiter/major_moons.asset b/data/assets/scene/solarsystem/planets/jupiter/major_moons.asset index 6a42b2842c..e0eb196004 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/major_moons.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/major_moons.asset @@ -9,11 +9,11 @@ local JupiterMajorMoonsOn = { Identifier = "os.solarsystem.JupiterMajorMoonsOn", Name = "Turn ON major moons and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_major_jupiter}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_major_jupiter}.Renderable.Fade") + local trails = openspace.property("{moonTrail_major_jupiter}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_major_jupiter}.Renderable.Fade") - local moons = openspace.getProperty("{moon_major_jupiter}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_major_jupiter}.Renderable.Fade") + local moons = openspace.property("{moon_major_jupiter}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_major_jupiter}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle(trails[i], true) @@ -34,11 +34,11 @@ local JupiterMajorMoonsOff = { Identifier = "os.solarsystem.JupiterMajorMoonsOff", Name = "Turn OFF majors moon and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_major_jupiter}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_major_jupiter}.Renderable.Fade") + local trails = openspace.property("{moonTrail_major_jupiter}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_major_jupiter}.Renderable.Fade") - local moons = openspace.getProperty("{moon_major_jupiter}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_major_jupiter}.Renderable.Fade") + local moons = openspace.property("{moon_major_jupiter}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_major_jupiter}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle( diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor_moons.asset b/data/assets/scene/solarsystem/planets/jupiter/minor_moons.asset index 5d7b4f1d81..67292c4586 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor_moons.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor_moons.asset @@ -13,11 +13,11 @@ local JupiterMinorMoonsOn = { Identifier = "os.solarsystem.JupiterMinorMoonsOn", Name = "Turn ON minor moons and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_minor_jupiter}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_minor_jupiter}.Renderable.Fade") + local trails = openspace.property("{moonTrail_minor_jupiter}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_minor_jupiter}.Renderable.Fade") - local moons = openspace.getProperty("{moon_minor_jupiter}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_minor_jupiter}.Renderable.Fade") + local moons = openspace.property("{moon_minor_jupiter}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_minor_jupiter}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle(trails[i], true) @@ -38,11 +38,11 @@ local JupiterMinorMoonsOff = { Identifier = "os.solarsystem.JupiterMinorMoonsOff", Name = "Turn OFF minors moon and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_minor_jupiter}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_minor_jupiter}.Renderable.Fade") + local trails = openspace.property("{moonTrail_minor_jupiter}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_minor_jupiter}.Renderable.Fade") - local moons = openspace.getProperty("{moon_minor_jupiter}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_minor_jupiter}.Renderable.Fade") + local moons = openspace.property("{moon_minor_jupiter}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_minor_jupiter}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle( diff --git a/data/assets/scene/solarsystem/planets/neptune/major_moons.asset b/data/assets/scene/solarsystem/planets/neptune/major_moons.asset index 22692658ce..d8040bb25b 100644 --- a/data/assets/scene/solarsystem/planets/neptune/major_moons.asset +++ b/data/assets/scene/solarsystem/planets/neptune/major_moons.asset @@ -8,11 +8,11 @@ local NeptuneMajorMoonsOn = { Identifier = "os.solarsystem.NeptuneMajorMoonsOn", Name = "Turn on major moons and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_major_neptune}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_major_neptune}.Renderable.Fade") + local trails = openspace.property("{moonTrail_major_neptune}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_major_neptune}.Renderable.Fade") - local moons = openspace.getProperty("{moon_major_neptune}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_major_neptune}.Renderable.Fade") + local moons = openspace.property("{moon_major_neptune}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_major_neptune}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle(trails[i], true) @@ -33,11 +33,11 @@ local NeptuneMajorMoonsOff = { Identifier = "os.solarsystem.NeptuneMajorMoonsOff", Name = "Turn off majors moon and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_major_neptune}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_major_neptune}.Renderable.Fade") + local trails = openspace.property("{moonTrail_major_neptune}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_major_neptune}.Renderable.Fade") - local moons = openspace.getProperty("{moon_major_neptune}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_major_neptune}.Renderable.Fade") + local moons = openspace.property("{moon_major_neptune}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_major_neptune}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle( diff --git a/data/assets/scene/solarsystem/planets/neptune/minor_moons.asset b/data/assets/scene/solarsystem/planets/neptune/minor_moons.asset index a87f91fed6..e30c04a6a1 100644 --- a/data/assets/scene/solarsystem/planets/neptune/minor_moons.asset +++ b/data/assets/scene/solarsystem/planets/neptune/minor_moons.asset @@ -7,11 +7,11 @@ local NeptuneMinorMoonsOn = { Identifier = "os.solarsystem.NeptuneMinorMoonsOn", Name = "Turn on minor moons and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_minor_neptune}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_minor_neptune}.Renderable.Fade") + local trails = openspace.property("{moonTrail_minor_neptune}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_minor_neptune}.Renderable.Fade") - local moons = openspace.getProperty("{moon_minor_neptune}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_minor_neptune}.Renderable.Fade") + local moons = openspace.property("{moon_minor_neptune}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_minor_neptune}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle(trails[i], true) @@ -32,11 +32,11 @@ local NeptuneMinorMoonsOff = { Identifier = "os.solarsystem.NeptuneMinorMoonsOff", Name = "Turn off minors moon and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_minor_neptune}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_minor_neptune}.Renderable.Fade") + local trails = openspace.property("{moonTrail_minor_neptune}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_minor_neptune}.Renderable.Fade") - local moons = openspace.getProperty("{moon_minor_neptune}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_minor_neptune}.Renderable.Fade") + local moons = openspace.property("{moon_minor_neptune}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_minor_neptune}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle( diff --git a/data/assets/scene/solarsystem/planets/saturn/major_moons.asset b/data/assets/scene/solarsystem/planets/saturn/major_moons.asset index 55dc4dd87e..8f7aa38c72 100644 --- a/data/assets/scene/solarsystem/planets/saturn/major_moons.asset +++ b/data/assets/scene/solarsystem/planets/saturn/major_moons.asset @@ -14,11 +14,11 @@ local SaturnMajorMoonsOn = { Identifier = "os.solarsystem.SaturnMajorMoonsOn", Name = "Turn ON major moons and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_major_saturn}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_major_saturn}.Renderable.Fade") + local trails = openspace.property("{moonTrail_major_saturn}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_major_saturn}.Renderable.Fade") - local moons = openspace.getProperty("{moon_major_saturn}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_major_saturn}.Renderable.Fade") + local moons = openspace.property("{moon_major_saturn}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_major_saturn}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle(trails[i], true) @@ -39,11 +39,11 @@ local SaturnMajorMoonsOff = { Identifier = "os.solarsystem.SaturnMajorMoonsOff", Name = "Turn OFF majors moon and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_major_saturn}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_major_saturn}.Renderable.Fade") + local trails = openspace.property("{moonTrail_major_saturn}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_major_saturn}.Renderable.Fade") - local moons = openspace.getProperty("{moon_major_saturn}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_major_saturn}.Renderable.Fade") + local moons = openspace.property("{moon_major_saturn}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_major_saturn}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle( diff --git a/data/assets/scene/solarsystem/planets/saturn/minor_moons.asset b/data/assets/scene/solarsystem/planets/saturn/minor_moons.asset index 1e6b513bad..f2db6cfe5f 100644 --- a/data/assets/scene/solarsystem/planets/saturn/minor_moons.asset +++ b/data/assets/scene/solarsystem/planets/saturn/minor_moons.asset @@ -10,11 +10,11 @@ local SaturnMinorMoonsOn = { Identifier = "os.solarsystem.SaturnMinorMoonsOn", Name = "Turn ON minor moons and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_minor_saturn}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_minor_saturn}.Renderable.Fade") + local trails = openspace.property("{moonTrail_minor_saturn}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_minor_saturn}.Renderable.Fade") - local moons = openspace.getProperty("{moon_minor_saturn}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_minor_saturn}.Renderable.Fade") + local moons = openspace.property("{moon_minor_saturn}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_minor_saturn}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle(trails[i], true) @@ -35,11 +35,11 @@ local SaturnMinorMoonsOff = { Identifier = "os.solarsystem.SaturnMinorMoonsOff", Name = "Turn OFF minors moon and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_minor_saturn}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_minor_saturn}.Renderable.Fade") + local trails = openspace.property("{moonTrail_minor_saturn}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_minor_saturn}.Renderable.Fade") - local moons = openspace.getProperty("{moon_minor_saturn}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_minor_saturn}.Renderable.Fade") + local moons = openspace.property("{moon_minor_saturn}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_minor_saturn}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle( diff --git a/data/assets/scene/solarsystem/planets/uranus/major_moons.asset b/data/assets/scene/solarsystem/planets/uranus/major_moons.asset index 4d5f5eade6..8b8d1c527b 100644 --- a/data/assets/scene/solarsystem/planets/uranus/major_moons.asset +++ b/data/assets/scene/solarsystem/planets/uranus/major_moons.asset @@ -353,11 +353,11 @@ local UranusMajorMoonsOn = { Identifier = "os.solarsystem.UranusMajorMoonsOn", Name = "Turn ON major moons and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_major_uranus}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_major_uranus}.Renderable.Fade") + local trails = openspace.property("{moonTrail_major_uranus}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_major_uranus}.Renderable.Fade") - local moons = openspace.getProperty("{moon_major_uranus}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_major_uranus}.Renderable.Fade") + local moons = openspace.property("{moon_major_uranus}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_major_uranus}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle(trails[i], true) @@ -378,11 +378,11 @@ local UranusMajorMoonsOff = { Identifier = "os.solarsystem.UranusMajorMoonsOff", Name = "Turn OFF majors moon and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_major_uranus}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_major_uranus}.Renderable.Fade") + local trails = openspace.property("{moonTrail_major_uranus}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_major_uranus}.Renderable.Fade") - local moons = openspace.getProperty("{moon_major_uranus}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_major_uranus}.Renderable.Fade") + local moons = openspace.property("{moon_major_uranus}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_major_uranus}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle( diff --git a/data/assets/scene/solarsystem/planets/uranus/minor_moons.asset b/data/assets/scene/solarsystem/planets/uranus/minor_moons.asset index ecdce57028..02e89109a3 100644 --- a/data/assets/scene/solarsystem/planets/uranus/minor_moons.asset +++ b/data/assets/scene/solarsystem/planets/uranus/minor_moons.asset @@ -8,11 +8,11 @@ local UranusMinorMoonsOn = { Identifier = "os.solarsystem.UranusMinorMoonsOn", Name = "Turn ON minor moons and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_minor_uranus}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_minor_uranus}.Renderable.Fade") + local trails = openspace.property("{moonTrail_minor_uranus}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_minor_uranus}.Renderable.Fade") - local moons = openspace.getProperty("{moon_minor_uranus}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_minor_uranus}.Renderable.Fade") + local moons = openspace.property("{moon_minor_uranus}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_minor_uranus}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle(trails[i], true) @@ -33,11 +33,11 @@ local UranusMinorMoonsOff = { Identifier = "os.solarsystem.UranusMinorMoonsOff", Name = "Turn OFF minors moon and trails", Command = [[ - local trails = openspace.getProperty("{moonTrail_minor_uranus}.Renderable.Enabled") - local trails_fade = openspace.getProperty("{moonTrail_minor_uranus}.Renderable.Fade") + local trails = openspace.property("{moonTrail_minor_uranus}.Renderable.Enabled") + local trails_fade = openspace.property("{moonTrail_minor_uranus}.Renderable.Fade") - local moons = openspace.getProperty("{moon_minor_uranus}.Renderable.Enabled") - local moons_fade = openspace.getProperty("{moon_minor_uranus}.Renderable.Fade") + local moons = openspace.property("{moon_minor_uranus}.Renderable.Enabled") + local moons_fade = openspace.property("{moon_minor_uranus}.Renderable.Fade") for i, v in pairs(trails_fade) do openspace.setPropertyValueSingle( diff --git a/data/assets/scene/solarsystem/sun/EUV_layer.asset b/data/assets/scene/solarsystem/sun/EUV_layer.asset index aeb1921870..2bb83577d3 100644 --- a/data/assets/scene/solarsystem/sun/EUV_layer.asset +++ b/data/assets/scene/solarsystem/sun/EUV_layer.asset @@ -38,11 +38,11 @@ local ToggleEuv = { Identifier = "os.solarsystem.ToggleEuv", Name = "Toggle EUV layer", Command = [[ - if openspace.getPropertyValue("Scene.EUV-Layer-bastille-day-2000.Renderable.Enabled") then + if openspace.propertyValue("Scene.EUV-Layer-bastille-day-2000.Renderable.Enabled") then openspace.setPropertyValueSingle( "Scene.EUV-Layer-bastille-day-2000.Renderable.Fade", 0.0, - openspace.getPropertyValue("OpenSpaceEngine.FadeDuration"), + openspace.propertyValue("OpenSpaceEngine.FadeDuration"), "Linear", 'openspace.setPropertyValueSingle("Scene.EUV-Layer-bastille-day-2000.Renderable.Enabled", false)' ) @@ -51,7 +51,7 @@ local ToggleEuv = { openspace.setPropertyValueSingle( "Scene.EUV-Layer-bastille-day-2000.Renderable.Fade", 1.0, - openspace.getPropertyValue("OpenSpaceEngine.FadeDuration"), + openspace.propertyValue("OpenSpaceEngine.FadeDuration"), "Linear" ) end diff --git a/data/assets/scene/solarsystem/telescopes/jwst/actions.asset b/data/assets/scene/solarsystem/telescopes/jwst/actions.asset index a0615e5196..d14c028896 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/actions.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/actions.asset @@ -2,9 +2,9 @@ local ToggleLagrangianPoints = { Identifier = "os.jwst.ToggleLagrangianPoints", Name = "Toggle Lagrangian points", Command = [[ - local list = openspace.getProperty("{lagrange_points_earth}.Renderable.Enabled") + local list = openspace.property("{lagrange_points_earth}.Renderable.Enabled") for _,v in pairs(list) do - openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + openspace.setPropertyValueSingle(v, not openspace.propertyValue(v)) end ]], Documentation = "Toggle points and labels for the Lagrangian points for Earth Sun system", @@ -16,9 +16,9 @@ local ToggleHudf = { Identifier = "os.jwst.ToggleHudf", Name = "Toggle Hubble Ultra Deep Field", Command = [[ - local list = openspace.getProperty("{mission_jwst_hudf}.*.Enabled") + local list = openspace.property("{mission_jwst_hudf}.*.Enabled") for _,v in pairs(list) do - openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + openspace.setPropertyValueSingle(v, not openspace.propertyValue(v)) end ]], Documentation = "Toggle Hubble Ultra Deep Field image and line towards its coordinate", @@ -30,9 +30,9 @@ local ToggleL2 = { Identifier = "os.jwst.ToggleL2", Name = "Toggle L2 line and small L2 label", Command = [[ - local list = openspace.getProperty("{lagrange_points_earth_l2_small}.*.Enabled") + local list = openspace.property("{lagrange_points_earth_l2_small}.*.Enabled") for _,v in pairs(list) do - openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + openspace.setPropertyValueSingle(v, not openspace.propertyValue(v)) end ]], Documentation = "Toggle L2 label, point and line", @@ -44,9 +44,9 @@ local ToggleFov = { Identifier = "os.jwst.ToggleFov", Name = "Toggle JWST field of view and view band", Command = [[ - local list = openspace.getProperty("{mission_jwst_fov}.*.Enabled") + local list = openspace.property("{mission_jwst_fov}.*.Enabled") for _,v in pairs(list) do - openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + openspace.setPropertyValueSingle(v, not openspace.propertyValue(v)) end ]], Documentation = "Toggle James Webb Space Telecope field of view and view band", @@ -82,7 +82,7 @@ local ToggleSunTrail = { Identifier = "os.jwst.ToggleSunTrail", Name = "Toggle JWST Sun trail", Command = [[ - local value = openspace.getPropertyValue("Scene.JWSTSunTrail.Renderable.Enabled") + local value = openspace.propertyValue("Scene.JWSTSunTrail.Renderable.Enabled") openspace.setPropertyValueSingle("Scene.JWSTSunTrail.Renderable.Enabled", not value) ]], Documentation = "Toggle JWST trail relative to the Sun", @@ -94,13 +94,13 @@ local ToggleTrailsExceptMoon = { Identifier = "os.jwst.ToggleTrailsExceptMoon", Name = "Toggle trails (except Moon)", Command = [[ - local list = openspace.getProperty("{planetTrail_solarSystem}.Renderable.Enabled") + local list = openspace.property("{planetTrail_solarSystem}.Renderable.Enabled") for _,v in pairs(list) do - openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + openspace.setPropertyValueSingle(v, not openspace.propertyValue(v)) end - local moonlist = openspace.getProperty("{moonTrail_solarSystem}.Renderable.Enabled") + local moonlist = openspace.property("{moonTrail_solarSystem}.Renderable.Enabled") for _,v in pairs(moonlist) do - openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + openspace.setPropertyValueSingle(v, not openspace.propertyValue(v)) end openspace.setPropertyValueSingle("Scene.MoonTrail.Renderable.Enabled", true) ]], @@ -119,7 +119,7 @@ local ToggleJwstTrails = { "Scene.JWSTTrailCoRevOrbit.Renderable.Enabled" } for _,v in pairs(list) do - openspace.setPropertyValueSingle(v, not openspace.getPropertyValue(v)) + openspace.setPropertyValueSingle(v, not openspace.propertyValue(v)) end ]], Documentation = "Toggle JWST launch, cruise and L2 co-revolving orbit trails, not the Sun trail", diff --git a/data/assets/scene/solarsystem/telescopes/jwst/timelapse.asset b/data/assets/scene/solarsystem/telescopes/jwst/timelapse.asset index ef0d2a4b7b..8ab0ec61c3 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/timelapse.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/timelapse.asset @@ -604,7 +604,7 @@ asset.onInitialize(function() end -- Update the dashboard text - local text = openspace.getPropertyValue("Dashboard.JWSTStateText.Text") + local text = openspace.propertyValue("Dashboard.JWSTStateText.Text") if string.len(text) > 14 then local newText = "" if text:sub(13, 13) == "-" then diff --git a/data/assets/scene/solarsystem/telescopes/jwst/toggle_trail.asset b/data/assets/scene/solarsystem/telescopes/jwst/toggle_trail.asset index 1866639228..63c9afc1e0 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/toggle_trail.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/toggle_trail.asset @@ -29,9 +29,9 @@ local ToggleTrail = { end else visibility = not ( - openspace.getPropertyValue("Scene." .. launchTrail .. ".Renderable.Enabled") or - openspace.getPropertyValue("Scene." .. cruiseTrail .. ".Renderable.Enabled") or - openspace.getPropertyValue("Scene." .. coRevOrbitTrail .. ".Renderable.Enabled") + openspace.propertyValue("Scene." .. launchTrail .. ".Renderable.Enabled") or + openspace.propertyValue("Scene." .. cruiseTrail .. ".Renderable.Enabled") or + openspace.propertyValue("Scene." .. coRevOrbitTrail .. ".Renderable.Enabled") ) end diff --git a/data/assets/util/dpiscaling.asset b/data/assets/util/dpiscaling.asset index d460088092..647f22b7ad 100644 --- a/data/assets/util/dpiscaling.asset +++ b/data/assets/util/dpiscaling.asset @@ -6,19 +6,19 @@ asset.onInitialize(function() if openspace.modules.isLoaded("CefWebGui") then openspace.setPropertyValueSingle( "Modules.CefWebGui.GuiScale", - openspace.getPropertyValue("Modules.CefWebGui.GuiScale") * scale + openspace.propertyValue("Modules.CefWebGui.GuiScale") * scale ) end - local dashboards = openspace.getProperty("Dashboard.*.FontSize") + local dashboards = openspace.property("Dashboard.*.FontSize") for _, v in ipairs(dashboards) do openspace.setPropertyValueSingle( v, - openspace.getPropertyValue(v) * scale + openspace.propertyValue(v) * scale ) end - local offset = openspace.getPropertyValue("Dashboard.StartPositionOffset") + local offset = openspace.propertyValue("Dashboard.StartPositionOffset") openspace.setPropertyValueSingle( "Dashboard.StartPositionOffset", { offset[1] * scale, offset[2] * scale } diff --git a/data/assets/util/property_helper.asset b/data/assets/util/property_helper.asset index d0c9809641..99f059b6a6 100644 --- a/data/assets/util/property_helper.asset +++ b/data/assets/util/property_helper.asset @@ -1,14 +1,14 @@ -- Function that returns the string that inverts the fully qualified boolean property 'property' function invert(prop) local escaped_property = [["]] .. prop .. [["]] - return "openspace.setPropertyValueSingle(" .. escaped_property .. ", not openspace.getPropertyValue(" .. escaped_property .. "))" + return "openspace.setPropertyValueSingle(" .. escaped_property .. ", not openspace.propertyValue(" .. escaped_property .. "))" end -- Function that returns the string that increments the 'property' by the 'value' function increment(prop, value) local v = value or 1 local escaped_property = [["]] .. prop .. [["]] - return "openspace.setPropertyValueSingle(" .. escaped_property .. ", openspace.getPropertyValue(" .. escaped_property .. ") + " .. v .. ")" + return "openspace.setPropertyValueSingle(" .. escaped_property .. ", openspace.propertyValue(" .. escaped_property .. ") + " .. v .. ")" end -- Function that returns the string that decrements the 'property' by the 'value' @@ -38,7 +38,7 @@ function fadeInOut(prop, duration) local escaped_property = [["]] .. prop .. [["]] -- If the value is > 0.5 fade out, otherwise fade in - return "local v = openspace.getPropertyValue(" .. escaped_property .. ") if v <= 0.5 then " .. fadeIn(prop, duration) .. " else " .. fadeOut(prop, duration) .. " end" + return "local v = openspace.propertyValue(" .. escaped_property .. ") if v <= 0.5 then " .. fadeIn(prop, duration) .. " else " .. fadeOut(prop, duration) .. " end" end asset.export("invert", invert) diff --git a/data/assets/util/screenshots_endpoint.asset b/data/assets/util/screenshots_endpoint.asset index f39066846e..09a1cbeb63 100644 --- a/data/assets/util/screenshots_endpoint.asset +++ b/data/assets/util/screenshots_endpoint.asset @@ -5,10 +5,10 @@ asset.onInitialize(function() -- remove automatic restart on each property change, since frequent restarting seems to -- be unstable on MacOS. - local enabled = openspace.getPropertyValue("Modules.WebGui.ServerProcessEnabled") + local enabled = openspace.propertyValue("Modules.WebGui.ServerProcessEnabled") openspace.setPropertyValueSingle("Modules.WebGui.ServerProcessEnabled", false) - local directories = openspace.getPropertyValue("Modules.WebGui.Directories") + local directories = openspace.propertyValue("Modules.WebGui.Directories") directories[#directories + 1] = "screenshots" directories[#directories + 1] = "${SCREENSHOTS}" openspace.setPropertyValueSingle("Modules.WebGui.Directories", directories) diff --git a/modules/exoplanets/exoplanetsmodule.cpp b/modules/exoplanets/exoplanetsmodule.cpp index 8747c43a26..5bda398894 100644 --- a/modules/exoplanets/exoplanetsmodule.cpp +++ b/modules/exoplanets/exoplanetsmodule.cpp @@ -346,7 +346,8 @@ scripting::LuaLibrary ExoplanetsModule::luaLibrary() const { { codegen::lua::AddExoplanetSystem, codegen::lua::RemoveExoplanetSystem, - codegen::lua::GetListOfExoplanets, + codegen::lua::ListOfExoplanets, + codegen::lua::ListOfExoplanetsDeprecated, codegen::lua::ListAvailableExoplanetSystems } }; diff --git a/modules/exoplanets/exoplanetsmodule_lua.inl b/modules/exoplanets/exoplanetsmodule_lua.inl index 8faa22754f..2552f2037d 100644 --- a/modules/exoplanets/exoplanetsmodule_lua.inl +++ b/modules/exoplanets/exoplanetsmodule_lua.inl @@ -639,11 +639,25 @@ std::vector hostStarsWithSufficientData() { ); } -[[codegen::luawrap]] std::vector getListOfExoplanets() { +[[codegen::luawrap]] std::vector listOfExoplanets() { std::vector names = hostStarsWithSufficientData(); return names; } +/** + * Deprecated in favor of 'listOfExoplanets' + */ +[[codegen::luawrap("getListOfExoplanets")]] std::vector +listOfExoplanetsDeprecated() +{ + LWARNINGC( + "Deprecation", + "'getListOfExoplanets' function is deprecated and should be replaced with " + "'listOfExoplanets'" + ); + return listOfExoplanets(); +} + [[codegen::luawrap]] void listAvailableExoplanetSystems() { std::vector names = hostStarsWithSufficientData(); diff --git a/modules/globebrowsing/globebrowsingmodule.cpp b/modules/globebrowsing/globebrowsingmodule.cpp index cbfb1b10c7..285a692dfe 100644 --- a/modules/globebrowsing/globebrowsingmodule.cpp +++ b/modules/globebrowsing/globebrowsingmodule.cpp @@ -692,15 +692,18 @@ scripting::LuaLibrary GlobeBrowsingModule::luaLibrary() const { .functions = { codegen::lua::AddLayer, codegen::lua::DeleteLayer, - codegen::lua::GetLayers, + codegen::lua::Layers, + codegen::lua::LayersDeprecated, codegen::lua::MoveLayer, codegen::lua::GoToChunk, codegen::lua::GoToGeo, // @TODO (2021-06-23, emmbr) Combine with the above function when the camera // paths work really well close to surfaces codegen::lua::FlyToGeo, - codegen::lua::GetLocalPositionFromGeo, - codegen::lua::GetGeoPositionForCamera, + codegen::lua::LocalPositionFromGeo, + codegen::lua::LocalPositionFromGeoDeprecated, + codegen::lua::GeoPositionForCamera, + codegen::lua::GeoPositionForCameraDeprecated, codegen::lua::LoadWMSCapabilities, codegen::lua::RemoveWMSServer, codegen::lua::CapabilitiesWMS, diff --git a/modules/globebrowsing/globebrowsingmodule_lua.inl b/modules/globebrowsing/globebrowsingmodule_lua.inl index 1332f4889d..78d9cd7c61 100644 --- a/modules/globebrowsing/globebrowsingmodule_lua.inl +++ b/modules/globebrowsing/globebrowsingmodule_lua.inl @@ -118,8 +118,8 @@ namespace { * Returns the list of layers for the scene graph node specified in the first parameter. * The second parameter specifies which layer type should be queried. */ -[[codegen::luawrap]] std::vector getLayers(std::string globeIdentifier, - std::string layer) +[[codegen::luawrap]] std::vector layers(std::string globeIdentifier, + std::string layer) { using namespace openspace; using namespace globebrowsing; @@ -150,6 +150,23 @@ namespace { return res; } +/** + * Returns the list of layers for the scene graph node specified in the first parameter. + * The second parameter specifies which layer type should be queried. Deprecated in favor + * of 'layers'. + */ +[[codegen::luawrap("getLayers")]] std::vector layersDeprecated( + std::string globeIdentifier, + std::string layer) +{ + LWARNINGC( + "Deprecation", + "'getLayers' function is deprecated and should be replaced with 'layers'" + ); + + return layers(std::move(globeIdentifier), std::move(layer)); +} + /** * Rearranges the order of a single layer on a globe. The first parameter is the * identifier of the globe, the second parameter specifies the name of the layer group, @@ -398,8 +415,8 @@ namespace { */ [[codegen::luawrap]] std::tuple -getLocalPositionFromGeo(std::string globeIdentifier, double latitude, double longitude, - double altitude) +localPositionFromGeo(std::string globeIdentifier, double latitude, double longitude, + double altitude) { using namespace openspace; using namespace globebrowsing; @@ -418,13 +435,39 @@ getLocalPositionFromGeo(std::string globeIdentifier, double latitude, double lon return { p.x, p.y, p.z }; } +/** + * Returns a position in the local Cartesian coordinate system of the globe identified by + * the first argument, that corresponds to the given geographic coordinates: latitude, + * longitude and altitude (in degrees and meters). In the local coordinate system, the + * position (0,0,0) corresponds to the globe's center. Deprecated in favor of + * 'localPositionFromGeo'. + */ +[[codegen::luawrap("getLocalPositionFromGeo")]] +std::tuple +localPositionFromGeoDeprecated(std::string globeIdentifier, double latitude, + double longitude, double altitude) +{ + LWARNINGC( + "Deprecation", + "'getLocalPositionFromGeo' function is deprecated and should be replaced with " + "'localPositionFromGeo'" + ); + + return localPositionFromGeo( + std::move(globeIdentifier), + latitude, + longitude, + altitude + ); +} + /** * Get geographic coordinates of the camera position in latitude, longitude, and altitude * (degrees and meters). If the optional bool paramater is specified, the camera * eye postion will be used instead */ -[[codegen::luawrap]] std::tuple -getGeoPositionForCamera(bool useEyePosition = false) +[[codegen::luawrap]] std::tuple geoPositionForCamera( + bool useEyePosition = false) { using namespace openspace; using namespace globebrowsing; @@ -477,6 +520,24 @@ getGeoPositionForCamera(bool useEyePosition = false) return { glm::degrees(geo2.lat), glm::degrees(geo2.lon), altitude }; } +/** + * Get geographic coordinates of the camera position in latitude, longitude, and altitude + * (degrees and meters). If the optional bool paramater is specified, the camera + * eye postion will be used instead. Deprecated in favor of 'geoPositionForCamera'. + */ +[[codegen::luawrap("getGeoPositionForCamera")]] +std::tuple +geoPositionForCameraDeprecated(bool useEyePosition = false) +{ + LWARNINGC( + "Deprecation", + "'getGeoPositionForCamera' function is deprecated and should be replaced with " + "'geoPositionForCamera'" + ); + + return geoPositionForCamera(useEyePosition); +} + /** * Loads and parses the WMS capabilities xml file from a remote server. The first argument * is the name of the capabilities that can be used to later refer to the set of diff --git a/src/scene/scene.cpp b/src/scene/scene.cpp index fb3bf6d809..f7c0244f20 100644 --- a/src/scene/scene.cpp +++ b/src/scene/scene.cpp @@ -835,14 +835,25 @@ scripting::LuaLibrary Scene::luaLibrary() { }, { "getPropertyValue", + &luascriptfunctions::propertyGetValueDeprecated, + {}, + "", + "Returns the value the property, identified by the provided URI. " + "Deprecated in favor of the 'propertyValue' function", + {} + }, + { + "propertyValue", &luascriptfunctions::propertyGetValue, {}, "", - "Returns the value the property, identified by the provided URI", + "Returns the value the property, identified by the provided URI. " + "Deprecated in favor of the 'propertyValue' function", {} }, codegen::lua::HasProperty, - codegen::lua::GetProperty, + codegen::lua::PropertyDeprecated, + codegen::lua::Property, codegen::lua::AddCustomProperty, codegen::lua::RemoveCustomProperty, codegen::lua::AddSceneGraphNode, diff --git a/src/scene/scene_lua.inl b/src/scene/scene_lua.inl index 96b2fb93c7..3fb52a7ab4 100644 --- a/src/scene/scene_lua.inl +++ b/src/scene/scene_lua.inl @@ -470,6 +470,16 @@ int propertyGetValue(lua_State* L) { return 1; } +int propertyGetValueDeprecated(lua_State* L) { + LWARNINGC( + "Deprecation", + "'getPropertyValue' function is deprecated and should be replaced with " + "'propertyValue'" + ); + + return propertyGetValue(L); +} + } // namespace openspace::luascriptfunctions namespace { @@ -485,7 +495,7 @@ namespace { /** * Returns a list of property identifiers that match the passed regular expression */ -[[codegen::luawrap]] std::vector getProperty(std::string regex) { +[[codegen::luawrap]] std::vector property(std::string regex) { using namespace openspace; std::string groupName; @@ -591,6 +601,19 @@ namespace { return res; } +/** + * Returns a list of property identifiers that match the passed regular expression + */ +[[codegen::luawrap("getProperty")]] std::vector propertyDeprecated( + std::string regex) +{ + LWARNINGC( + "Deprecation", + "'getProperty' function is deprecated and should be replaced with 'property'" + ); + return property(std::move(regex)); +} + /** * Loads the SceneGraphNode described in the table and adds it to the SceneGraph. */ From 399dc323af70cd01d2a9e033a44b9b8c6d438634 Mon Sep 17 00:00:00 2001 From: GPayne Date: Sun, 6 Aug 2023 15:08:00 -0600 Subject: [PATCH 072/701] Add search text box and filtering capability to profile assets editor --- .../launcher/include/profile/assetsdialog.h | 35 ++++++- .../ext/launcher/src/profile/assetsdialog.cpp | 92 ++++++++++++++++--- 2 files changed, 112 insertions(+), 15 deletions(-) diff --git a/apps/OpenSpace/ext/launcher/include/profile/assetsdialog.h b/apps/OpenSpace/ext/launcher/include/profile/assetsdialog.h index 85714b26bb..5ad607efb2 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/assetsdialog.h +++ b/apps/OpenSpace/ext/launcher/include/profile/assetsdialog.h @@ -26,12 +26,36 @@ #define __OPENSPACE_UI_LAUNCHER___ASSETSDIALOG___H__ #include - +#include +#include #include "assettreemodel.h" class QTextEdit; class QTreeView; +class SearchProxyModel : public QSortFilterProxyModel { +public: + /** + * Constructor for SearchProxyModel class + * + * \param parent The QObject* object that is the Qt parent of this object + */ + SearchProxyModel(QObject* parent = nullptr) : QSortFilterProxyModel(parent) {} + + /** + * Sets the regular expression pattern to apply to the filter + * + * \param pattern The QString reference containing the regex pattern + */ + void setFilterRegExp(const QString& pattern); + +protected: + bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const override; + +private: + bool acceptIndex(const QModelIndex& idx) const; +}; + class AssetsDialog final : public QDialog { Q_OBJECT public: @@ -48,12 +72,14 @@ public: AssetsDialog(QWidget* parent, openspace::Profile* profile, const std::string& assetBasePath, const std::string& userAssetBasePath); +private slots: + void searchTextChanged(const QString& text); + private: void createWidgets(); - + void setViewToBaseModel(); void parseSelections(); void selected(const QModelIndex&); - /// Creates a text summary of all assets and their paths QString createTextSummary(); void openAssetEditor(); @@ -61,7 +87,10 @@ private: openspace::Profile* _profile = nullptr; AssetTreeModel _assetTreeModel; QTreeView* _assetTree = nullptr; + QLineEdit* _searchTextBox = nullptr; QTextEdit* _summary = nullptr; + QSortFilterProxyModel* _assetProxyModel = nullptr; + SearchProxyModel* _searchProxyModel = nullptr; }; #endif // __OPENSPACE_UI_LAUNCHER___ASSETSDIALOG___H__ diff --git a/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp index 897b7c2e5f..dedc8deb20 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp @@ -62,7 +62,6 @@ namespace { void traverseToFindFilesystemMatch(AssetTreeModel& model, QModelIndex parent, int nRows, const std::string& path) { - int startIndex = 0; std::string token = "${USER_ASSETS}/"; if (path.find(token) == 0) { @@ -152,6 +151,15 @@ AssetsDialog::AssetsDialog(QWidget* parent, openspace::Profile* profile, newAssetButton->setDefault(false); container->addWidget(newAssetButton, 0, 2); layout->addLayout(container); + + QLabel* searchLabel = new QLabel("Search: "); + searchLabel->setObjectName("heading"); + _searchTextBox = new QLineEdit; + _searchTextBox->setClearButtonEnabled(true); + QBoxLayout* layoutSearchBox = new QHBoxLayout; + layoutSearchBox->addWidget(searchLabel); + layoutSearchBox->addWidget(_searchTextBox); + layout->addLayout(layoutSearchBox); } { _assetTree = new QTreeView; @@ -160,17 +168,7 @@ AssetsDialog::AssetsDialog(QWidget* parent, openspace::Profile* profile, "Enable checkbox to include an asset. Those assets highlighted in red are " "present in the profile but do not exist in this OpenSpace installation" ); - _assetTree->setAlternatingRowColors(true); - _assetTree->setModel(&_assetTreeModel); - _assetTree->setRootIndex(_assetTreeModel.index(-1, 0)); - _assetTree->setColumnWidth(1, 60); - _assetTree->setColumnWidth(0, _assetTree->width() - 60); - _assetTree->header()->setSectionResizeMode(0, QHeaderView::Stretch); - _assetTree->header()->setSectionResizeMode(1, QHeaderView::Fixed); - _assetTree->header()->setStretchLastSection(false); - _assetTree->setAnimated(true); - _assetTree->setSortingEnabled(false); - _assetTree->setSelectionMode(QAbstractItemView::SingleSelection); + setViewToBaseModel(); connect(_assetTree, &QTreeView::clicked, this, &AssetsDialog::selected); @@ -215,8 +213,31 @@ AssetsDialog::AssetsDialog(QWidget* parent, openspace::Profile* profile, buttons, &QDialogButtonBox::rejected, this, &AssetsDialog::reject ); + connect( + _searchTextBox, &QLineEdit::textChanged, + this, &AssetsDialog::searchTextChanged + ); layout->addWidget(buttons); } + { + _searchProxyModel = new SearchProxyModel(this); + _searchProxyModel->setSourceModel(&_assetTreeModel); + _assetProxyModel = qobject_cast(_searchProxyModel); + } +} + +void AssetsDialog::setViewToBaseModel() { + _assetTree->setAlternatingRowColors(true); + _assetTree->setModel(&_assetTreeModel); + _assetTree->setRootIndex(_assetTreeModel.index(-1, 0)); + _assetTree->setColumnWidth(1, 60); + _assetTree->setColumnWidth(0, _assetTree->width() - 60); + _assetTree->header()->setSectionResizeMode(0, QHeaderView::Stretch); + _assetTree->header()->setSectionResizeMode(1, QHeaderView::Fixed); + _assetTree->header()->setStretchLastSection(false); + _assetTree->setAnimated(true); + _assetTree->setSortingEnabled(false); + _assetTree->setSelectionMode(QAbstractItemView::SingleSelection); } QString AssetsDialog::createTextSummary() { @@ -259,3 +280,50 @@ void AssetsDialog::parseSelections() { void AssetsDialog::selected(const QModelIndex&) { _summary->setText(createTextSummary()); } + +void AssetsDialog::searchTextChanged(const QString& text) { + if (!_assetProxyModel) { + return; + } + if (text.isEmpty()) { + setViewToBaseModel(); + traverseToExpandSelectedItems( + *_assetTree, + _assetTreeModel, + _assetTreeModel.rowCount(_assetTreeModel.index(-1, 0)), + _assetTreeModel.index(-1, 0) + ); + } + else { + _assetTree->setModel(_searchProxyModel); + _assetProxyModel->setFilterRegExp(text); + _assetTree->expandAll(); + } +} + +void SearchProxyModel::setFilterRegExp(const QString& pattern) { + QRegExp regex(pattern, Qt::CaseInsensitive, QRegExp::FixedString); + QSortFilterProxyModel::setFilterRegExp(regex); +} + +bool SearchProxyModel::filterAcceptsRow(int sourceRow, + const QModelIndex& sourceParent) const +{ + QModelIndex idx = sourceModel()->index(sourceRow, 0, sourceParent); + return acceptIndex(idx); +} + +bool SearchProxyModel::acceptIndex(const QModelIndex& idx) const { + if (idx.isValid()) { + QString text = idx.data(Qt::DisplayRole).toString(); + if (filterRegExp().indexIn(text) >= 0) { + return true; + } + for (int row = 0; row < idx.model()->rowCount(idx); ++row) { + if (acceptIndex(idx.model()->index(row, 0, idx))) { + return true; + } + } + } + return false; +} From 8b923f3a4bc35fdca99f8406ad2f7474cd1c0afd Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Mon, 7 Aug 2023 09:08:40 +0200 Subject: [PATCH 073/701] Fix compiler error in geojson shaders Cuases problems with GeoJson on some graphics cards --- modules/globebrowsing/shaders/geojson_fs.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/globebrowsing/shaders/geojson_fs.glsl b/modules/globebrowsing/shaders/geojson_fs.glsl index 7cb33a3825..7d3496e9ca 100644 --- a/modules/globebrowsing/shaders/geojson_fs.glsl +++ b/modules/globebrowsing/shaders/geojson_fs.glsl @@ -35,7 +35,7 @@ uniform float ambientIntensity = 0.2; uniform float diffuseIntensity = 0.8; uniform bool performShading = true; -uniform unsigned int nLightSources; +uniform uint nLightSources; uniform vec3 lightDirectionsViewSpace[8]; uniform float lightIntensities[8]; From 15dbe323412e23556bd4bd894cfb51b77ca24747 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Mon, 7 Aug 2023 09:46:24 +0200 Subject: [PATCH 074/701] Make it possible to fade in/out RenderableFieldLinesSequences (e.g. magnetosphere) --- .../rendering/renderablefieldlinessequence.cpp | 4 ++++ modules/fieldlinessequence/shaders/fieldlinessequence_fs.glsl | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp b/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp index 37405e993b..92b10d7c1c 100644 --- a/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp +++ b/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp @@ -354,6 +354,8 @@ RenderableFieldlinesSequence::RenderableFieldlinesSequence( { 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; @@ -1031,6 +1033,8 @@ void RenderableFieldlinesSequence::render(const RenderData& data, RendererTasks& global::windowDelegate->applicationTime() * (_flowReversed ? -1 : 1) ); + _shaderProgram->setUniform("opacity", opacity()); + bool additiveBlending = false; if (_colorABlendEnabled) { additiveBlending = true; diff --git a/modules/fieldlinessequence/shaders/fieldlinessequence_fs.glsl b/modules/fieldlinessequence/shaders/fieldlinessequence_fs.glsl index f5eecf5ef0..946397875f 100644 --- a/modules/fieldlinessequence/shaders/fieldlinessequence_fs.glsl +++ b/modules/fieldlinessequence/shaders/fieldlinessequence_fs.glsl @@ -28,7 +28,7 @@ in vec4 vs_color; in float vs_depth; uniform bool usingAdditiveBlending; - +uniform float opacity; Fragment getFragment() { if (vs_color.a == 0) { @@ -40,6 +40,7 @@ Fragment getFragment() { Fragment frag; frag.depth = vs_depth; frag.color = fragColor; + frag.color.a *= opacity; // G-Buffer frag.gPosition = vec4(0.0);//vs_gPosition; From add6df05fd7b478e6f7ea4f0784de0a9b7cad59c Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Mon, 7 Aug 2023 10:08:21 +0200 Subject: [PATCH 075/701] Replace some more `getPropertyValue` function calls (deprecated) --- data/assets/util/webgui.asset | 10 +++++----- scripts/core_scripts.lua | 28 ++++++++++++++-------------- src/interaction/touchbar.mm | 4 ++-- src/rendering/renderengine.cpp | 6 +++--- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/data/assets/util/webgui.asset b/data/assets/util/webgui.asset index 2892f6e71c..aa59aa8000 100644 --- a/data/assets/util/webgui.asset +++ b/data/assets/util/webgui.asset @@ -27,10 +27,10 @@ asset.onInitialize(function() -- and remove automatic restart on each property change, -- since frequent restarting seems to be unstable on mac. - local enabled = openspace.getPropertyValue("Modules.WebGui.ServerProcessEnabled") + local enabled = openspace.propertyValue("Modules.WebGui.ServerProcessEnabled") openspace.setPropertyValueSingle("Modules.WebGui.ServerProcessEnabled", false) - local directories = openspace.getPropertyValue("Modules.WebGui.Directories") + local directories = openspace.propertyValue("Modules.WebGui.Directories") directories[#directories + 1] = "frontend" directories[#directories + 1] = frontend .. "frontend" @@ -40,7 +40,7 @@ asset.onInitialize(function() -- The GUI contains date and simulation increment, -- so let's remove these from the dashboard. - if openspace.getPropertyValue("Modules.CefWebGui.Visible") then + if openspace.propertyValue("Modules.CefWebGui.Visible") then if openspace.hasProperty("Dashboard.Date.Enabled") then openspace.setPropertyValueSingle("Dashboard.Date.Enabled", false) end @@ -52,7 +52,7 @@ end) asset.onDeinitialize(function() -- Remove the frontend endpoint - local directories = openspace.getPropertyValue("Modules.WebGui.Directories") + local directories = openspace.propertyValue("Modules.WebGui.Directories") local newDirectories = {} -- @TODO(maci, 2019-08-23) see message below @@ -73,7 +73,7 @@ asset.onDeinitialize(function() end) function setCefRoute(route) - local port = openspace.getPropertyValue("Modules.WebGui.Port") + local port = openspace.propertyValue("Modules.WebGui.Port") -- As a developer, you can manually serve the webgui from port 4690 -- with the command `npm start` in the web gui repository if guiCustomization.webguiDevelopmentMode then diff --git a/scripts/core_scripts.lua b/scripts/core_scripts.lua index 8a0c434a99..602b50e5a5 100644 --- a/scripts/core_scripts.lua +++ b/scripts/core_scripts.lua @@ -146,7 +146,7 @@ openspace.rebindKey = function(oldKey, newKey) end openspace.appendToListProperty = function(propertyIdentifier, newItem) - local list = openspace.getPropertyValue(propertyIdentifier) + local list = openspace.propertyValue(propertyIdentifier) if type(list) ~= 'table' then openspace.printError( "Error when calling script 'openspace.appendToListProperty': " .. @@ -159,7 +159,7 @@ openspace.appendToListProperty = function(propertyIdentifier, newItem) end openspace.addToPropertyValue = function(propertyIdentifier, valueToAdd) - local value = openspace.getPropertyValue(propertyIdentifier) + local value = openspace.propertyValue(propertyIdentifier) if type(value) == 'string' then value = value .. valueToAdd; else @@ -169,7 +169,7 @@ openspace.addToPropertyValue = function(propertyIdentifier, valueToAdd) end openspace.invertBooleanProperty = function(propertyIdentifier) - local value = openspace.getPropertyValue(propertyIdentifier) + local value = openspace.propertyValue(propertyIdentifier) if type(value) ~= 'boolean' then openspace.printError( "Error when calling script 'openspace.invertBooleanProperty': " .. @@ -183,7 +183,7 @@ end openspace.fadeIn = function(identifier, fadeTime, endScript) -- Set default values for optional arguments endScript = endScript or "" - fadeTime = fadeTime or openspace.getPropertyValue("OpenSpaceEngine.FadeDuration") + fadeTime = fadeTime or openspace.propertyValue("OpenSpaceEngine.FadeDuration") local enabledProperty = identifier .. ".Enabled" local fadeProperty = identifier .. ".Fade" @@ -197,7 +197,7 @@ openspace.fadeIn = function(identifier, fadeTime, endScript) if hasTag ~= nil or hasWild ~= nil then -- Regex, several nodes - local enabledPropertyList = openspace.getProperty(enabledProperty) + local enabledPropertyList = openspace.property(enabledProperty) if next(enabledPropertyList) == nil then -- List is empty, no matches found openspace.printError( @@ -207,7 +207,7 @@ openspace.fadeIn = function(identifier, fadeTime, endScript) return end - local fadePropertyList = openspace.getProperty(fadeProperty) + local fadePropertyList = openspace.property(fadeProperty) if next(fadePropertyList) == nil then -- List is empty, no matches found openspace.printError( @@ -234,7 +234,7 @@ openspace.fadeIn = function(identifier, fadeTime, endScript) ) return else - isEnabled = openspace.getPropertyValue(enabledProperty) + isEnabled = openspace.propertyValue(enabledProperty) end end @@ -250,7 +250,7 @@ end openspace.fadeOut = function(identifier, fadeTime, endScript) -- Set default values for optional arguments endScript = endScript or "" - fadeTime = fadeTime or openspace.getPropertyValue("OpenSpaceEngine.FadeDuration") + fadeTime = fadeTime or openspace.propertyValue("OpenSpaceEngine.FadeDuration") local enabledProperty = identifier .. ".Enabled" local fadeProperty = identifier .. ".Fade" @@ -264,7 +264,7 @@ openspace.fadeOut = function(identifier, fadeTime, endScript) if hasTag ~= nil or hasWild ~= nil then -- Regex, several nodes - local enabledPropertyList = openspace.getProperty(enabledProperty) + local enabledPropertyList = openspace.property(enabledProperty) if next(enabledPropertyList) == nil then -- List is empty, no matches found openspace.printError( @@ -274,7 +274,7 @@ openspace.fadeOut = function(identifier, fadeTime, endScript) return end - local fadePropertyList = openspace.getProperty(fadeProperty) + local fadePropertyList = openspace.property(fadeProperty) if next(fadePropertyList) == nil then -- List is empty, no matches found openspace.printError( @@ -301,7 +301,7 @@ openspace.fadeOut = function(identifier, fadeTime, endScript) ) return else - isEnabled = openspace.getPropertyValue(enabledProperty) + isEnabled = openspace.propertyValue(enabledProperty) end end @@ -319,10 +319,10 @@ end openspace.toggleFade = function(renderable, fadeTime, endScript) if (fadeTime == nil) then - fadeTime = openspace.getPropertyValue("OpenSpaceEngine.FadeDuration") + fadeTime = openspace.propertyValue("OpenSpaceEngine.FadeDuration") end - local enabled = openspace.getPropertyValue(renderable .. ".Enabled") - local fadeState = openspace.getPropertyValue(renderable .. ".Fade") + local enabled = openspace.propertyValue(renderable .. ".Enabled") + local fadeState = openspace.propertyValue(renderable .. ".Fade") if (enabled) then if (fadeState < 0.5) then openspace.fadeIn(renderable, fadeTime-(fadeTime*fadeState), endScript) diff --git a/src/interaction/touchbar.mm b/src/interaction/touchbar.mm index 3e67369240..6f8bbbf1c4 100644 --- a/src/interaction/touchbar.mm +++ b/src/interaction/touchbar.mm @@ -206,7 +206,7 @@ NSArray* focusIdentifiers; (void)sender; global::scriptEngine->queueScript( - "local isEnabled = openspace.getPropertyValue('Dashboard.IsEnabled');\ + "local isEnabled = openspace.propertyValue('Dashboard.IsEnabled');\ openspace.setPropertyValueSingle('Dashboard.IsEnabled', not isEnabled);\ openspace.setPropertyValueSingle('RenderEngine.ShowLog', not isEnabled);\ openspace.setPropertyValueSingle('RenderEngine.ShowVersion', not isEnabled);\ @@ -219,7 +219,7 @@ NSArray* focusIdentifiers; // Remove unused variable warning (void)sender; global::scriptEngine->queueScript( - "local isEnabled = openspace.getPropertyValue('Modules.CefWebGui.Visible');\ + "local isEnabled = openspace.propertyValue('Modules.CefWebGui.Visible');\ openspace.setPropertyValueSingle('Modules.CefWebGui.Visible', not isEnabled);", scripting::ScriptEngine::RemoteScripting::No ); diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 1c486dac18..f73dbcc2f6 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -772,7 +772,7 @@ bool RenderEngine::mouseActivationCallback(const glm::dvec2& mousePosition) cons if (intersects(mousePosition, _cameraButtonLocations.rotation)) { constexpr const char ToggleRotationFrictionScript[] = R"( local f = 'NavigationHandler.OrbitalNavigator.Friction.RotationalFriction'; - openspace.setPropertyValueSingle(f, not openspace.getPropertyValue(f));)"; + openspace.setPropertyValueSingle(f, not openspace.propertyValue(f));)"; global::scriptEngine->queueScript( ToggleRotationFrictionScript, @@ -784,7 +784,7 @@ bool RenderEngine::mouseActivationCallback(const glm::dvec2& mousePosition) cons if (intersects(mousePosition, _cameraButtonLocations.zoom)) { constexpr const char ToggleZoomFrictionScript[] = R"( local f = 'NavigationHandler.OrbitalNavigator.Friction.ZoomFriction'; - openspace.setPropertyValueSingle(f, not openspace.getPropertyValue(f));)"; + openspace.setPropertyValueSingle(f, not openspace.propertyValue(f));)"; global::scriptEngine->queueScript( ToggleZoomFrictionScript, @@ -796,7 +796,7 @@ bool RenderEngine::mouseActivationCallback(const glm::dvec2& mousePosition) cons if (intersects(mousePosition, _cameraButtonLocations.roll)) { constexpr const char ToggleRollFrictionScript[] = R"( local f = 'NavigationHandler.OrbitalNavigator.Friction.RollFriction'; - openspace.setPropertyValueSingle(f, not openspace.getPropertyValue(f));)"; + openspace.setPropertyValueSingle(f, not openspace.propertyValue(f));)"; global::scriptEngine->queueScript( ToggleRollFrictionScript, From 85100e13be9c4107429bfc8e364f6455ec2090ae Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Mon, 7 Aug 2023 10:19:43 +0200 Subject: [PATCH 076/701] Rename some more deprecated functions in Lua calls --- data/assets/nightsky/cardinal_directions.asset | 2 +- .../heliosphere/bastille_day/magnetogram_textures.asset | 2 +- modules/globebrowsing/scripts/node_support.lua | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/data/assets/nightsky/cardinal_directions.asset b/data/assets/nightsky/cardinal_directions.asset index cc3b68b854..e30d87ec94 100644 --- a/data/assets/nightsky/cardinal_directions.asset +++ b/data/assets/nightsky/cardinal_directions.asset @@ -65,7 +65,7 @@ local CardinalDirectionSphere = { } local showCommand = [[ - local lat, lon, alt = openspace.globebrowsing.getGeoPositionForCamera() + local lat, lon, alt = openspace.globebrowsing.geoPositionForCamera() local camera = openspace.navigation.getNavigationState() openspace.setParent("CardinalDirectionsPosition", camera.Anchor) openspace.setPropertyValueSingle("Scene.CardinalDirectionsPosition.Translation.Globe", camera.Anchor) diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/magnetogram_textures.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/magnetogram_textures.asset index 0455bc9b86..cfbe2e771a 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/magnetogram_textures.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/magnetogram_textures.asset @@ -8,7 +8,7 @@ local SwitchColorLayer = { Identifier = "os.bastilleday.magnetogramtexture.SwitchColorLayer", Name = "Next sun texture", Command = [[ - local textureList = openspace.globebrowsing.getLayers("Sun", "ColorLayers") + local textureList = openspace.globebrowsing.layers("Sun", "ColorLayers") if (magnetogramsTextureIndex == -1) then magnetogramsTextureIndex = 2 end diff --git a/modules/globebrowsing/scripts/node_support.lua b/modules/globebrowsing/scripts/node_support.lua index 800f6df164..35f275b7f8 100644 --- a/modules/globebrowsing/scripts/node_support.lua +++ b/modules/globebrowsing/scripts/node_support.lua @@ -34,7 +34,7 @@ openspace.globebrowsing.setNodePosition = function (node_identifer, globe_identi end openspace.globebrowsing.setNodePositionFromCamera = function (node_identifer, use_altitude) - local lat, lon, alt = openspace.globebrowsing.getGeoPositionForCamera(); + local lat, lon, alt = openspace.globebrowsing.geoPositionForCamera(); local camera = openspace.navigation.getNavigationState(); openspace.setParent(node_identifer, camera.Anchor) openspace.setPropertyValueSingle('Scene.' .. node_identifer .. '.Translation.Globe', camera.Anchor); From 786c2887da91fdcaf4d6e114974d4d416ad3da66 Mon Sep 17 00:00:00 2001 From: Malin E Date: Mon, 7 Aug 2023 11:47:32 +0200 Subject: [PATCH 077/701] Sphere maintenance (#2800) * Split RenderableSphere class into a local and online sphere * Make the video sphere derive from the regular sphere * Make RenderableTimeVaryingSphere derive from RenderableSphere * Some clean up * Address PR comments --- data/assets/examples/spheres.asset | 2 +- .../assets/nightsky/cardinal_directions.asset | 2 +- data/assets/nightsky/ecliptic_band.asset | 2 +- data/assets/nightsky/light_pollution.asset | 2 +- .../digitaluniverse/backgroundradiation.asset | 16 +- .../backgroundradiation_multiverse.asset | 8 +- .../digitaluniverse/milkyway_sphere.asset | 2 +- data/assets/scene/milkyway/milkyway/eso.asset | 2 +- .../solarsystem/telescopes/jwst/jwst.asset | 2 +- modules/base/CMakeLists.txt | 4 + modules/base/basemodule.cpp | 8 +- modules/base/rendering/renderablesphere.cpp | 181 ++++----- modules/base/rendering/renderablesphere.h | 24 +- .../rendering/renderablesphereimagelocal.cpp | 134 +++++++ .../rendering/renderablesphereimagelocal.h | 67 ++++ .../rendering/renderablesphereimageonline.cpp | 163 ++++++++ .../rendering/renderablesphereimageonline.h | 67 ++++ .../rendering/renderabletimevaryingsphere.cpp | 368 ++---------------- .../rendering/renderabletimevaryingsphere.h | 39 +- modules/spout/renderablespherespout.cpp | 3 +- modules/video/include/renderablevideoplane.h | 2 +- modules/video/include/renderablevideosphere.h | 45 +-- modules/video/src/renderablevideoplane.cpp | 2 +- modules/video/src/renderablevideosphere.cpp | 346 +--------------- 24 files changed, 604 insertions(+), 887 deletions(-) create mode 100644 modules/base/rendering/renderablesphereimagelocal.cpp create mode 100644 modules/base/rendering/renderablesphereimagelocal.h create mode 100644 modules/base/rendering/renderablesphereimageonline.cpp create mode 100644 modules/base/rendering/renderablesphereimageonline.h diff --git a/data/assets/examples/spheres.asset b/data/assets/examples/spheres.asset index df6afcfe81..1d3dd15195 100644 --- a/data/assets/examples/spheres.asset +++ b/data/assets/examples/spheres.asset @@ -13,7 +13,7 @@ for z = 1,3 do } }, Renderable = { - Type = "RenderableSphere", + Type = "RenderableSphereImageLocal", Size = 0.20 + i * 0.01, Segments = 80, Opacity = 1, diff --git a/data/assets/nightsky/cardinal_directions.asset b/data/assets/nightsky/cardinal_directions.asset index e30d87ec94..3edce459fe 100644 --- a/data/assets/nightsky/cardinal_directions.asset +++ b/data/assets/nightsky/cardinal_directions.asset @@ -48,7 +48,7 @@ local CardinalDirectionSphere = { } }, Renderable = { - Type = "RenderableSphere", + Type = "RenderableSphereImageLocal", Enabled = asset.enabled, Size = 50000, Segments = 80, diff --git a/data/assets/nightsky/ecliptic_band.asset b/data/assets/nightsky/ecliptic_band.asset index e7fbc319bd..90a89193cd 100644 --- a/data/assets/nightsky/ecliptic_band.asset +++ b/data/assets/nightsky/ecliptic_band.asset @@ -54,7 +54,7 @@ local EclipticBand = { } }, Renderable = { - Type = "RenderableSphere", + Type = "RenderableSphereImageLocal", Texture = textures .. "band2x.png", Size = 4.28601E17, Segments = 50, diff --git a/data/assets/nightsky/light_pollution.asset b/data/assets/nightsky/light_pollution.asset index a8850826dd..d2b6eace04 100644 --- a/data/assets/nightsky/light_pollution.asset +++ b/data/assets/nightsky/light_pollution.asset @@ -33,7 +33,7 @@ local LightPollutionSphere = { } }, Renderable = { - Type = "RenderableSphere", + Type = "RenderableSphereImageLocal", Size = earthAsset.Earth.Renderable.Radii[1] * 1.05, Segments = 40, Opacity = 0.0, diff --git a/data/assets/scene/digitaluniverse/backgroundradiation.asset b/data/assets/scene/digitaluniverse/backgroundradiation.asset index 32409116e5..0fd43a12ea 100644 --- a/data/assets/scene/digitaluniverse/backgroundradiation.asset +++ b/data/assets/scene/digitaluniverse/backgroundradiation.asset @@ -22,7 +22,7 @@ local WMAP = { } }, Renderable = { - Type = "RenderableSphere", + Type = "RenderableSphereImageLocal", Enabled = false, Size = 3975.41417036064E23, Segments = 80, @@ -47,7 +47,7 @@ local CBE = { } }, Renderable = { - Type = "RenderableSphere", + Type = "RenderableSphereImageLocal", Enabled = false, Size = 3975.41417036064E23, Segments = 80, @@ -72,7 +72,7 @@ local Planck = { } }, Renderable = { - Type = "RenderableSphere", + Type = "RenderableSphereImageLocal", Enabled = true, Size = 3975.41417036064E23, Segments = 80, @@ -98,7 +98,7 @@ local HAlpha = { } }, Renderable = { - Type = "RenderableSphere", + Type = "RenderableSphereImageLocal", Enabled = false, Size = 9.2E21, Segments = 40, @@ -141,10 +141,10 @@ asset.meta = { Name = "Background Radiation", Version = "2.1", Description = [[Various AllSky images for the Milky Way and observable Universe. - Included: Wilkinson Microwave Anisotropy Probe (WMAP), Cosmic Background Explorer, - Planck, and H Alpha

Data Reference: Planck/ESA and the Planck - Collaboration, Wilkinson Microwave Anisotropy Probe/NASA, Doug - Finkbeiner (Princeton)]], + Included: Wilkinson Microwave Anisotropy Probe (WMAP), Cosmic Background Explorer, + Planck, and H Alpha

Data Reference: Planck/ESA and the Planck + Collaboration, Wilkinson Microwave Anisotropy Probe/NASA, Doug + Finkbeiner (Princeton)]], Author = "Brian Abbott (AMNH), OpenSpace Team", URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe", License = "AMNH Digital Universe" diff --git a/data/assets/scene/digitaluniverse/backgroundradiation_multiverse.asset b/data/assets/scene/digitaluniverse/backgroundradiation_multiverse.asset index 70d83e7716..6633d975c9 100644 --- a/data/assets/scene/digitaluniverse/backgroundradiation_multiverse.asset +++ b/data/assets/scene/digitaluniverse/backgroundradiation_multiverse.asset @@ -19,7 +19,7 @@ local PlanckMultiverse1 = { } }, Renderable = { - Type = "RenderableSphere", + Type = "RenderableSphereImageLocal", Enabled = false, Size = 3975.41417036064E23, Segments = 80, @@ -48,7 +48,7 @@ local PlanckMultiverse2 = { } }, Renderable = { - Type = "RenderableSphere", + Type = "RenderableSphereImageLocal", Enabled = false, Size = 3975.41417036064E23, Segments = 80, @@ -77,7 +77,7 @@ local PlanckMultiverse3 = { } }, Renderable = { - Type = "RenderableSphere", + Type = "RenderableSphereImageLocal", Enabled = false, Size = 3975.41417036064E23, Segments = 80, @@ -106,7 +106,7 @@ local PlanckMultiverse4 = { } }, Renderable = { - Type = "RenderableSphere", + Type = "RenderableSphereImageLocal", Enabled = false, Size = 3975.41417036064E23, Segments = 80, diff --git a/data/assets/scene/digitaluniverse/milkyway_sphere.asset b/data/assets/scene/digitaluniverse/milkyway_sphere.asset index 65ed5cab71..1c4f51a7ad 100644 --- a/data/assets/scene/digitaluniverse/milkyway_sphere.asset +++ b/data/assets/scene/digitaluniverse/milkyway_sphere.asset @@ -15,7 +15,7 @@ local Sphere = { } }, Renderable = { - Type = "RenderableSphere", + Type = "RenderableSphereImageLocal", Size = 9.2E21, Segments = 40, Opacity = 0.25, diff --git a/data/assets/scene/milkyway/milkyway/eso.asset b/data/assets/scene/milkyway/milkyway/eso.asset index 8112beb9ab..47a51aee35 100644 --- a/data/assets/scene/milkyway/milkyway/eso.asset +++ b/data/assets/scene/milkyway/milkyway/eso.asset @@ -15,7 +15,7 @@ local Object = { } }, Renderable = { - Type = "RenderableSphere", + Type = "RenderableSphereImageLocal", Size = 9.2E20, Segments = 40, Opacity = 0.4, diff --git a/data/assets/scene/solarsystem/telescopes/jwst/jwst.asset b/data/assets/scene/solarsystem/telescopes/jwst/jwst.asset index 364181f76e..4c992a9fcf 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/jwst.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/jwst.asset @@ -43,7 +43,7 @@ local JWSTBand = { } }, Renderable = { - Type = "RenderableSphere", + Type = "RenderableSphereImageLocal", Texture = band .. "JWST-band.png", Size = 9.2E15, Segments = 50, diff --git a/modules/base/CMakeLists.txt b/modules/base/CMakeLists.txt index f37c8bc1a0..a0a14901f6 100644 --- a/modules/base/CMakeLists.txt +++ b/modules/base/CMakeLists.txt @@ -55,6 +55,8 @@ set(HEADER_FILES rendering/renderableplanetimevaryingimage.h rendering/renderableprism.h rendering/renderablesphere.h + rendering/renderablesphereimagelocal.h + rendering/renderablesphereimageonline.h rendering/renderabletimevaryingsphere.h rendering/renderabletrail.h rendering/renderabletrailorbit.h @@ -111,6 +113,8 @@ set(SOURCE_FILES rendering/renderableplanetimevaryingimage.cpp rendering/renderableprism.cpp rendering/renderablesphere.cpp + rendering/renderablesphereimagelocal.cpp + rendering/renderablesphereimageonline.cpp rendering/renderabletimevaryingsphere.cpp rendering/renderabletrail.cpp rendering/renderabletrailorbit.cpp diff --git a/modules/base/basemodule.cpp b/modules/base/basemodule.cpp index 7b8ef29316..0ab2488a03 100644 --- a/modules/base/basemodule.cpp +++ b/modules/base/basemodule.cpp @@ -48,7 +48,8 @@ #include #include #include -#include +#include +#include #include #include #include @@ -146,7 +147,8 @@ void BaseModule::internalInitialize(const ghoul::Dictionary&) { "RenderableTimeVaryingSphere" ); fRenderable->registerClass("RenderableRadialGrid"); - fRenderable->registerClass("RenderableSphere"); + fRenderable->registerClass("RenderableSphereImageLocal"); + fRenderable->registerClass("RenderableSphereImageOnline"); fRenderable->registerClass("RenderableSphericalGrid"); fRenderable->registerClass("RenderableTrailOrbit"); fRenderable->registerClass("RenderableTrailTrajectory"); @@ -226,6 +228,8 @@ std::vector BaseModule::documentations() const { RenderablePrism::Documentation(), RenderableRadialGrid::Documentation(), RenderableSphere::Documentation(), + RenderableSphereImageLocal::Documentation(), + RenderableSphereImageOnline::Documentation(), RenderableSphericalGrid::Documentation(), RenderableTimeVaryingSphere::Documentation(), RenderableTrailOrbit::Documentation(), diff --git a/modules/base/rendering/renderablesphere.cpp b/modules/base/rendering/renderablesphere.cpp index 640a768048..c734654687 100644 --- a/modules/base/rendering/renderablesphere.cpp +++ b/modules/base/rendering/renderablesphere.cpp @@ -31,13 +31,12 @@ #include #include #include -#include #include +#include #include -#include -#include -#include +#include #include +#include #include namespace { @@ -46,29 +45,27 @@ namespace { "colorTexture", "mirrorTexture" }; + constexpr openspace::properties::Property::PropertyInfo SizeInfo = { + "Size", + "Size (in meters)", + "This value specifies the radius of the sphere in meters", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo SegmentsInfo = { + "Segments", + "Number of Segments", + "This value specifies the number of segments that the sphere is separated in", + // @VISIBILITY(2.67) + openspace::properties::Property::Visibility::AdvancedUser + }; + enum class Orientation : int { Outside = 0, Inside, Both }; - constexpr openspace::properties::Property::PropertyInfo TextureInfo = { - "Texture", - "Texture", - "This value specifies an image that is loaded from disk and is used as a texture " - "that is applied to this sphere. This image is expected to be an equirectangular " - "projection", - // @VISIBILITY(2.33) - openspace::properties::Property::Visibility::User - }; - - constexpr openspace::properties::Property::PropertyInfo MirrorTextureInfo = { - "MirrorTexture", - "Mirror Texture", - "Mirror the texture along the x-axis", - openspace::properties::Property::Visibility::User - }; - constexpr openspace::properties::Property::PropertyInfo OrientationInfo = { "Orientation", "Orientation", @@ -77,30 +74,20 @@ namespace { openspace::properties::Property::Visibility::AdvancedUser }; - constexpr openspace::properties::Property::PropertyInfo SegmentsInfo = { - "Segments", - "Number of Segments", - "This value specifies the number of segments that the sphere is separated in", - // @VISIBILITY(2.67) + constexpr openspace::properties::Property::PropertyInfo MirrorTextureInfo = { + "MirrorTexture", + "Mirror Texture", + "Mirror the texture along the x-axis", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo DisableFadeInOutInfo = { + "DisableFadeInOut", + "Disable Fade-In/Fade-Out effects", + "Enables/Disables the fade in and out effects", openspace::properties::Property::Visibility::User }; - constexpr openspace::properties::Property::PropertyInfo SizeInfo = { - "Size", - "Size (in meters)", - "This value specifies the radius of the sphere in meters", - openspace::properties::Property::Visibility::AdvancedUser - }; - - constexpr openspace::properties::Property::PropertyInfo FadeOutThresholdInfo = { - "FadeOutThreshold", - "Fade-Out Threshold", - "This value determines percentage of the sphere that is visible before starting " - "to fade it out. A negative or zero value means no fading out will happen. This " - "is also the default", - openspace::properties::Property::Visibility::AdvancedUser - }; - constexpr openspace::properties::Property::PropertyInfo FadeInThresholdInfo = { "FadeInThreshold", "Fade-In Threshold", @@ -111,11 +98,13 @@ namespace { openspace::properties::Property::Visibility::AdvancedUser }; - constexpr openspace::properties::Property::PropertyInfo DisableFadeInOutInfo = { - "DisableFadeInOut", - "Disable Fade-In/Fade-Out effects", - "Enables/Disables the fade in and out effects", - openspace::properties::Property::Visibility::User + constexpr openspace::properties::Property::PropertyInfo FadeOutThresholdInfo = { + "FadeOutThreshold", + "Fade-Out Threshold", + "This value determines percentage of the sphere that is visible before starting " + "to fade it out. A negative or zero value means no fading out will happen. This " + "is also the default", + openspace::properties::Property::Visibility::AdvancedUser }; struct [[codegen::Dictionary(RenderableSphere)]] Parameters { @@ -125,9 +114,6 @@ namespace { // [[codegen::verbatim(SegmentsInfo.description)]] int segments; - // [[codegen::verbatim(TextureInfo.description)]] - std::string texture; - enum class [[codegen::map(Orientation)]] Orientation { Outside, Inside, @@ -140,14 +126,14 @@ namespace { // [[codegen::verbatim(MirrorTextureInfo.description)]] std::optional mirrorTexture; - // [[codegen::verbatim(FadeOutThresholdInfo.description)]] - std::optional fadeOutThreshold [[codegen::inrange(0.0, 1.0)]]; + // [[codegen::verbatim(DisableFadeInOutInfo.description)]] + std::optional disableFadeInOut; // [[codegen::verbatim(FadeInThresholdInfo.description)]] std::optional fadeInThreshold; - // [[codegen::verbatim(DisableFadeInOutInfo.description)]] - std::optional disableFadeInOut; + // [[codegen::verbatim(FadeOutThresholdInfo.description)]] + std::optional fadeOutThreshold [[codegen::inrange(0.0, 1.0)]]; }; #include "renderablesphere_codegen.cpp" } // namespace @@ -160,10 +146,9 @@ documentation::Documentation RenderableSphere::Documentation() { RenderableSphere::RenderableSphere(const ghoul::Dictionary& dictionary) : Renderable(dictionary) - , _texturePath(TextureInfo) - , _orientation(OrientationInfo, properties::OptionProperty::DisplayType::Dropdown) , _size(SizeInfo, 1.f, 0.f, 1e25f) , _segments(SegmentsInfo, 8, 4, 1000) + , _orientation(OrientationInfo, properties::OptionProperty::DisplayType::Dropdown) , _mirrorTexture(MirrorTextureInfo, false) , _disableFadeInDistance(DisableFadeInOutInfo, false) , _fadeInThreshold(FadeInThresholdInfo, -1.f, -0.1f, 1.f, 0.001f) @@ -174,23 +159,6 @@ RenderableSphere::RenderableSphere(const ghoul::Dictionary& dictionary) addProperty(Fadeable::_opacity); _size = p.size; - _segments = p.segments; - _texturePath = p.texture; - - _orientation.addOptions({ - { static_cast(Orientation::Outside), "Outside" }, - { static_cast(Orientation::Inside), "Inside" }, - { static_cast(Orientation::Both), "Both" } - }); - - if (p.orientation.has_value()) { - _orientation = static_cast(codegen::map(*p.orientation)); - } - else { - _orientation = static_cast(Orientation::Outside); - } - addProperty(_orientation); - _size.setExponent(15.f); _size.onChange([this]() { setBoundingSphere(_size); @@ -198,29 +166,39 @@ RenderableSphere::RenderableSphere(const ghoul::Dictionary& dictionary) }); addProperty(_size); + _segments = p.segments; + _segments.onChange([this]() { + _sphereIsDirty = true; + }); addProperty(_segments); - _segments.onChange([this]() { _sphereIsDirty = true; }); - addProperty(_texturePath); - _texturePath.onChange([this]() { loadTexture(); }); + _orientation.addOptions({ + { static_cast(Orientation::Outside), "Outside" }, + { static_cast(Orientation::Inside), "Inside" }, + { static_cast(Orientation::Both), "Both" } + }); + _orientation = p.orientation.has_value() ? + static_cast(codegen::map(*p.orientation)): + static_cast(Orientation::Outside); + addProperty(_orientation); _mirrorTexture = p.mirrorTexture.value_or(_mirrorTexture); addProperty(_mirrorTexture); - _fadeOutThreshold = p.fadeOutThreshold.value_or(_fadeOutThreshold); - addProperty(_fadeOutThreshold); + _disableFadeInDistance = p.disableFadeInOut.value_or(_disableFadeInDistance); + addProperty(_disableFadeInDistance); _fadeInThreshold = p.fadeInThreshold.value_or(_fadeInThreshold); addProperty(_fadeInThreshold); - _disableFadeInDistance = p.disableFadeInOut.value_or(_disableFadeInDistance); - addProperty(_disableFadeInDistance); + _fadeOutThreshold = p.fadeOutThreshold.value_or(_fadeOutThreshold); + addProperty(_fadeOutThreshold); setBoundingSphere(_size); } bool RenderableSphere::isReady() const { - return _shader && _texture; + return _shader != nullptr; } void RenderableSphere::initializeGL() { @@ -239,12 +217,10 @@ void RenderableSphere::initializeGL() { ); ghoul::opengl::updateUniformLocations(*_shader, _uniformCache, UniformNames); - - loadTexture(); } void RenderableSphere::deinitializeGL() { - _texture = nullptr; + _sphere = nullptr; BaseModule::ProgramObjectManager.release( "Sphere", @@ -252,6 +228,7 @@ void RenderableSphere::deinitializeGL() { global::renderEngine->removeRenderProgram(p); } ); + _shader = nullptr; } @@ -366,21 +343,21 @@ void RenderableSphere::render(const RenderData& data, RendererTasks&) { glDisable(GL_CULL_FACE); } - if (_renderBin == Renderable::RenderBin::PreDeferredTransparent) { + if (renderBin() == Renderable::RenderBin::PreDeferredTransparent) { glBlendFunc(GL_SRC_ALPHA, GL_ONE); glDepthMask(false); } _sphere->render(); - if (_renderBin == Renderable::RenderBin::PreDeferredTransparent) { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glDepthMask(true); - } - _shader->setIgnoreUniformLocationError(IgnoreError::No); _shader->deactivate(); + // Reset + global::renderEngine->openglStateCache().resetBlendState(); + global::renderEngine->openglStateCache().resetDepthState(); + unbindTexture(); + if (orientation == Orientation::Inside) { glCullFace(GL_BACK); } @@ -402,28 +379,8 @@ void RenderableSphere::update(const UpdateData&) { } } -void RenderableSphere::bindTexture() { - _texture->bind(); -} - -void RenderableSphere::unbindTexture() {} - -void RenderableSphere::loadTexture() { - if (!_texturePath.value().empty()) { - std::unique_ptr texture = - ghoul::io::TextureReader::ref().loadTexture(_texturePath, 2); - - if (texture) { - LDEBUGC( - "RenderableSphere", - fmt::format("Loaded texture from {}", absPath(_texturePath)) - ); - texture->uploadTexture(); - texture->setFilter(ghoul::opengl::Texture::FilterMode::LinearMipMap); - texture->purgeFromRAM(); - _texture = std::move(texture); - } - } +void RenderableSphere::unbindTexture() { + glBindTexture(GL_TEXTURE_2D, 0); } } // namespace openspace diff --git a/modules/base/rendering/renderablesphere.h b/modules/base/rendering/renderablesphere.h index 1cf492b135..d75dc69369 100644 --- a/modules/base/rendering/renderablesphere.h +++ b/modules/base/rendering/renderablesphere.h @@ -27,16 +27,10 @@ #include -#include #include -#include -#include #include -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl +namespace ghoul::opengl { class ProgramObject; } namespace openspace { @@ -61,33 +55,27 @@ public: static documentation::Documentation Documentation(); protected: - virtual void bindTexture(); + virtual void bindTexture() = 0; virtual void unbindTexture(); -private: - void loadTexture(); - - properties::StringProperty _texturePath; - properties::OptionProperty _orientation; - properties::FloatProperty _size; properties::IntProperty _segments; + properties::OptionProperty _orientation; properties::BoolProperty _mirrorTexture; - properties::BoolProperty _disableFadeInDistance; + properties::BoolProperty _disableFadeInDistance; properties::FloatProperty _fadeInThreshold; properties::FloatProperty _fadeOutThreshold; +private: ghoul::opengl::ProgramObject* _shader = nullptr; - std::unique_ptr _texture; std::unique_ptr _sphere; + bool _sphereIsDirty = false; UniformCache(opacity, modelViewProjection, modelViewTransform, modelViewRotation, colorTexture, mirrorTexture) _uniformCache; - - bool _sphereIsDirty = false; }; } // namespace openspace diff --git a/modules/base/rendering/renderablesphereimagelocal.cpp b/modules/base/rendering/renderablesphereimagelocal.cpp new file mode 100644 index 0000000000..13b8f64ed9 --- /dev/null +++ b/modules/base/rendering/renderablesphereimagelocal.cpp @@ -0,0 +1,134 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2023 * + * * + * 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 + +namespace { + constexpr openspace::properties::Property::PropertyInfo TextureInfo = { + "Texture", + "Texture", + "This value specifies an image that is loaded from disk and is used as a texture " + "that is applied to this sphere. This image is expected to be an equirectangular " + "projection", + // @VISIBILITY(2.33) + openspace::properties::Property::Visibility::User + }; + + struct [[codegen::Dictionary(RenderableSphere)]] Parameters { + // [[codegen::verbatim(TextureInfo.description)]] + std::string texture; + + // If this value is set to 'true', the image for this sphere will not be loaded at + // startup but rather when the image is shown for the first time. Additionally, if + // the sphere is disabled, the image will automatically be unloaded + std::optional lazyLoading; + }; +#include "renderablesphereimagelocal_codegen.cpp" +} // namespace + +namespace openspace { + +documentation::Documentation RenderableSphereImageLocal::Documentation() { + return codegen::doc("base_renderable_sphere_image_local"); +} + +RenderableSphereImageLocal::RenderableSphereImageLocal(const ghoul::Dictionary& dictionary) + : RenderableSphere(dictionary) + , _texturePath(TextureInfo) +{ + const Parameters p = codegen::bake(dictionary); + + _texturePath = p.texture; + _texturePath.onChange([this]() { + loadTexture(); + }); + addProperty(_texturePath); +} + +bool RenderableSphereImageLocal::isReady() const { + return RenderableSphere::isReady() && _texture; +} + +void RenderableSphereImageLocal::initializeGL() { + RenderableSphere::initializeGL(); + + if (!_isLoadingLazily) { + loadTexture(); + } +} + +void RenderableSphereImageLocal::deinitializeGL() { + _texture = nullptr; + + RenderableSphere::deinitializeGL(); +} + +void RenderableSphereImageLocal::update(const UpdateData& data) { + RenderableSphere::update(data); + + if (_textureIsDirty) { + loadTexture(); + _textureIsDirty = false; + } +} + +void RenderableSphereImageLocal::bindTexture() { + _texture->bind(); +} + +void RenderableSphereImageLocal::loadTexture() { + if (_texturePath.value().empty()) { + return; + } + + std::unique_ptr texture = + ghoul::io::TextureReader::ref().loadTexture(_texturePath, 2); + + if (!texture) { + LWARNINGC( + "RenderableSphereImageLocal", + fmt::format("Could not load texture from {}", absPath(_texturePath)) + ); + return; + } + + LDEBUGC( + "RenderableSphereImageLocal", + fmt::format("Loaded texture from {}", absPath(_texturePath)) + ); + texture->uploadTexture(); + texture->setFilter(ghoul::opengl::Texture::FilterMode::LinearMipMap); + texture->purgeFromRAM(); + _texture = std::move(texture); +} + +} // namespace openspace diff --git a/modules/base/rendering/renderablesphereimagelocal.h b/modules/base/rendering/renderablesphereimagelocal.h new file mode 100644 index 0000000000..2b7fe624c0 --- /dev/null +++ b/modules/base/rendering/renderablesphereimagelocal.h @@ -0,0 +1,67 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2023 * + * * + * 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_BASE___RENDERABLESPHEREIMAGELOCAL___H__ +#define __OPENSPACE_MODULE_BASE___RENDERABLESPHEREIMAGELOCAL___H__ + +#include + +namespace ghoul::opengl { class Texture; } + +namespace openspace { + +struct RenderData; +struct UpdateData; + +namespace documentation { struct Documentation; } + +class RenderableSphereImageLocal : public RenderableSphere { +public: + RenderableSphereImageLocal(const ghoul::Dictionary& dictionary); + + void initializeGL() override; + void deinitializeGL() override; + + bool isReady() const override; + + void update(const UpdateData& data) override; + + static documentation::Documentation Documentation(); + +protected: + void bindTexture() override; + +private: + void loadTexture(); + + properties::StringProperty _texturePath; + + std::unique_ptr _texture; + bool _isLoadingLazily = false; + bool _textureIsDirty = false; +}; + +} // namespace openspace + +#endif // __OPENSPACE_MODULE_BASE___RENDERABLESPHEREIMAGELOCAL___H__ diff --git a/modules/base/rendering/renderablesphereimageonline.cpp b/modules/base/rendering/renderablesphereimageonline.cpp new file mode 100644 index 0000000000..1cc0e04d86 --- /dev/null +++ b/modules/base/rendering/renderablesphereimageonline.cpp @@ -0,0 +1,163 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2023 * + * * + * 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 + +namespace { + constexpr openspace::properties::Property::PropertyInfo TextureInfo = { + "URL", + "Image URL", + "Sets the URL of the texture that is displayed on this sphere. If " + "this value is changed, the image at the new path will automatically be loaded " + "and displayed. This image is expected to be an equirectangular projection", + // @VISIBILITY(2.25) + openspace::properties::Property::Visibility::User + }; + + struct [[codegen::Dictionary(RenderableSphere)]] Parameters { + // [[codegen::verbatim(TextureInfo.description)]] + std::string url [[codegen::key("URL")]]; + }; +#include "renderablesphereimageonline_codegen.cpp" +} // namespace + +namespace openspace { + +documentation::Documentation RenderableSphereImageOnline::Documentation() { + return codegen::doc("base_renderable_sphere_image_online"); +} + +RenderableSphereImageOnline::RenderableSphereImageOnline(const ghoul::Dictionary& dictionary) + : RenderableSphere(dictionary) + , _textureUrl(TextureInfo) +{ + const Parameters p = codegen::bake(dictionary); + + _textureUrl = p.url; + _textureUrl.onChange([this]() { + _textureIsDirty = true; + }); + addProperty(_textureUrl); +} + +void RenderableSphereImageOnline::deinitializeGL() { + _texture = nullptr; + + RenderableSphere::deinitializeGL(); +} + +void RenderableSphereImageOnline::update(const UpdateData& data) { + RenderableSphere::update(data); + + if (!_textureIsDirty) { + return; + } + + if (!_imageFuture.valid()) { + std::future future = downloadImageToMemory( + _textureUrl + ); + if (future.valid()) { + _imageFuture = std::move(future); + } + } + + if (_imageFuture.valid() && DownloadManager::futureReady(_imageFuture)) { + DownloadManager::MemoryFile imageFile = _imageFuture.get(); + + if (imageFile.corrupted) { + LERRORC( + "RenderableSphereImageOnline", + fmt::format("Error loading image from URL '{}'", _textureUrl) + ); + return; + } + + try { + std::unique_ptr texture = + ghoul::io::TextureReader::ref().loadTexture( + reinterpret_cast(imageFile.buffer), + imageFile.size, + 2, + imageFile.format + ); + + if (texture) { + // Images don't need to start on 4-byte boundaries, for example if the + // image is only RGB + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + texture->uploadTexture(); + texture->setFilter(ghoul::opengl::Texture::FilterMode::LinearMipMap); + texture->purgeFromRAM(); + + _texture = std::move(texture); + _textureIsDirty = false; + } + } + catch (const ghoul::io::TextureReader::InvalidLoadException& e) { + _textureIsDirty = false; + LERRORC(e.component, e.message); + } + } +} + +void RenderableSphereImageOnline::bindTexture() { + if (_texture) { + _texture->bind(); + } + else { + unbindTexture(); + } +} + +std::future +RenderableSphereImageOnline::downloadImageToMemory(const std::string& url) +{ + return global::downloadManager->fetchFile( + url, + [url](const DownloadManager::MemoryFile&) { + LDEBUGC( + "RenderableSphereImageOnline", + fmt::format("Download to memory finished for image '{}'", url) + ); + }, + [url](const std::string& err) { + LDEBUGC( + "RenderableSphereImageOnline", + fmt::format("Download to memory failed for image '{}': {}", url, err) + ); + } + ); +} + +} // namespace openspace diff --git a/modules/base/rendering/renderablesphereimageonline.h b/modules/base/rendering/renderablesphereimageonline.h new file mode 100644 index 0000000000..0aec90ba0c --- /dev/null +++ b/modules/base/rendering/renderablesphereimageonline.h @@ -0,0 +1,67 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2023 * + * * + * 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_BASE___RENDERABLESPHEREIMAGEONLINE___H__ +#define __OPENSPACE_MODULE_BASE___RENDERABLESPHEREIMAGEONLINE___H__ + +#include + +#include + +namespace ghoul::opengl { class Texture; } + +namespace openspace { + +struct RenderData; +struct UpdateData; + +namespace documentation { struct Documentation; } + +class RenderableSphereImageOnline : public RenderableSphere { +public: + RenderableSphereImageOnline(const ghoul::Dictionary& dictionary); + + void deinitializeGL() override; + + void update(const UpdateData& data) override; + + static documentation::Documentation Documentation(); + +protected: + void bindTexture() override; + +private: + std::future downloadImageToMemory( + const std::string& url); + + properties::StringProperty _textureUrl; + + std::future _imageFuture; + std::unique_ptr _texture; + bool _textureIsDirty = false; +}; + +} // namespace openspace + +#endif // __OPENSPACE_MODULE_BASE___RENDERABLESPHEREIMAGEONLINE___H__ diff --git a/modules/base/rendering/renderabletimevaryingsphere.cpp b/modules/base/rendering/renderabletimevaryingsphere.cpp index 634db73cc8..8f616136b4 100644 --- a/modules/base/rendering/renderabletimevaryingsphere.cpp +++ b/modules/base/rendering/renderabletimevaryingsphere.cpp @@ -24,35 +24,31 @@ #include -#include #include #include -#include -#include #include #include #include -#include #include -#include #include #include -#include -#include -#include -#include namespace { - constexpr std::array UniformNames = { - "opacity", "modelViewProjection", "modelViewRotation", "colorTexture", - "mirrorTexture" - }; + // Extract J2000 time from file names + // Requires files to be named as such: 'YYYY-MM-DDTHH-MM-SS-XXX.png' + double extractTriggerTimeFromFileName(const std::string& filePath) { + // Extract the filename from the path (without extension) + std::string timeString = std::filesystem::path(filePath).stem().string(); - enum class Orientation { - Outside = 0, - Inside, - Both - }; + // 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, "."); + + return openspace::Time::convertTime(timeString); + } constexpr openspace::properties::Property::PropertyInfo TextureSourceInfo = { "TextureSource", @@ -63,185 +59,36 @@ namespace { openspace::properties::Property::Visibility::AdvancedUser }; - constexpr openspace::properties::Property::PropertyInfo MirrorTextureInfo = { - "MirrorTexture", - "Mirror Texture", - "Mirror the texture along the x-axis", - openspace::properties::Property::Visibility::User - }; - - constexpr openspace::properties::Property::PropertyInfo OrientationInfo = { - "Orientation", - "Orientation", - "Specifies whether the texture is applied to the inside of the sphere, the " - "outside of the sphere, or both", - openspace::properties::Property::Visibility::AdvancedUser - }; - - constexpr openspace::properties::Property::PropertyInfo SegmentsInfo = { - "Segments", - "Number of Segments", - "This value specifies the number of segments that the sphere is separated in", - // @VISIBILITY(2.67) - openspace::properties::Property::Visibility::User - }; - - constexpr openspace::properties::Property::PropertyInfo SizeInfo = { - "Size", - "Size (in meters)", - "This value specifies the radius of the sphere in meters", - openspace::properties::Property::Visibility::AdvancedUser - }; - - constexpr openspace::properties::Property::PropertyInfo FadeOutThresholdInfo = { - "FadeOutThreshold", - "Fade-Out Threshold", - "This value determines percentage of the sphere is visible before starting " - "fading-out it", - openspace::properties::Property::Visibility::AdvancedUser - }; - - constexpr openspace::properties::Property::PropertyInfo FadeInThresholdInfo = { - "FadeInThreshold", - "Fade-In Threshold", - "Distance from center of MilkyWay from where the astronomical object starts to " - "fade in", - openspace::properties::Property::Visibility::AdvancedUser - }; - - constexpr openspace::properties::Property::PropertyInfo DisableFadeInOutInfo = { - "DisableFadeInOut", - "Disable Fade-In/Fade-Out effects", - "Enables/Disables the Fade-In/Out effects", - // @VISIBILITY(2.33) - openspace::properties::Property::Visibility::User - }; - struct [[codegen::Dictionary(RenderableTimeVaryingSphere)]] Parameters { - // [[codegen::verbatim(SizeInfo.description)]] - float size; - - // [[codegen::verbatim(SegmentsInfo.description)]] - int segments; - // [[codegen::verbatim(TextureSourceInfo.description)]] std::string textureSource; - - enum class [[codegen::map(Orientation)]] Orientation { - Outside, - Inside, - Both - }; - - // [[codegen::verbatim(OrientationInfo.description)]] - std::optional orientation; - - // [[codegen::verbatim(MirrorTextureInfo.description)]] - std::optional mirrorTexture; - - // [[codegen::verbatim(FadeOutThresholdInfo.description)]] - std::optional fadeOutThreshold [[codegen::inrange(0.0, 1.0)]]; - - // [[codegen::verbatim(FadeInThresholdInfo.description)]] - std::optional fadeInThreshold; - - // [[codegen::verbatim(DisableFadeInOutInfo.description)]] - std::optional disableFadeInOut; }; #include "renderabletimevaryingsphere_codegen.cpp" } // namespace namespace openspace { -double extractTriggerTimeFromFileName(const std::string& filePath); - documentation::Documentation RenderableTimeVaryingSphere::Documentation() { return codegen::doc("base_renderable_time_varying_sphere"); } RenderableTimeVaryingSphere::RenderableTimeVaryingSphere( const ghoul::Dictionary& dictionary) - : Renderable(dictionary) + : RenderableSphere(dictionary) , _textureSourcePath(TextureSourceInfo) - , _orientation(OrientationInfo, properties::OptionProperty::DisplayType::Dropdown) - , _size(SizeInfo, 1.f, 0.f, 1e35f) - , _segments(SegmentsInfo, 8, 4, 1000) - , _mirrorTexture(MirrorTextureInfo, false) - , _disableFadeInDistance(DisableFadeInOutInfo, true) - , _fadeInThreshold(FadeInThresholdInfo, -1.f, -1.f, 1.f) - , _fadeOutThreshold(FadeOutThresholdInfo, -1.f, -1.f, 1.f) { const Parameters p = codegen::bake(dictionary); - addProperty(Fadeable::_opacity); - - _size = p.size; - _segments = p.segments; _textureSourcePath = p.textureSource; - - _orientation.addOptions({ - { static_cast(Orientation::Outside), "Outside" }, - { static_cast(Orientation::Inside), "Inside" }, - { static_cast(Orientation::Both), "Both" } - }); - - if (p.orientation.has_value()) { - _orientation = static_cast(codegen::map(*p.orientation)); - } - else { - _orientation = static_cast(Orientation::Outside); - } - addProperty(_orientation); - - _size.setExponent(20.f); - _size.onChange([this]() { - setBoundingSphere(_size); - _sphereIsDirty = true; - }); - addProperty(_size); - - addProperty(_segments); - _segments.onChange([this]() { _sphereIsDirty = true; }); - - addProperty(_mirrorTexture); - addProperty(_fadeOutThreshold); - addProperty(_fadeInThreshold); - - _mirrorTexture = p.mirrorTexture.value_or(_mirrorTexture); - _fadeOutThreshold = p.fadeOutThreshold.value_or(_fadeOutThreshold); - _fadeInThreshold = p.fadeInThreshold.value_or(_fadeInThreshold); - - if (_fadeOutThreshold || _fadeInThreshold) { - _disableFadeInDistance = false; - addProperty(_disableFadeInDistance); - } - - setBoundingSphere(_size); } bool RenderableTimeVaryingSphere::isReady() const { - return _shader && _texture; + return RenderableSphere::isReady() && _texture; } void RenderableTimeVaryingSphere::initializeGL() { - _sphere = std::make_unique(_size, _segments); - _sphere->initialize(); + RenderableSphere::initializeGL(); - _shader = BaseModule::ProgramObjectManager.request( - "Timevarying Sphere", - []() -> std::unique_ptr { - return global::renderEngine->buildRenderProgram( - "Timevarying Sphere", - absPath("${MODULE_BASE}/shaders/sphere_vs.glsl"), - absPath("${MODULE_BASE}/shaders/sphere_fs.glsl") - ); - } - ); - _shader->setIgnoreUniformLocationError( - ghoul::opengl::ProgramObject::IgnoreError::Yes - ); - - ghoul::opengl::updateUniformLocations(*_shader, _uniformCache, UniformNames); extractMandatoryInfoFromSourceFolder(); computeSequenceEndTime(); loadTexture(); @@ -249,134 +96,9 @@ void RenderableTimeVaryingSphere::initializeGL() { void RenderableTimeVaryingSphere::deinitializeGL() { _texture = nullptr; - - BaseModule::ProgramObjectManager.release( - "Timevarying Sphere", - [](ghoul::opengl::ProgramObject* p) { - global::renderEngine->removeRenderProgram(p); - } - ); _files.clear(); - _shader = nullptr; -} -void RenderableTimeVaryingSphere::render(const RenderData& data, RendererTasks&) { - Orientation orientation = static_cast(_orientation.value()); - - glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - glm::dmat3 modelRotation = data.modelTransform.rotation; - - _shader->activate(); - - glm::mat4 modelViewProjection = data.camera.projectionMatrix() * - glm::mat4(data.camera.combinedViewMatrix() * modelTransform); - _shader->setUniform(_uniformCache.modelViewProjection, modelViewProjection); - - glm::mat3 modelViewRotation = glm::mat3( - glm::dmat3(data.camera.viewRotationMatrix()) * modelRotation - ); - _shader->setUniform(_uniformCache.modelViewRotation, modelViewRotation); - - float adjustedOpacity = opacity(); - - if (!_disableFadeInDistance) { - if (_fadeInThreshold > -1.0) { - const float logDistCamera = glm::log(static_cast( - glm::distance(data.camera.positionVec3(), data.modelTransform.translation) - )); - const float startLogFadeDistance = glm::log(_size * _fadeInThreshold); - const float stopLogFadeDistance = startLogFadeDistance + 1.f; - - if (logDistCamera > startLogFadeDistance && - logDistCamera < stopLogFadeDistance) - { - const float fadeFactor = glm::clamp( - (logDistCamera - startLogFadeDistance) / - (stopLogFadeDistance - startLogFadeDistance), - 0.f, - 1.f - ); - adjustedOpacity *= fadeFactor; - } - else if (logDistCamera <= startLogFadeDistance) { - adjustedOpacity = 0.f; - } - } - - if (_fadeOutThreshold > -1.0) { - const float logDistCamera = glm::log(static_cast( - glm::distance(data.camera.positionVec3(), data.modelTransform.translation) - )); - const float startLogFadeDistance = glm::log(_size * _fadeOutThreshold); - const float stopLogFadeDistance = startLogFadeDistance + 1.f; - - if (logDistCamera > startLogFadeDistance && - logDistCamera < stopLogFadeDistance) - { - const float fadeFactor = glm::clamp( - (logDistCamera - startLogFadeDistance) / - (stopLogFadeDistance - startLogFadeDistance), - 0.f, - 1.f - ); - adjustedOpacity *= (1.f - fadeFactor); - } - else if (logDistCamera >= stopLogFadeDistance) { - adjustedOpacity = 0.f; - } - } - } - // Performance wise - if (adjustedOpacity < 0.01f) { - return; - } - - _shader->setUniform(_uniformCache.opacity, adjustedOpacity); - _shader->setUniform(_uniformCache._mirrorTexture, _mirrorTexture); - - ghoul::opengl::TextureUnit unit; - unit.activate(); - _texture->bind(); - _shader->setUniform(_uniformCache.colorTexture, unit); - - // Setting these states should not be necessary, - // since they are the default state in OpenSpace. - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); - - if (orientation == Orientation::Inside) { - glCullFace(GL_FRONT); - } - else if (orientation == Orientation::Both) { - glDisable(GL_CULL_FACE); - } - - if (_renderBin == Renderable::RenderBin::PreDeferredTransparent) { - glBlendFunc(GL_SRC_ALPHA, GL_ONE); - glDepthMask(false); - } - - _sphere->render(); - - if (_renderBin == Renderable::RenderBin::PreDeferredTransparent) { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glDepthMask(true); - } - - _shader->setIgnoreUniformLocationError(ghoul::opengl::ProgramObject::IgnoreError::No); - _shader->deactivate(); - - if (orientation == Orientation::Inside) { - glCullFace(GL_BACK); - } - else if (orientation == Orientation::Both) { - glEnable(GL_CULL_FACE); - } - glDisable(GL_CULL_FACE); + RenderableSphere::deinitializeGL(); } void RenderableTimeVaryingSphere::extractMandatoryInfoFromSourceFolder() { @@ -386,7 +108,7 @@ void RenderableTimeVaryingSphere::extractMandatoryInfoFromSourceFolder() { fs::path sourceFolder = absPath(_textureSourcePath); if (!std::filesystem::is_directory(sourceFolder)) { throw ghoul::RuntimeError( - "Source folder for timevaryingsphere is not a valid directory" + "Source folder for RenderableTimeVaryingSphere is not a valid directory" ); } // Extract all file paths from the provided folder @@ -410,7 +132,8 @@ void RenderableTimeVaryingSphere::extractMandatoryInfoFromSourceFolder() { } std::sort( - _files.begin(), _files.end(), + _files.begin(), + _files.end(), [](const FileData& a, const FileData& b) { return a.time < b.time; } @@ -418,19 +141,14 @@ void RenderableTimeVaryingSphere::extractMandatoryInfoFromSourceFolder() { // Ensure that there are available and valid source files left if (_files.empty()) { throw ghoul::RuntimeError( - "Source folder for timevaryingsphere contains no files" + "Source folder for RenderableTimeVaryingSphere contains no files" ); } } void RenderableTimeVaryingSphere::update(const UpdateData& data) { - if (!_enabled) { - return; - } - if (_shader->isDirty()) { - _shader->rebuildFromFile(); - ghoul::opengl::updateUniformLocations(*_shader, _uniformCache, UniformNames); - } + RenderableSphere::update(data); + const double currentTime = data.time.j2000Seconds(); const bool isInInterval = (currentTime >= _files[0].time) && (currentTime < _sequenceEndTime); @@ -443,40 +161,33 @@ void RenderableTimeVaryingSphere::update(const UpdateData& data) { (nextIdx < _files.size() && currentTime >= _files[nextIdx].time)) { updateActiveTriggerTimeIndex(currentTime); - _sphereIsDirty = true; + _textureIsDirty = true; } // else {we're still in same state as previous frame (no changes needed)} } else { // not in interval => set everything to false _activeTriggerTimeIndex = 0; } - if (_sphereIsDirty) { - _sphere = std::make_unique(_size, _segments); - _sphere->initialize(); + if (_textureIsDirty) { loadTexture(); - _sphereIsDirty = false; + _textureIsDirty = false; } } -// Extract J2000 time from file names -// Requires files to be named as such: 'YYYY-MM-DDTHH-MM-SS-XXX.png' -double extractTriggerTimeFromFileName(const std::string& filePath) { - // Extract the filename from the path (without extension) - std::string timeString = std::filesystem::path(filePath).stem().string(); - - // 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, "."); - - return Time::convertTime(timeString); +void RenderableTimeVaryingSphere::bindTexture() { + if (_texture) { + _texture->bind(); + } + else { + unbindTexture(); + } } void RenderableTimeVaryingSphere::updateActiveTriggerTimeIndex(double currentTime) { auto iter = std::upper_bound( - _files.begin(), _files.end(), currentTime, + _files.begin(), + _files.end(), + currentTime, [](double value, const FileData& f) { return value < f.time; } @@ -499,8 +210,8 @@ void RenderableTimeVaryingSphere::computeSequenceEndTime() { if (_files.size() > 1) { const double lastTriggerTime = _files[_files.size() - 1].time; const double sequenceDuration = lastTriggerTime - _files[0].time; - const double averageStateDuration = sequenceDuration / - (static_cast(_files.size()) - 1.0); + const double averageStateDuration = + sequenceDuration / (static_cast(_files.size()) - 1.0); _sequenceEndTime = lastTriggerTime + averageStateDuration; } } @@ -510,4 +221,5 @@ void RenderableTimeVaryingSphere::loadTexture() { _texture = _files[_activeTriggerTimeIndex].texture.get(); } } + } // namespace openspace diff --git a/modules/base/rendering/renderabletimevaryingsphere.h b/modules/base/rendering/renderabletimevaryingsphere.h index 36d411b5e9..d7f9aeeb13 100644 --- a/modules/base/rendering/renderabletimevaryingsphere.h +++ b/modules/base/rendering/renderabletimevaryingsphere.h @@ -25,28 +25,18 @@ #ifndef __OPENSPACE_MODULE_BASE___RENDERABLETIMEVARYINGSPHERE___H__ #define __OPENSPACE_MODULE_BASE___RENDERABLETIMEVARYINGSPHERE___H__ -#include +#include -#include -#include -#include -#include -#include - -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl +namespace ghoul::opengl { class Texture; } namespace openspace { -class Sphere; struct RenderData; struct UpdateData; namespace documentation { struct Documentation; } -class RenderableTimeVaryingSphere : public Renderable { +class RenderableTimeVaryingSphere : public RenderableSphere { public: RenderableTimeVaryingSphere(const ghoul::Dictionary& dictionary); @@ -55,11 +45,13 @@ public: bool isReady() const override; - void render(const RenderData& data, RendererTasks& rendererTask) override; void update(const UpdateData& data) override; static documentation::Documentation Documentation(); +protected: + void bindTexture() override; + private: struct FileData { std::string path; @@ -77,25 +69,8 @@ private: int _activeTriggerTimeIndex = 0; properties::StringProperty _textureSourcePath; - properties::OptionProperty _orientation; - - properties::FloatProperty _size; - properties::IntProperty _segments; - - properties::BoolProperty _mirrorTexture; - properties::BoolProperty _disableFadeInDistance; - - properties::FloatProperty _fadeInThreshold; - properties::FloatProperty _fadeOutThreshold; - - ghoul::opengl::ProgramObject* _shader = nullptr; ghoul::opengl::Texture* _texture = nullptr; - std::unique_ptr _sphere; - - UniformCache(opacity, modelViewProjection, modelViewRotation, colorTexture, - _mirrorTexture) _uniformCache; - - bool _sphereIsDirty = false; + bool _textureIsDirty = false; }; } // namespace openspace diff --git a/modules/spout/renderablespherespout.cpp b/modules/spout/renderablespherespout.cpp index b956c9428e..9aaf5cffc2 100644 --- a/modules/spout/renderablespherespout.cpp +++ b/modules/spout/renderablespherespout.cpp @@ -29,7 +29,6 @@ #include #include #include -#include #include namespace openspace { @@ -102,7 +101,7 @@ void RenderableSphereSpout::bindTexture() { glBindTexture(GL_TEXTURE_2D, _spoutReceiver.spoutTexture()); } else { - RenderableSphere::bindTexture(); + RenderableSphere::unbindTexture(); } } diff --git a/modules/video/include/renderablevideoplane.h b/modules/video/include/renderablevideoplane.h index b569d2a71e..c9b145f1ad 100644 --- a/modules/video/include/renderablevideoplane.h +++ b/modules/video/include/renderablevideoplane.h @@ -48,7 +48,7 @@ public: static documentation::Documentation Documentation(); protected: - virtual void bindTexture() override; + void bindTexture() override; private: VideoPlayer _videoPlayer; diff --git a/modules/video/include/renderablevideosphere.h b/modules/video/include/renderablevideosphere.h index e1a9c8723f..c7db3a3fa5 100644 --- a/modules/video/include/renderablevideosphere.h +++ b/modules/video/include/renderablevideosphere.h @@ -25,29 +25,15 @@ #ifndef __OPENSPACE_MODULE_VIDEO___RENDERABLEVIDEOSPHERE___H__ #define __OPENSPACE_MODULE_VIDEO___RENDERABLEVIDEOSPHERE___H__ -#include +#include #include -#include -#include -#include -#include -#include - -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl namespace openspace { -class Sphere; -struct RenderData; -struct UpdateData; - namespace documentation { struct Documentation; } -class RenderableVideoSphere : public Renderable { +class RenderableVideoSphere : public RenderableSphere { public: RenderableVideoSphere(const ghoul::Dictionary& dictionary); @@ -56,37 +42,16 @@ public: bool isReady() const override; - virtual void render(const RenderData& data, RendererTasks& rendererTask) override; - virtual void update(const UpdateData& data) override; + void render(const RenderData& data, RendererTasks& rendererTask) override; + void update(const UpdateData& data) override; static documentation::Documentation Documentation(); protected: - void bindTexture(); - void unbindTexture(); + void bindTexture() override; private: VideoPlayer _videoPlayer; - - properties::OptionProperty _orientation; - - properties::FloatProperty _size; - properties::IntProperty _segments; - - properties::BoolProperty _mirrorTexture; - properties::BoolProperty _disableFadeInDistance; - - properties::FloatProperty _fadeInThreshold; - properties::FloatProperty _fadeOutThreshold; - - ghoul::opengl::ProgramObject* _shader = nullptr; - - std::unique_ptr _sphere; - - UniformCache(opacity, modelViewProjection, modelViewTransform, modelViewRotation, - colorTexture, mirrorTexture) _uniformCache; - - bool _sphereIsDirty = false; }; } // namespace openspace diff --git a/modules/video/src/renderablevideoplane.cpp b/modules/video/src/renderablevideoplane.cpp index 5bcba06397..6c694c32e8 100644 --- a/modules/video/src/renderablevideoplane.cpp +++ b/modules/video/src/renderablevideoplane.cpp @@ -74,7 +74,7 @@ void RenderableVideoPlane::update(const UpdateData& data) { return; } - // Shape the plane based on the aspect ration of the video + // Shape the plane based on the aspect ratio of the video glm::vec2 textureDim = glm::vec2(_videoPlayer.frameTexture()->dimensions()); if (_textureDimensions != textureDim) { float aspectRatio = textureDim.x / textureDim.y; diff --git a/modules/video/src/renderablevideosphere.cpp b/modules/video/src/renderablevideosphere.cpp index 3ce47e9960..f0ab52f706 100644 --- a/modules/video/src/renderablevideosphere.cpp +++ b/modules/video/src/renderablevideosphere.cpp @@ -24,115 +24,16 @@ #include -#include #include #include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace { - constexpr std::array UniformNames = { - "opacity", "modelViewProjection", "modelViewTransform", "modelViewRotation", - "colorTexture", "mirrorTexture" - }; - - enum class Orientation : int { - Outside = 0, - Inside, - Both - }; - - constexpr openspace::properties::Property::PropertyInfo MirrorTextureInfo = { - "MirrorTexture", - "Mirror Texture", - "Mirror the texture along the x-axis" - }; - - constexpr openspace::properties::Property::PropertyInfo OrientationInfo = { - "Orientation", - "Orientation", - "Specifies whether the texture is applied to the inside of the sphere, the " - "outside of the sphere, or both" - }; - - constexpr openspace::properties::Property::PropertyInfo SegmentsInfo = { - "Segments", - "Number of Segments", - "This value specifies the number of segments that the sphere is separated in" - }; - - constexpr openspace::properties::Property::PropertyInfo SizeInfo = { - "Size", - "Size (in meters)", - "This value specifies the radius of the sphere in meters" - }; - - constexpr openspace::properties::Property::PropertyInfo FadeOutThresholdInfo = { - "FadeOutThreshold", - "Fade-Out Threshold", - "This value determines percentage of the sphere is visible before starting " - "fading-out it" - }; - - constexpr openspace::properties::Property::PropertyInfo FadeInThresholdInfo = { - "FadeInThreshold", - "Fade-In Threshold", - "Distance from center of MilkyWay from where the astronomical object starts to " - "fade in" - }; - - constexpr openspace::properties::Property::PropertyInfo DisableFadeInOutInfo = { - "DisableFadeInOut", - "Disable Fade-In/Fade-Out effects", - "Enables/Disables the Fade-In/Out effects" - }; - - struct [[codegen::Dictionary(RenderableVideoSphere)]] Parameters { - // [[codegen::verbatim(SizeInfo.description)]] - float size; - - // [[codegen::verbatim(SegmentsInfo.description)]] - int segments; - - enum class [[codegen::map(Orientation)]] Orientation { - Outside, - Inside, - Both - }; - - // [[codegen::verbatim(OrientationInfo.description)]] - std::optional orientation; - - // [[codegen::verbatim(MirrorTextureInfo.description)]] - std::optional mirrorTexture; - - // [[codegen::verbatim(FadeOutThresholdInfo.description)]] - std::optional fadeOutThreshold [[codegen::inrange(0.0, 1.0)]]; - - // [[codegen::verbatim(FadeInThresholdInfo.description)]] - std::optional fadeInThreshold; - - // [[codegen::verbatim(DisableFadeInOutInfo.description)]] - std::optional disableFadeInOut; - }; -#include "renderablevideosphere_codegen.cpp" -} // namespace namespace openspace { documentation::Documentation RenderableVideoSphere::Documentation() { - documentation::Documentation doc = - codegen::doc("renderable_video_sphere"); + documentation::Documentation doc = RenderableSphere::Documentation(); + doc.name = "RenderableVideoSphere"; + doc.id = "video_renderablevideosphere"; documentation::Documentation vp = VideoPlayer::Documentation(); doc.entries.insert(doc.entries.end(), vp.entries.begin(), vp.entries.end()); @@ -141,261 +42,42 @@ documentation::Documentation RenderableVideoSphere::Documentation() { } RenderableVideoSphere::RenderableVideoSphere(const ghoul::Dictionary& dictionary) - : Renderable(dictionary) + : RenderableSphere(dictionary) , _videoPlayer(dictionary) - , _orientation(OrientationInfo, properties::OptionProperty::DisplayType::Dropdown) - , _size(SizeInfo, 1.f, 0.f, 1e25f) - , _segments(SegmentsInfo, 8, 4, 1000) - , _mirrorTexture(MirrorTextureInfo, false) - , _disableFadeInDistance(DisableFadeInOutInfo, true) - , _fadeInThreshold(FadeInThresholdInfo, -1.f, 0.f, 1.f) - , _fadeOutThreshold(FadeOutThresholdInfo, -1.f, 0.f, 1.f) { - const Parameters p = codegen::bake(dictionary); - - addProperty(_opacity); - - _size = p.size; - _segments = p.segments; - - _orientation.addOptions({ - { static_cast(Orientation::Outside), "Outside" }, - { static_cast(Orientation::Inside), "Inside" }, - { static_cast(Orientation::Both), "Both" } - }); - - if (p.orientation.has_value()) { - _orientation = static_cast(codegen::map(*p.orientation)); - } - else { - _orientation = static_cast(Orientation::Outside); - } - addProperty(_orientation); - - _size.setExponent(15.f); - _size.onChange([this]() { - setBoundingSphere(_size); - _sphereIsDirty = true; - }); - addProperty(_size); - - addProperty(_segments); - _segments.onChange([this]() { _sphereIsDirty = true; }); - - addProperty(_mirrorTexture); - - _mirrorTexture = p.mirrorTexture.value_or(_mirrorTexture); - - bool hasGivenFadeOut = p.fadeOutThreshold.has_value(); - if (hasGivenFadeOut) { - _fadeOutThreshold = *p.fadeOutThreshold; - addProperty(_fadeOutThreshold); - } - - bool hasGivenFadeIn = p.fadeInThreshold.has_value(); - if (hasGivenFadeIn) { - _fadeInThreshold = *p.fadeInThreshold; - addProperty(_fadeInThreshold); - } - - if (hasGivenFadeIn || hasGivenFadeOut) { - _disableFadeInDistance = false; - addProperty(_disableFadeInDistance); - } - - setBoundingSphere(_size); - setRenderBinFromOpacity(); addPropertySubOwner(_videoPlayer); } - bool RenderableVideoSphere::isReady() const { - return _shader && _videoPlayer.isInitialized(); + return RenderableSphere::isReady() && _videoPlayer.isInitialized(); } void RenderableVideoSphere::initializeGL() { - _sphere = std::make_unique(_size, _segments); - _sphere->initialize(); - - _shader = BaseModule::ProgramObjectManager.request( - "Sphere", - []() -> std::unique_ptr { - return global::renderEngine->buildRenderProgram( - "Sphere", - absPath("${MODULE_BASE}/shaders/sphere_vs.glsl"), - absPath("${MODULE_BASE}/shaders/sphere_fs.glsl") - ); - } - ); - - ghoul::opengl::updateUniformLocations(*_shader, _uniformCache, UniformNames); - + RenderableSphere::initializeGL(); _videoPlayer.initialize(); } void RenderableVideoSphere::deinitializeGL() { _videoPlayer.destroy(); - BaseModule::ProgramObjectManager.release( - "Sphere", - [](ghoul::opengl::ProgramObject* p) { - global::renderEngine->removeRenderProgram(p); - } - ); - _shader = nullptr; + RenderableSphere::deinitializeGL(); } -void RenderableVideoSphere::render(const RenderData& data, RendererTasks&) { - Orientation orientation = static_cast(_orientation.value()); - - glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - glm::dmat3 modelRotation = - glm::dmat3(data.modelTransform.rotation); - - // Activate shader - using IgnoreError = ghoul::opengl::ProgramObject::IgnoreError; - _shader->activate(); - _shader->setIgnoreUniformLocationError(IgnoreError::Yes); - - glm::mat4 modelViewProjection = data.camera.projectionMatrix() * - glm::mat4(data.camera.combinedViewMatrix() * modelTransform); - _shader->setUniform(_uniformCache.modelViewProjection, modelViewProjection); - - const glm::dmat4 modelViewTransform = - data.camera.combinedViewMatrix() * modelTransform; - _shader->setUniform(_uniformCache.modelViewTransform, glm::mat4(modelViewTransform)); - - glm::mat3 modelViewRotation = glm::mat3( - glm::dmat3(data.camera.viewRotationMatrix()) * modelRotation - ); - _shader->setUniform(_uniformCache.modelViewRotation, modelViewRotation); - - float adjustedOpacity = opacity(); - - if (!_disableFadeInDistance) { - if (_fadeInThreshold > -1.0) { - const double d = glm::distance( - data.camera.positionVec3(), - data.modelTransform.translation - ); - const float logDist = - d > 0.0 ? - std::log(static_cast(d)) : - -std::numeric_limits::max(); - - const float startLogFadeDistance = glm::log(_size * _fadeInThreshold); - const float stopLogFadeDistance = startLogFadeDistance + 1.f; - - if (logDist > startLogFadeDistance && logDist < stopLogFadeDistance) { - const float fadeFactor = glm::clamp( - (logDist - startLogFadeDistance) / - (stopLogFadeDistance - startLogFadeDistance), - 0.f, - 1.f - ); - adjustedOpacity *= fadeFactor; - } - else if (logDist <= startLogFadeDistance) { - adjustedOpacity = 0.f; - } - } - - if (_fadeOutThreshold > -1.0) { - const double d = glm::distance( - data.camera.positionVec3(), - data.modelTransform.translation - ); - const float logDist = - d > 0.0 ? - std::log(static_cast(d)) : - -std::numeric_limits::max(); - const float startLogFadeDistance = glm::log(_size * _fadeOutThreshold); - const float stopLogFadeDistance = startLogFadeDistance + 1.f; - - if (logDist > startLogFadeDistance && logDist < stopLogFadeDistance) { - const float fadeFactor = glm::clamp( - (logDist - startLogFadeDistance) / - (stopLogFadeDistance - startLogFadeDistance), - 0.f, - 1.f - ); - adjustedOpacity *= (1.f - fadeFactor); - } - else if (logDist >= stopLogFadeDistance) { - adjustedOpacity = 0.f; - } - } - } - // Performance wise - if (adjustedOpacity < 0.01f) { - return; - } - - _shader->setUniform(_uniformCache.opacity, adjustedOpacity); - _shader->setUniform(_uniformCache.mirrorTexture, _mirrorTexture.value()); - - ghoul::opengl::TextureUnit unit; - unit.activate(); - bindTexture(); - defer{ unbindTexture(); }; - _shader->setUniform(_uniformCache.colorTexture, unit); - - // Setting these states should not be necessary, - // since they are the default state in OpenSpace. - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); - - if (orientation == Orientation::Inside) { - glCullFace(GL_FRONT); - } - else if (orientation == Orientation::Both) { - glDisable(GL_CULL_FACE); - } - - if (_renderBin == Renderable::RenderBin::PreDeferredTransparent) { - glBlendFunc(GL_SRC_ALPHA, GL_ONE); - glDepthMask(false); - } - - _sphere->render(); - - if (_renderBin == Renderable::RenderBin::PreDeferredTransparent) { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glDepthMask(true); - } - - _shader->setIgnoreUniformLocationError(IgnoreError::No); - _shader->deactivate(); - - if (orientation == Orientation::Inside) { - glCullFace(GL_BACK); - } - else if (orientation == Orientation::Both) { - glEnable(GL_CULL_FACE); +void RenderableVideoSphere::render(const RenderData& data, RendererTasks& rendererTask) { + if (_videoPlayer.isInitialized()) { + RenderableSphere::render(data, rendererTask); } } void RenderableVideoSphere::update(const UpdateData&) { + if (!_videoPlayer.isInitialized()) { + return; + } + _videoPlayer.update(); - - if (_shader->isDirty()) { - _shader->rebuildFromFile(); - ghoul::opengl::updateUniformLocations(*_shader, _uniformCache, UniformNames); - } - - if (_sphereIsDirty) { - _sphere = std::make_unique(_size, _segments); - _sphere->initialize(); - _sphereIsDirty = false; - } } void RenderableVideoSphere::bindTexture() { _videoPlayer.frameTexture().get()->bind(); } -void RenderableVideoSphere::unbindTexture() {} } // namespace openspace From 8a68825d48cc5109b406ec3ebbeeffbcfec786f0 Mon Sep 17 00:00:00 2001 From: Adam Rohdin Date: Mon, 7 Aug 2023 16:24:33 +0200 Subject: [PATCH 078/701] updated example to use pos instead of windowPos --- openspace.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openspace.cfg b/openspace.cfg index 2c1bbbea53..82e8a4b910 100644 --- a/openspace.cfg +++ b/openspace.cfg @@ -12,7 +12,7 @@ SGCTConfig = sgct.config.single{vsync=false} -- A regular 1920x1080 window -- SGCTConfig = sgct.config.single{1920, 1080} -- A windowed 1920x1080 fullscreen --- SGCTConfig = sgct.config.single{1920, 1080, border=false, windowPos={0,0}} +-- SGCTConfig = sgct.config.single{1920, 1080, border=false, pos={0,0}} -- A 1k fisheye rendering -- SGCTConfig = sgct.config.fisheye{1024, 1024} -- A 4k fisheye rendering in a 1024x1024 window From 9cfda4db2f54a24e2d51d57367a0374a7b30c184 Mon Sep 17 00:00:00 2001 From: Gene Payne Date: Mon, 7 Aug 2023 12:50:06 -0600 Subject: [PATCH 079/701] Fixed the name in the meta section of each config --- apps/OpenSpace/ext/launcher/src/launcherwindow.cpp | 2 +- config/equirectangular_gui.json | 2 +- config/fullscreen1080.json | 2 +- config/gui_projector.json | 2 +- config/single_fisheye.json | 2 +- config/single_fisheye_gui.json | 2 +- config/single_gui.json | 2 +- config/single_gui_spout.json | 2 +- config/single_gui_with_graphics.json | 2 +- config/single_sbs_stereo.json | 2 +- config/single_two_win.json | 2 +- config/spherical_mirror.json | 2 +- config/spherical_mirror_gui.json | 2 +- config/spout_output_cubemap.json | 4 ++-- config/spout_output_equirectangular.json | 4 ++-- config/spout_output_fisheye.json | 4 ++-- config/spout_output_flat.json | 4 ++-- config/two_nodes.json | 2 +- 18 files changed, 22 insertions(+), 22 deletions(-) diff --git a/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp b/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp index 7bb25f7e61..f1352e7444 100644 --- a/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp +++ b/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp @@ -552,7 +552,7 @@ bool handleConfigurationFile(QComboBox& box, const std::filesystem::directory_en } box.addItem(QString::fromStdString(p.path().filename().string())); - //Add tooltip + // Add tooltip if (isJson) { sgct::config::Meta meta = sgct::readMeta(p.path().string(), true); if (!meta.description.empty()) { diff --git a/config/equirectangular_gui.json b/config/equirectangular_gui.json index 7d3d2dc303..425c78a509 100644 --- a/config/equirectangular_gui.json +++ b/config/equirectangular_gui.json @@ -59,7 +59,7 @@ "author": "OpenSpace Team", "description": "Two windows: Primary 1280x720 window with equirectangular projection rendering without menu or text overlays, and a secondary with menu and text overlays minus rendering.", "license": "MIT License", - "name": "Single", + "name": "Equirectangular + GUI", "version": "1.0" } } diff --git a/config/fullscreen1080.json b/config/fullscreen1080.json index 6b8afbcd3e..6d8cfa7987 100644 --- a/config/fullscreen1080.json +++ b/config/fullscreen1080.json @@ -48,7 +48,7 @@ "author": "OpenSpace Team", "description": "A single 1920x1080 fullscreen window with planar projection rendering. The display will automatically be set to 1920x1080, regardless of native resolution.", "license": "MIT License", - "name": "Single", + "name": "Fullscreen 1080", "version": "1.0" } } diff --git a/config/gui_projector.json b/config/gui_projector.json index c4affe89fd..2ae6a35593 100644 --- a/config/gui_projector.json +++ b/config/gui_projector.json @@ -64,7 +64,7 @@ "author": "OpenSpace Team", "description": "Two windows for a side-by-side dual-monitor configuration, where the right-side monitor can be considered a projector. Primary 1920x1080 window with menu and text overlays minus rendering, and a secondary 1920x1080 fullscreen window with planar projection rendering without menu or text overlays.", "license": "MIT License", - "name": "Single", + "name": "Side Projector + GUI", "version": "1.0" } } diff --git a/config/single_fisheye.json b/config/single_fisheye.json index 1309a8e623..941cf221e2 100644 --- a/config/single_fisheye.json +++ b/config/single_fisheye.json @@ -38,7 +38,7 @@ "author": "OpenSpace Team", "description": "A single 1024x1024 window with fisheye projection rendering.", "license": "MIT License", - "name": "Single", + "name": "Fisheye", "version": "1.0" } } diff --git a/config/single_fisheye_gui.json b/config/single_fisheye_gui.json index ef67552cbd..862ec78611 100644 --- a/config/single_fisheye_gui.json +++ b/config/single_fisheye_gui.json @@ -62,7 +62,7 @@ "author": "OpenSpace Team", "description": "Two windows: Primary 1024x1024 window with menu and text overlays minus rendering, and a secondary 1024x1024 window with fisheye projection rendering without menu and text overlays.", "license": "MIT License", - "name": "Single", + "name": "Fisheye + GUI", "version": "1.0" } diff --git a/config/single_gui.json b/config/single_gui.json index 6d67ed64f9..87c997d0ef 100644 --- a/config/single_gui.json +++ b/config/single_gui.json @@ -71,7 +71,7 @@ "author": "OpenSpace Team", "description": "Two windows: Primary 1280x720 window with planar projection rendering without menu or text overlays, and a secondary with menu and text overlays minus rendering.", "license": "MIT License", - "name": "Single", + "name": "Single + GUI", "version": "1.0" } } diff --git a/config/single_gui_spout.json b/config/single_gui_spout.json index 5f54282976..bfd91f6a65 100644 --- a/config/single_gui_spout.json +++ b/config/single_gui_spout.json @@ -68,7 +68,7 @@ "author": "OpenSpace Team", "description": "Two windows: Primary 1280x720 window with Spout output (name 'OpenSpace') planar projection rendering without menu or text overlays, and a secondary with menu and text overlays minus rendering.", "license": "MIT License", - "name": "Single", + "name": "Planar Spout + GUI", "version": "1.0" } } diff --git a/config/single_gui_with_graphics.json b/config/single_gui_with_graphics.json index 31d1b630ab..950207760d 100644 --- a/config/single_gui_with_graphics.json +++ b/config/single_gui_with_graphics.json @@ -72,7 +72,7 @@ "author": "OpenSpace Team", "description": "Two windows: Primary 1280x720 window with planar projection rendering without menu or text overlays, and a secondary with menu and text overlays plus rendering from the primary.", "license": "MIT License", - "name": "Single", + "name": "Planar + GUI", "version": "1.0" } } diff --git a/config/single_sbs_stereo.json b/config/single_sbs_stereo.json index e1fa34337b..b3e32c1e1b 100644 --- a/config/single_sbs_stereo.json +++ b/config/single_sbs_stereo.json @@ -47,7 +47,7 @@ "author": "OpenSpace Team", "description": "A single 1280x720 window containing side-by-side stereo planar projection rendering views.", "license": "MIT License", - "name": "Single", + "name": "Side-by-Side Stereo", "version": "1.0" } } diff --git a/config/single_two_win.json b/config/single_two_win.json index 6d35594ef0..9eabfd6977 100644 --- a/config/single_two_win.json +++ b/config/single_two_win.json @@ -60,7 +60,7 @@ "author": "OpenSpace Team", "description": "Two 1280x720 windows each with identical planar projection rendering. Only the primary window has menu controls, but both have text overlays.", "license": "MIT License", - "name": "Single", + "name": "Twin Planar", "version": "1.0" } diff --git a/config/spherical_mirror.json b/config/spherical_mirror.json index a422b34d35..5b2361f192 100644 --- a/config/spherical_mirror.json +++ b/config/spherical_mirror.json @@ -41,7 +41,7 @@ "author": "OpenSpace Team", "description": "A single 1280x720 window with spherical projection rendering at 2048x2048 resolution.", "license": "MIT License", - "name": "Single", + "name": "Spherical Mirror", "version": "1.0" } } diff --git a/config/spherical_mirror_gui.json b/config/spherical_mirror_gui.json index e96ba89936..08a0e8be9b 100644 --- a/config/spherical_mirror_gui.json +++ b/config/spherical_mirror_gui.json @@ -66,7 +66,7 @@ "author": "OpenSpace Team", "description": "Two windows: Primary 1280x720 window with menu and text overlays minus rendering, and a secondary 1280x720 window at 2048x2048 resolution with spherical mirror projection rendering without the menu or text overlays.", "license": "MIT License", - "name": "Single", + "name": "Spherical Mirror + GUI", "version": "1.0" } } diff --git a/config/spout_output_cubemap.json b/config/spout_output_cubemap.json index a8c2621064..83cfcdd35d 100644 --- a/config/spout_output_cubemap.json +++ b/config/spout_output_cubemap.json @@ -59,9 +59,9 @@ ], "meta": { "author": "OpenSpace Team", - "description": "A single 1024x1024 window with spout output cubemap projection rendering.", + "description": "A single 1024x1024 window with Spout output cubemap projection rendering.", "license": "MIT License", - "name": "Single", + "name": "Cubemap Spout", "version": "1.0" } } diff --git a/config/spout_output_equirectangular.json b/config/spout_output_equirectangular.json index 39de1154a2..1cf7436a75 100644 --- a/config/spout_output_equirectangular.json +++ b/config/spout_output_equirectangular.json @@ -59,9 +59,9 @@ ], "meta": { "author": "OpenSpace Team", - "description": "A single 1024x1024 window with spout output equirectangular projection rendering.", + "description": "A single 1024x1024 window with Spout output equirectangular projection rendering.", "license": "MIT License", - "name": "Single", + "name": "Equirectangular Spout", "version": "1.0" } } diff --git a/config/spout_output_fisheye.json b/config/spout_output_fisheye.json index f95628bd50..584bf5b8f9 100644 --- a/config/spout_output_fisheye.json +++ b/config/spout_output_fisheye.json @@ -59,9 +59,9 @@ ], "meta": { "author": "OpenSpace Team", - "description": "A single 1024x1024 window with spout output fisheye projection rendering.", + "description": "A single 1024x1024 window with Spout output fisheye projection rendering.", "license": "MIT License", - "name": "Single", + "name": "Fisheye Spout", "version": "1.0" } } diff --git a/config/spout_output_flat.json b/config/spout_output_flat.json index c7c8ff2d06..9a953b616a 100644 --- a/config/spout_output_flat.json +++ b/config/spout_output_flat.json @@ -58,9 +58,9 @@ ], "meta": { "author": "OpenSpace Team", - "description": "A single 1024x1024 window with spout output planar/flat projection rendering at 1920x1080 resolution.", + "description": "A single 1024x1024 window with Spout output planar/flat projection rendering at 1920x1080 resolution.", "license": "MIT License", - "name": "Single", + "name": "Planar Spout", "version": "1.0" } } diff --git a/config/two_nodes.json b/config/two_nodes.json index 9bb4f8cf13..637bc27dea 100644 --- a/config/two_nodes.json +++ b/config/two_nodes.json @@ -65,7 +65,7 @@ "author": "OpenSpace Team", "description": "Two individual nodes, each with a 1280x720 window with planar projection rendering.", "license": "MIT License", - "name": "Single", + "name": "Two Nodes", "version": "1.0" } } From 7411302334157ab3a34b39722f297dfa39d43404 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Tue, 8 Aug 2023 13:41:20 +0200 Subject: [PATCH 080/701] Fix fatal error when starting profile with navigation state camera setting And provide more information in the fatal error message... (emerged from commit 30b80843c34273ef9f30eb785e496f2eb259e4d8) --- src/engine/openspaceengine.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index 10d9b57e69..894790e077 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -1720,7 +1720,9 @@ void setCameraFromProfile(const Profile& p) { auto checkNodeExists = [](const std::string& node) { if (global::renderEngine->scene()->sceneGraphNode(node) == nullptr) { - throw ghoul::RuntimeError(fmt::format("Could not find node '{}'", node)); + throw ghoul::RuntimeError(fmt::format( + "Error when setting camera from profile. Could not find node '{}'", node + )); } }; @@ -1730,7 +1732,7 @@ void setCameraFromProfile(const Profile& p) { interaction::NavigationState nav; nav.anchor = navStateProfile.anchor; checkNodeExists(nav.anchor); - if (navStateProfile.aim.has_value()) { + if (navStateProfile.aim.has_value() && !(*navStateProfile.aim).empty()) { nav.aim = navStateProfile.aim.value(); checkNodeExists(nav.aim); } From 54ad5bfdd513ebbb2bb0a7f43425d702f144fd3f Mon Sep 17 00:00:00 2001 From: Malin E Date: Wed, 9 Aug 2023 16:04:20 +0200 Subject: [PATCH 081/701] Add pivot property for Models to move model origin --- modules/base/rendering/renderablemodel.cpp | 33 ++++++++++++++-------- modules/base/rendering/renderablemodel.h | 1 + 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/modules/base/rendering/renderablemodel.cpp b/modules/base/rendering/renderablemodel.cpp index e8eb35b013..5b7f5db8aa 100644 --- a/modules/base/rendering/renderablemodel.cpp +++ b/modules/base/rendering/renderablemodel.cpp @@ -143,6 +143,13 @@ namespace { openspace::properties::Property::Visibility::Developer }; + constexpr openspace::properties::Property::PropertyInfo PivotInfo = { + "Pivot", + "Pivot", + "A vector that moves the place of origin for the model", + openspace::properties::Property::Visibility::AdvancedUser + }; + constexpr openspace::properties::Property::PropertyInfo ModelScaleInfo = { "ModelScale", "Model Scale", @@ -278,6 +285,9 @@ namespace { // [[codegen::verbatim(ModelTransformInfo.description)]] std::optional modelTransform; + // [[codegen::verbatim(PivotInfo.description)]] + std::optional pivot; + // [[codegen::verbatim(RotationVecInfo.description)]] std::optional rotationVector; @@ -322,6 +332,12 @@ RenderableModel::RenderableModel(const ghoul::Dictionary& dictionary) glm::dmat4(-1.0), glm::dmat4(1.0) ) + , _pivot( + PivotInfo, + glm::vec3(0.f), + glm::vec3(-std::numeric_limits::max()), + glm::vec3(std::numeric_limits::max()) + ) , _modelScale(ModelScaleInfo, 1.0, std::numeric_limits::epsilon(), 4e+27) , _rotationVec(RotationVecInfo, glm::dvec3(0.0), glm::dvec3(0.0), glm::dvec3(360.0)) , _enableDepthTest(EnableDepthTestInfo, true) @@ -371,17 +387,10 @@ RenderableModel::RenderableModel(const ghoul::Dictionary& dictionary) } } - if (p.modelTransform.has_value()) { - _modelTransform = *p.modelTransform; - } - - if (p.animationStartTime.has_value()) { - _animationStart = *p.animationStartTime; - } - - if (p.enableAnimation.has_value()) { - _enableAnimation = *p.enableAnimation; - } + _modelTransform = p.modelTransform.value_or(_modelTransform); + _pivot = p.pivot.value_or(_pivot); + _animationStart = p.animationStartTime.value_or(_animationStart); + _enableAnimation = p.enableAnimation.value_or(_enableAnimation); if (p.animationTimeScale.has_value()) { if (std::holds_alternative(*p.animationTimeScale)) { @@ -460,6 +469,7 @@ RenderableModel::RenderableModel(const ghoul::Dictionary& dictionary) addProperty(_enableFaceCulling); addProperty(_enableDepthTest); addProperty(_modelTransform); + addProperty(_pivot); addProperty(_rotationVec); addProperty(_modelScale); @@ -781,6 +791,7 @@ void RenderableModel::render(const RenderData& data, RendererTasks&) { // Model transform and view transform needs to be in double precision const glm::dmat4 modelTransform = + glm::translate(glm::dmat4(1.0), glm::dvec3(_pivot.value())) * glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * glm::dmat4(data.modelTransform.rotation) * glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)) * diff --git a/modules/base/rendering/renderablemodel.h b/modules/base/rendering/renderablemodel.h index 25c6f7f919..fd963a7a0d 100644 --- a/modules/base/rendering/renderablemodel.h +++ b/modules/base/rendering/renderablemodel.h @@ -97,6 +97,7 @@ private: properties::BoolProperty _performShading; properties::BoolProperty _enableFaceCulling; properties::DMat4Property _modelTransform; + properties::Vec3Property _pivot; properties::Vec3Property _rotationVec; properties::BoolProperty _enableDepthTest; From 72b186b80573246bbf05aeea98a89af31c36e7c9 Mon Sep 17 00:00:00 2001 From: Malin E Date: Wed, 9 Aug 2023 16:25:36 +0200 Subject: [PATCH 082/701] Fix issue with hide all constellation lines action --- data/assets/scene/digitaluniverse/constellations.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/scene/digitaluniverse/constellations.asset b/data/assets/scene/digitaluniverse/constellations.asset index 8e8ed7d626..b9fdcc55b2 100644 --- a/data/assets/scene/digitaluniverse/constellations.asset +++ b/data/assets/scene/digitaluniverse/constellations.asset @@ -116,7 +116,7 @@ local HideConstellations = { Identifier = "os.constellations.HideConstellations", Name = "Hide all", Command = [[ - openspace.fadeOut("Scene.Constellations.Renderable", nil, "openspace.setPropertyValueSingle('Scene.Constellations.Renderable.Enabled', false); openspace.setPropertyValueSingle("Scene.Constellations.Renderable.ConstellationSelection", {})") + openspace.fadeOut("Scene.Constellations.Renderable", nil, "openspace.setPropertyValueSingle('Scene.Constellations.Renderable.Enabled', false); openspace.setPropertyValueSingle('Scene.Constellations.Renderable.ConstellationSelection', {})") ]], Documentation = "Hides all the constellations lines", GuiPath = "/Constellations/Lines", From ff421bc19ad5b4ae0a9c49cb3524752721dbf3aa Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Wed, 9 Aug 2023 14:47:08 -0400 Subject: [PATCH 083/701] Add JUICE mission file --- .../solarsystem/missions/juice/mission.asset | 67 +++++++++++++++++++ data/profiles/juice.profile | 1 + 2 files changed, 68 insertions(+) create mode 100644 data/assets/scene/solarsystem/missions/juice/mission.asset diff --git a/data/assets/scene/solarsystem/missions/juice/mission.asset b/data/assets/scene/solarsystem/missions/juice/mission.asset new file mode 100644 index 0000000000..879872f148 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/mission.asset @@ -0,0 +1,67 @@ +local Mission = { + Name = "Juice", + Image = "https://www.esa.int/var/esa/storage/images/science_exploration/space_science/juice/23388092-2-eng-GB/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 characterise 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 = { + { + Name = "Earth flyby 1", + Date = "2024 AUG 01 00:00:00", + }, + { + Name = "Venus flyby", + Date = "2025 AUG 01 00:00:00", + }, + { + Name = "Earth flyby 2", + Date = "2026 SEP 01 00:00:00", + }, + { + Name = "Earth flyby 3", + Date = "2029 JAN 01 00:00:00", + }, + { + Name = "Arrival at Jupiter", + Date = "2031 JUL 01 00:00:00", + }, + { + Name = "Europa flyby 1", + Date = "2032 JUL 02 16:21:51", + }, + { + Name = "Europa flyby 2", + Date = "2032 JUL 16 22:18:22", + } + }, + Phases = { + { + Name = "Journey to Jupiter", + TimeRange = { Start = "2023 APR 05 16:25:00", End = "2031 JUL 01 00:00:00" }, + }, + { + Name = "Jupiter orbit ", + TimeRange = { Start = "2031 JUL 01 00:00:00", End = "2033 NOV 01 00:00:00" }, + Phases = { + { + Name = "Jupiter inclined phase - Callisto flybys", + TimeRange = { Start = "2032 AUG 01 00:00:00", End = "2033 AUG 01 00:00:00" }, + Description = "ESA’s Jupiter Icy Moons Explorer – Juice – will catch its first glimpse of ancient, cratered Callisto in June 2032, going on to whizz past the moon 21 times before making a final flyby in 2034. During these close encounters, Juice will collect valuable scientific treasure about the moon.", + + } + } + }, + { + Name = "Ganymede orbit", + TimeRange = { Start = "2034 NOV 01 00:00:00", End = "2035 SEP 01 00:00:00" }, + Description = "Monstrous, mysterious Ganymede is the primary target of ESA’s Jupiter Icy Moons Explorer (Juice) and the largest moon in the Solar System – larger even than Pluto and Mercury! Though Juice will make flybys of all three of Jupiter’s largest Galilean moons (Ganymede, Europa and Callisto), Ganymede is the only one that the spacecraft will orbit. In doing so, Juice will become the first spacecraft ever to orbit a moon other than our own, enabling us to see the Jovian world in a whole new light. Ganymede is also the only moon in the Solar System to generate its own magnetic field. Juice will explore various key topics: Ganymede’s puzzling magnetic field, its hidden ocean, its complex core, its ice content and shell, its interactions with its local environment and that of Jupiter, its past and present activity, and whether or not the moon could be – or ever have been – a habitable environment." + } + } +} + + +asset.onInitialize(function() + openspace.loadMission(Mission) +end) + +asset.onDeinitialize(function() + openspace.unloadMission(Mission.Name) +end) diff --git a/data/profiles/juice.profile b/data/profiles/juice.profile index 1def720964..3fd45ae004 100644 --- a/data/profiles/juice.profile +++ b/data/profiles/juice.profile @@ -9,6 +9,7 @@ "scene/solarsystem/missions/juice/model", "scene/solarsystem/missions/juice/plane", "scene/solarsystem/missions/juice/trail", + "scene/solarsystem/missions/juice/mission", "scene/solarsystem/planets/earth/earth", "scene/solarsystem/planets/jupiter/layers/colorlayers/jupiter_video" ], From 4433abdf7964a36043a510ba1b07fb6f4c5844cc Mon Sep 17 00:00:00 2001 From: GPayne Date: Thu, 10 Aug 2023 05:59:20 -0600 Subject: [PATCH 084/701] Switched to Qt RegularExpression for asset search --- .../launcher/include/profile/assetsdialog.h | 7 +++++-- .../ext/launcher/src/profile/assetsdialog.cpp | 19 +++++++++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/apps/OpenSpace/ext/launcher/include/profile/assetsdialog.h b/apps/OpenSpace/ext/launcher/include/profile/assetsdialog.h index 5ad607efb2..a91f959ea5 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/assetsdialog.h +++ b/apps/OpenSpace/ext/launcher/include/profile/assetsdialog.h @@ -27,13 +27,14 @@ #include #include -#include +#include #include "assettreemodel.h" class QTextEdit; class QTreeView; class SearchProxyModel : public QSortFilterProxyModel { +Q_OBJECT public: /** * Constructor for SearchProxyModel class @@ -42,17 +43,19 @@ public: */ SearchProxyModel(QObject* parent = nullptr) : QSortFilterProxyModel(parent) {} +public slots: /** * Sets the regular expression pattern to apply to the filter * * \param pattern The QString reference containing the regex pattern */ - void setFilterRegExp(const QString& pattern); + void setFilterRegularExpression(const QString& pattern); protected: bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const override; private: + QRegularExpression* _regExPattern = nullptr; bool acceptIndex(const QModelIndex& idx) const; }; diff --git a/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp index dedc8deb20..f464703576 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp @@ -296,14 +296,17 @@ void AssetsDialog::searchTextChanged(const QString& text) { } else { _assetTree->setModel(_searchProxyModel); - _assetProxyModel->setFilterRegExp(text); + _searchProxyModel->setFilterRegularExpression(text); _assetTree->expandAll(); } } - -void SearchProxyModel::setFilterRegExp(const QString& pattern) { - QRegExp regex(pattern, Qt::CaseInsensitive, QRegExp::FixedString); - QSortFilterProxyModel::setFilterRegExp(regex); + +void SearchProxyModel::setFilterRegularExpression(const QString& pattern) { + _regExPattern = new QRegularExpression( + pattern, + QRegularExpression::CaseInsensitiveOption + ); + QSortFilterProxyModel::setFilterRegularExpression(*_regExPattern); } bool SearchProxyModel::filterAcceptsRow(int sourceRow, @@ -316,7 +319,11 @@ bool SearchProxyModel::filterAcceptsRow(int sourceRow, bool SearchProxyModel::acceptIndex(const QModelIndex& idx) const { if (idx.isValid()) { QString text = idx.data(Qt::DisplayRole).toString(); - if (filterRegExp().indexIn(text) >= 0) { + if (!_regExPattern) { + return false; + } + QRegularExpressionMatchIterator matchIterator = _regExPattern->globalMatch(text); + if (matchIterator.hasNext()) { return true; } for (int row = 0; row < idx.model()->rowCount(idx); ++row) { From 8cd6338a565f99834f476468039b8216b4d46127 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Fri, 11 Aug 2023 05:15:03 +0200 Subject: [PATCH 085/701] Perform an update after creating a ScreenSpaceRenderable, causing images to be loaded immediately and provide error messages to the user (closes #2848) --- src/rendering/renderengine.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index f73dbcc2f6..f88a18352f 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -1111,6 +1111,9 @@ void RenderEngine::addScreenSpaceRenderable(std::unique_ptrinitialize(); s->initializeGL(); + // We should do one update cycle to make sure that we have all the data that we need + s->update(); + ScreenSpaceRenderable* ssr = s.get(); global::screenSpaceRootPropertyOwner->addPropertySubOwner(ssr); global::screenSpaceRenderables->push_back(std::move(s)); From ee82691bebd3f9010c1977c757e12ecdb9750274 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Fri, 11 Aug 2023 06:57:43 +0200 Subject: [PATCH 086/701] Transmit the GlobeName through the TileProviderByLevel; Don't explicitly specifiy data and index filenames and not use the same name twice --- modules/globebrowsing/src/rawtiledatareader.cpp | 5 +---- .../globebrowsing/src/tileprovider/tileproviderbylevel.cpp | 7 +++++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/globebrowsing/src/rawtiledatareader.cpp b/modules/globebrowsing/src/rawtiledatareader.cpp index d3f00fe0ea..80a7005c9e 100644 --- a/modules/globebrowsing/src/rawtiledatareader.cpp +++ b/modules/globebrowsing/src/rawtiledatareader.cpp @@ -421,7 +421,6 @@ std::optional RawTileDataReader::mrfCache() { module.mrfCacheLocation(), _cacheProperties.path, datasetIdentifier); std::string root = absPath(path).string(); std::string mrf = root + datasetIdentifier + ".mrf"; - std::string cache = root + datasetIdentifier + ".mrfcache"; if (!std::filesystem::exists(mrf)) { std::error_code ec; @@ -450,7 +449,7 @@ std::optional RawTileDataReader::mrfCache() { return std::nullopt; } - defer{ GDALClose(src); }; + defer { GDALClose(src); }; char** createOpts = nullptr; createOpts = CSLSetNameValue( @@ -475,8 +474,6 @@ std::optional RawTileDataReader::mrfCache() { "blocksize", std::to_string(_cacheProperties.blockSize).c_str() ); - createOpts = CSLSetNameValue(createOpts, "indexname", cache.c_str()); - createOpts = CSLSetNameValue(createOpts, "DATANAME", cache.c_str()); GDALDataset* dst = static_cast( driver->CreateCopy(mrf.c_str(), src, false, createOpts, nullptr, nullptr) diff --git a/modules/globebrowsing/src/tileprovider/tileproviderbylevel.cpp b/modules/globebrowsing/src/tileprovider/tileproviderbylevel.cpp index b86fbca700..0e0f439bfc 100644 --- a/modules/globebrowsing/src/tileprovider/tileproviderbylevel.cpp +++ b/modules/globebrowsing/src/tileprovider/tileproviderbylevel.cpp @@ -56,6 +56,13 @@ TileProviderByLevel::TileProviderByLevel(const ghoul::Dictionary& dictionary) { ghoul::Dictionary& tileProviderDict = provider.tileProvider; tileProviderDict.setValue("LayerGroupID", static_cast(group)); + // Pass down the caching information from the enclosing dictionary + if (dictionary.hasValue("GlobeName")) { + tileProviderDict.setValue( + "GlobeName", + dictionary.value("GlobeName") + ); + } layers::Layer::ID typeID = layers::Layer::ID::DefaultTileProvider; if (tileProviderDict.hasValue("Type")) { std::string type = tileProviderDict.value("Type"); From 0ae73acc55a8cb1b3c29e2e6dbecc64d42cf4be7 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Fri, 11 Aug 2023 07:58:37 +0200 Subject: [PATCH 087/701] Add new Lua functions to get a list of all scene graph nodes, scene graph nodes by renderable type (closes #2558), and all screenspace renderables --- src/scene/scene.cpp | 3 +++ src/scene/scene_lua.inl | 47 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/scene/scene.cpp b/src/scene/scene.cpp index f7c0244f20..17aa498279 100644 --- a/src/scene/scene.cpp +++ b/src/scene/scene.cpp @@ -860,6 +860,9 @@ scripting::LuaLibrary Scene::luaLibrary() { codegen::lua::RemoveSceneGraphNode, codegen::lua::RemoveSceneGraphNodesFromRegex, codegen::lua::HasSceneGraphNode, + codegen::lua::SceneGraphNodes, + codegen::lua::NodeByRenderableType, + codegen::lua::ScreenSpaceRenderables, codegen::lua::AddInterestingTime, codegen::lua::WorldPosition, codegen::lua::WorldRotation, diff --git a/src/scene/scene_lua.inl b/src/scene/scene_lua.inl index 3fb52a7ab4..7c31c0d997 100644 --- a/src/scene/scene_lua.inl +++ b/src/scene/scene_lua.inl @@ -52,6 +52,8 @@ #include #include #include +#include +#include #include #include @@ -877,6 +879,51 @@ namespace { return node != nullptr; } +// Returns a list of all scene graph nodes in the scene +[[codegen::luawrap]] std::vector sceneGraphNodes() { + using namespace openspace; + + const std::vector& nodes = + global::renderEngine->scene()->allSceneGraphNodes(); + std::vector res; + res.reserve(nodes.size()); + for (SceneGraphNode* node : nodes) { + res.push_back(node->identifier()); + } + return res; +} + +// Returns a list of all scene graph nodes in the scene that have a renderable of the +// specific type +[[codegen::luawrap]] std::vector nodeByRenderableType(std::string type) { + using namespace openspace; + + const std::vector& nodes = + global::renderEngine->scene()->allSceneGraphNodes(); + std::vector res; + for (SceneGraphNode* node : nodes) { + Renderable* renderable = node->renderable(); + if (renderable && renderable->typeAsString() == type) { + res.push_back(node->identifier()); + } + } + return res; +} + +// Returns a list of all screen-space renderables +[[codegen::luawrap]] std::vector screenSpaceRenderables() { + using namespace openspace; + + const std::vector& ssrs = + global::renderEngine->screenSpaceRenderables(); + std::vector res; + res.reserve(ssrs.size()); + for (ScreenSpaceRenderable* ssr : ssrs) { + res.push_back(ssr->identifier()); + } + return res; +} + /** * Adds an interesting time to the current scene. The first argument is the name of the * time and the second argument is the time itself in the format YYYY-MM-DDThh:mm:ss.uuu From cb68ab87d94683ea4efa59af15b7318f78f9d3e5 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Fri, 11 Aug 2023 09:42:24 +0200 Subject: [PATCH 088/701] Remove unused extra name for the amount of points in the eclipse cone and shadow cylinder --- modules/space/rendering/renderableeclipsecone.cpp | 2 +- .../rendering/renderableshadowcylinder.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/space/rendering/renderableeclipsecone.cpp b/modules/space/rendering/renderableeclipsecone.cpp index 93887214a3..2610b49fb2 100644 --- a/modules/space/rendering/renderableeclipsecone.cpp +++ b/modules/space/rendering/renderableeclipsecone.cpp @@ -135,7 +135,7 @@ namespace { struct [[codegen::Dictionary(RenderableEclipseCone)]] Parameters { // [[codegen::verbatim(NumberPointsInfo.description)]] - std::optional numberOfPoints [[codegen::key("AmountOfPoints")]]; + std::optional numberOfPoints; // [[codegen::verbatim(ShadowLengthInfo.description)]] std::optional shadowLength; diff --git a/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp b/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp index 0e1c4ca3cc..dc18010b34 100644 --- a/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp +++ b/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp @@ -115,7 +115,7 @@ namespace { struct [[codegen::Dictionary(RenderableShadowCylinder)]] Parameters { // [[codegen::verbatim(NumberPointsInfo.description)]] - std::optional numberOfPoints [[codegen::key("AmountOfPoints")]]; + std::optional numberOfPoints; // [[codegen::verbatim(ShadowLengthInfo.description)]] std::optional shadowLength; From 4ebdd58c97411d147769cca9ca2a9eba8591a308 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Fri, 11 Aug 2023 09:45:50 +0200 Subject: [PATCH 089/701] Improve rendering of debug spheres (#2849) Render in sticker, remove triangle mesh to make it easier to see if one sphere is inside the other, and add a description of which sphere is which --- src/scene/scenegraphnode.cpp | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/scene/scenegraphnode.cpp b/src/scene/scenegraphnode.cpp index 5ec8cb0a4b..8e0970d1cc 100644 --- a/src/scene/scenegraphnode.cpp +++ b/src/scene/scenegraphnode.cpp @@ -162,7 +162,9 @@ namespace { "ShowDebugSphere", "Show Debug Sphere", "If enabled the bounding sphere of this scene graph node is rendered as a debug " - "method", + "method. The interaction sphere is rendered in cyan and the bounding sphere in " + "purple. If only one is visible, this may be because the spheres have equal " + "size and are overlapping.", // @VISIBILITY(3.67) openspace::properties::Property::Visibility::AdvancedUser }; @@ -770,11 +772,7 @@ void SceneGraphNode::render(const RenderData& data, RendererTasks& tasks) { _renderable->renderSecondary(newData, tasks); } - if (!_renderable->matchesRenderBinMask(data.renderBinMask)) { - return; - } - - { + if (_renderable->matchesRenderBinMask(data.renderBinMask)) { TracyGpuZone("Render") _renderable->render(newData, tasks); @@ -784,13 +782,16 @@ void SceneGraphNode::render(const RenderData& data, RendererTasks& tasks) { } } - if (_showDebugSphere) { + bool isInStickerBin = + data.renderBinMask & static_cast(Renderable::RenderBin::Sticker); + + if (_showDebugSphere && isInStickerBin) { if (const double bs = boundingSphere(); bs > 0.0) { renderDebugSphere(data.camera, bs, glm::vec4(0.5f, 0.15f, 0.5f, 0.75f)); } if (const double is = interactionSphere(); is > 0.0) { - renderDebugSphere(data.camera, is, glm::vec4(0.15f, 0.35f, 0.85f, 0.75f)); + renderDebugSphere(data.camera, is, glm::vec4(0.15f, 0.75f, 0.75f, 0.75f)); } } } @@ -812,20 +813,14 @@ void SceneGraphNode::renderDebugSphere(const Camera& camera, double size, glm::v _debugSphereProgram->setUniform("color", color); glEnable(GL_BLEND); + glEnable(GL_LINE_SMOOTH); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glBindVertexArray(rendering::helper::vertexObjects.sphere.vao); - glDrawElements( - GL_TRIANGLES, - rendering::helper::vertexObjects.sphere.nElements, - GL_UNSIGNED_SHORT, - nullptr - ); glLineWidth(2.0); - _debugSphereProgram->setUniform("color", glm::vec4(1.f, 1.f, 1.f, 1.f)); glDrawElements( GL_LINES, rendering::helper::vertexObjects.sphere.nElements, From c1aefb33d02bf2761f4100331f1f9314f5d8d174 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Fri, 11 Aug 2023 10:53:37 -0400 Subject: [PATCH 090/701] Update data/assets/scene/solarsystem/missions/juice/mission.asset Co-authored-by: Alexander Bock --- data/assets/scene/solarsystem/missions/juice/mission.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/scene/solarsystem/missions/juice/mission.asset b/data/assets/scene/solarsystem/missions/juice/mission.asset index 879872f148..d6eac6bb99 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 = { Name = "Juice", Image = "https://www.esa.int/var/esa/storage/images/science_exploration/space_science/juice/23388092-2-eng-GB/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 characterise 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.", + 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 = { { Name = "Earth flyby 1", From 873cc862c6be6ad738b0057c371672fa349287ed Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Fri, 11 Aug 2023 10:53:42 -0400 Subject: [PATCH 091/701] Update data/assets/scene/solarsystem/missions/juice/mission.asset Co-authored-by: Alexander Bock --- data/assets/scene/solarsystem/missions/juice/mission.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/scene/solarsystem/missions/juice/mission.asset b/data/assets/scene/solarsystem/missions/juice/mission.asset index d6eac6bb99..d7c507561f 100644 --- a/data/assets/scene/solarsystem/missions/juice/mission.asset +++ b/data/assets/scene/solarsystem/missions/juice/mission.asset @@ -38,7 +38,7 @@ local Mission = { TimeRange = { Start = "2023 APR 05 16:25:00", End = "2031 JUL 01 00:00:00" }, }, { - Name = "Jupiter orbit ", + Name = "Jupiter orbit", TimeRange = { Start = "2031 JUL 01 00:00:00", End = "2033 NOV 01 00:00:00" }, Phases = { { From 03d79a7b961ea867ed9ae751b7c0b0b1b451c8ad Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Fri, 11 Aug 2023 10:53:55 -0400 Subject: [PATCH 092/701] Update data/assets/scene/solarsystem/missions/juice/mission.asset Co-authored-by: Alexander Bock --- data/assets/scene/solarsystem/missions/juice/mission.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/scene/solarsystem/missions/juice/mission.asset b/data/assets/scene/solarsystem/missions/juice/mission.asset index d7c507561f..d679bf5b50 100644 --- a/data/assets/scene/solarsystem/missions/juice/mission.asset +++ b/data/assets/scene/solarsystem/missions/juice/mission.asset @@ -44,7 +44,7 @@ local Mission = { { Name = "Jupiter inclined phase - Callisto flybys", TimeRange = { Start = "2032 AUG 01 00:00:00", End = "2033 AUG 01 00:00:00" }, - Description = "ESA’s Jupiter Icy Moons Explorer – Juice – will catch its first glimpse of ancient, cratered Callisto in June 2032, going on to whizz past the moon 21 times before making a final flyby in 2034. During these close encounters, Juice will collect valuable scientific treasure about the moon.", + Description = "ESA's Jupiter Icy Moons Explorer - Juice - will catch its first glimpse of ancient, cratered Callisto in June 2032, going on to whizz past the moon 21 times before making a final flyby in 2034. During these close encounters, Juice will collect valuable scientific treasure about the moon.", } } From 68c587fec84ec4390dbd714ade3eccebedb29dbd Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Fri, 11 Aug 2023 10:54:01 -0400 Subject: [PATCH 093/701] Update data/assets/scene/solarsystem/missions/juice/mission.asset Co-authored-by: Alexander Bock --- data/assets/scene/solarsystem/missions/juice/mission.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/scene/solarsystem/missions/juice/mission.asset b/data/assets/scene/solarsystem/missions/juice/mission.asset index d679bf5b50..7197776353 100644 --- a/data/assets/scene/solarsystem/missions/juice/mission.asset +++ b/data/assets/scene/solarsystem/missions/juice/mission.asset @@ -52,7 +52,7 @@ local Mission = { { Name = "Ganymede orbit", TimeRange = { Start = "2034 NOV 01 00:00:00", End = "2035 SEP 01 00:00:00" }, - Description = "Monstrous, mysterious Ganymede is the primary target of ESA’s Jupiter Icy Moons Explorer (Juice) and the largest moon in the Solar System – larger even than Pluto and Mercury! Though Juice will make flybys of all three of Jupiter’s largest Galilean moons (Ganymede, Europa and Callisto), Ganymede is the only one that the spacecraft will orbit. In doing so, Juice will become the first spacecraft ever to orbit a moon other than our own, enabling us to see the Jovian world in a whole new light. Ganymede is also the only moon in the Solar System to generate its own magnetic field. Juice will explore various key topics: Ganymede’s puzzling magnetic field, its hidden ocean, its complex core, its ice content and shell, its interactions with its local environment and that of Jupiter, its past and present activity, and whether or not the moon could be – or ever have been – a habitable environment." + Description = "Monstrous, mysterious Ganymede is the primary target of ESA's Jupiter Icy Moons Explorer (Juice) and the largest moon in the Solar System - larger even than Pluto and Mercury! Though Juice will make flybys of all three of Jupiter's largest Galilean moons (Ganymede, Europa and Callisto), Ganymede is the only one that the spacecraft will orbit. In doing so, Juice will become the first spacecraft ever to orbit a moon other than our own, enabling us to see the Jovian world in a whole new light. Ganymede is also the only moon in the Solar System to generate its own magnetic field. Juice will explore various key topics: Ganymede's puzzling magnetic field, its hidden ocean, its complex core, its ice content and shell, its interactions with its local environment and that of Jupiter, its past and present activity, and whether or not the moon could be - or ever have been - a habitable environment." } } } From e7cad060c236ee8987b47b554d25ad2a515a7c1a Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Fri, 11 Aug 2023 20:58:41 +0200 Subject: [PATCH 094/701] Adapt to coding style --- include/openspace/rendering/screenspacerenderable.h | 2 +- .../atmosphere/rendering/atmospheredeferredcaster.cpp | 9 ++++++--- modules/atmosphere/rendering/renderableatmosphere.cpp | 9 +++++---- modules/base/basemodule.cpp | 4 +++- modules/base/rendering/renderablesphereimagelocal.cpp | 3 ++- modules/base/rendering/renderablesphereimageonline.cpp | 3 ++- .../src/tileprovider/tileindextileprovider.cpp | 2 +- modules/space/rendering/renderableeclipsecone.cpp | 4 ++-- modules/space/rendering/renderableeclipsecone.h | 6 +++--- src/navigation/navigationhandler_lua.inl | 4 +++- src/scene/scene_lua.inl | 4 ++-- src/util/time_lua.inl | 2 +- 12 files changed, 31 insertions(+), 21 deletions(-) diff --git a/include/openspace/rendering/screenspacerenderable.h b/include/openspace/rendering/screenspacerenderable.h index 886e16c109..6ef0225c8a 100644 --- a/include/openspace/rendering/screenspacerenderable.h +++ b/include/openspace/rendering/screenspacerenderable.h @@ -140,7 +140,7 @@ protected: properties::TriggerProperty _delete; glm::ivec2 _objectSize = glm::ivec2(0); - UniformCache(color, opacity, mvp, texture, backgroundColor, gamma, + UniformCache(color, opacity, mvp, texture, backgroundColor, gamma, borderColor, borderWidth) _uniformCache; std::unique_ptr _shader; }; diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp index 5223fba086..9724972f3e 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp @@ -271,7 +271,7 @@ void AtmosphereDeferredcaster::deinitialize() { void AtmosphereDeferredcaster::update(const UpdateData&) {} float AtmosphereDeferredcaster::eclipseShadow(glm::dvec3 position) { - // This code is copied from the atmosphere deferred fragment shader + // This code is copied from the atmosphere deferred fragment shader // It is used to calculate the eclipse shadow if (_shadowDataArrayCache.empty() || !_shadowDataArrayCache.front().isShadowing) { return 1.f; @@ -280,7 +280,8 @@ float AtmosphereDeferredcaster::eclipseShadow(glm::dvec3 position) { const ShadowRenderingStruct& shadow = _shadowDataArrayCache.front(); const glm::dvec3 positionToCaster = shadow.casterPositionVec - position; const glm::dvec3 sourceToCaster = shadow.sourceCasterVec; // Normalized - const glm::dvec3 casterShadow = dot(positionToCaster, sourceToCaster) * sourceToCaster; + const glm::dvec3 casterShadow = + dot(positionToCaster, sourceToCaster) * sourceToCaster; const glm::dvec3 positionToShadow = positionToCaster - casterShadow; float distanceToShadow = static_cast(length(positionToShadow)); @@ -469,7 +470,9 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& data, const Deferred shadow.radiusCaster = actualCasterRadius; shadow.sourceCasterVec = glm::normalize(sourceCasterVec); shadow.penumbra = xpTest; - shadow.umbra = shadow.radiusCaster * scLength / (shadow.radiusSource - shadow.radiusCaster); + shadow.umbra = + shadow.radiusCaster * scLength / + (shadow.radiusSource - shadow.radiusCaster); shadow.casterPositionVec = casterPos; } _shadowDataArrayCache.push_back(shadow); diff --git a/modules/atmosphere/rendering/renderableatmosphere.cpp b/modules/atmosphere/rendering/renderableatmosphere.cpp index a49601e4f8..cb3b74c070 100644 --- a/modules/atmosphere/rendering/renderableatmosphere.cpp +++ b/modules/atmosphere/rendering/renderableatmosphere.cpp @@ -519,11 +519,12 @@ void RenderableAtmosphere::updateAtmosphereParameters() { void RenderableAtmosphere::setDimmingCoefficient(const glm::dmat4& modelTransform) { // Calculate if the camera is in the atmosphere and if it is in the sunny region const glm::dvec3 cameraPos = global::navigationHandler->camera()->positionVec3(); - // TODO: change the assumption that the Sun is placed in the origin - const glm::dvec3 planetPos = glm::dvec3(modelTransform * glm::dvec4(0.0, 0.0, 0.0, 1.0)); + // TODO: change the assumption that the Sun is placed in the origin + const glm::dvec3 planetPos = + glm::dvec3(modelTransform * glm::dvec4(0.0, 0.0, 0.0, 1.0)); const glm::dvec3 normalUnderCamera = glm::normalize(cameraPos - planetPos); const glm::dvec3 vecToSun = glm::normalize(-planetPos); - + float cameraDistance = static_cast(glm::distance(planetPos, cameraPos)); float cameraSunAngle = static_cast( glm::degrees(glm::acos(glm::dot(vecToSun, normalUnderCamera)) @@ -536,7 +537,7 @@ void RenderableAtmosphere::setDimmingCoefficient(const glm::dmat4& modelTransfor float atmosphereEdge = KM_TO_M * (_planetRadius + _atmosphereHeight); bool cameraIsInAtmosphere = cameraDistance < atmosphereEdge; - // Don't fade if camera is not in the sunny part of an atmosphere + // Don't fade if camera is not in the sunny part of an atmosphere if (!cameraIsInAtmosphere || !cameraIsInSun) { return; } diff --git a/modules/base/basemodule.cpp b/modules/base/basemodule.cpp index 0ab2488a03..8b8bbf2bc5 100644 --- a/modules/base/basemodule.cpp +++ b/modules/base/basemodule.cpp @@ -148,7 +148,9 @@ void BaseModule::internalInitialize(const ghoul::Dictionary&) { ); fRenderable->registerClass("RenderableRadialGrid"); fRenderable->registerClass("RenderableSphereImageLocal"); - fRenderable->registerClass("RenderableSphereImageOnline"); + fRenderable->registerClass( + "RenderableSphereImageOnline" + ); fRenderable->registerClass("RenderableSphericalGrid"); fRenderable->registerClass("RenderableTrailOrbit"); fRenderable->registerClass("RenderableTrailTrajectory"); diff --git a/modules/base/rendering/renderablesphereimagelocal.cpp b/modules/base/rendering/renderablesphereimagelocal.cpp index 13b8f64ed9..92810ecc80 100644 --- a/modules/base/rendering/renderablesphereimagelocal.cpp +++ b/modules/base/rendering/renderablesphereimagelocal.cpp @@ -61,7 +61,8 @@ documentation::Documentation RenderableSphereImageLocal::Documentation() { return codegen::doc("base_renderable_sphere_image_local"); } -RenderableSphereImageLocal::RenderableSphereImageLocal(const ghoul::Dictionary& dictionary) +RenderableSphereImageLocal::RenderableSphereImageLocal( + const ghoul::Dictionary& dictionary) : RenderableSphere(dictionary) , _texturePath(TextureInfo) { diff --git a/modules/base/rendering/renderablesphereimageonline.cpp b/modules/base/rendering/renderablesphereimageonline.cpp index 1cc0e04d86..d21e9d4bea 100644 --- a/modules/base/rendering/renderablesphereimageonline.cpp +++ b/modules/base/rendering/renderablesphereimageonline.cpp @@ -56,7 +56,8 @@ documentation::Documentation RenderableSphereImageOnline::Documentation() { return codegen::doc("base_renderable_sphere_image_online"); } -RenderableSphereImageOnline::RenderableSphereImageOnline(const ghoul::Dictionary& dictionary) +RenderableSphereImageOnline::RenderableSphereImageOnline( + const ghoul::Dictionary& dictionary) : RenderableSphere(dictionary) , _textureUrl(TextureInfo) { diff --git a/modules/globebrowsing/src/tileprovider/tileindextileprovider.cpp b/modules/globebrowsing/src/tileprovider/tileindextileprovider.cpp index 1e2e38a142..ad4de6f268 100644 --- a/modules/globebrowsing/src/tileprovider/tileindextileprovider.cpp +++ b/modules/globebrowsing/src/tileprovider/tileindextileprovider.cpp @@ -42,7 +42,7 @@ namespace { } // namespace namespace openspace::globebrowsing { - + documentation::Documentation TileIndexTileProvider::Documentation() { return codegen::doc("globebrowsing_tileindextileprovider"); } diff --git a/modules/space/rendering/renderableeclipsecone.cpp b/modules/space/rendering/renderableeclipsecone.cpp index 2610b49fb2..05b528c4b8 100644 --- a/modules/space/rendering/renderableeclipsecone.cpp +++ b/modules/space/rendering/renderableeclipsecone.cpp @@ -446,7 +446,7 @@ void RenderableEclipseCone::createCone(double et) { lightSourceToShadower, distance * static_cast(_shadowLength) ); - + // We need to duplicate the first two vertices to close the cylinder at the seam penumbralVertices.push_back(penumbralVertices[0]); penumbralVertices.push_back(penumbralVertices[1]); @@ -477,7 +477,7 @@ void RenderableEclipseCone::createCone(double et) { umbralVertices.push_back(umbralVertices[1]); } - + // 6. Combine vertices std::vector vertices; vertices.reserve(umbralVertices.size() + penumbralVertices.size()); diff --git a/modules/space/rendering/renderableeclipsecone.h b/modules/space/rendering/renderableeclipsecone.h index 0d7d6253fe..bee608a571 100644 --- a/modules/space/rendering/renderableeclipsecone.h +++ b/modules/space/rendering/renderableeclipsecone.h @@ -22,8 +22,8 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#ifndef __OPENSPACE_MODULE_SPACECRAFTINSTRUMENTS___RENDERABLEECLIPSECONE___H__ -#define __OPENSPACE_MODULE_SPACECRAFTINSTRUMENTS___RENDERABLEECLIPSECONE___H__ +#ifndef __OPENSPACE_MODULE_SPACE___RENDERABLEECLIPSECONE___H__ +#define __OPENSPACE_MODULE_SPACE___RENDERABLEECLIPSECONE___H__ #include @@ -84,4 +84,4 @@ private: } // namespace openspace -#endif // __OPENSPACE_MODULE_SPACECRAFTINSTRUMENTS___RENDERABLEECLIPSECONE___H__ +#endif // __OPENSPACE_MODULE_SPACE___RENDERABLEECLIPSECONE___H__ diff --git a/src/navigation/navigationhandler_lua.inl b/src/navigation/navigationhandler_lua.inl index b43f3d3582..983c51c089 100644 --- a/src/navigation/navigationhandler_lua.inl +++ b/src/navigation/navigationhandler_lua.inl @@ -250,7 +250,9 @@ namespace { * bool. */ [[codegen::luawrap]] -std::tuple +std::tuple< + std::string, bool, std::string, bool, bool, double, std::string, float, float, bool +> joystickAxis(std::string joystickName, int axis) { using namespace openspace; diff --git a/src/scene/scene_lua.inl b/src/scene/scene_lua.inl index 7c31c0d997..f5728f5ed5 100644 --- a/src/scene/scene_lua.inl +++ b/src/scene/scene_lua.inl @@ -882,7 +882,7 @@ namespace { // Returns a list of all scene graph nodes in the scene [[codegen::luawrap]] std::vector sceneGraphNodes() { using namespace openspace; - + const std::vector& nodes = global::renderEngine->scene()->allSceneGraphNodes(); std::vector res; @@ -914,7 +914,7 @@ namespace { [[codegen::luawrap]] std::vector screenSpaceRenderables() { using namespace openspace; - const std::vector& ssrs = + const std::vector& ssrs = global::renderEngine->screenSpaceRenderables(); std::vector res; res.reserve(ssrs.size()); diff --git a/src/util/time_lua.inl b/src/util/time_lua.inl index e32ff13bdf..ceaaaab423 100644 --- a/src/util/time_lua.inl +++ b/src/util/time_lua.inl @@ -322,7 +322,7 @@ namespace { else { b = openspace::Time(std::get(base)).ISO8601(); } - + std::string c; if (std::holds_alternative(change)) { c = std::get(change); From cbe215fc5b30ffa495c210f62e441cb4f33b84c2 Mon Sep 17 00:00:00 2001 From: Gene Payne Date: Fri, 11 Aug 2023 16:16:19 -0600 Subject: [PATCH 095/701] Code review changes --- .../launcher/include/profile/assetsdialog.h | 7 +++-- .../ext/launcher/src/profile/assetsdialog.cpp | 29 ++++++++++--------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/apps/OpenSpace/ext/launcher/include/profile/assetsdialog.h b/apps/OpenSpace/ext/launcher/include/profile/assetsdialog.h index a91f959ea5..0ca2607aa5 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/assetsdialog.h +++ b/apps/OpenSpace/ext/launcher/include/profile/assetsdialog.h @@ -26,8 +26,8 @@ #define __OPENSPACE_UI_LAUNCHER___ASSETSDIALOG___H__ #include -#include #include +#include #include "assettreemodel.h" class QTextEdit; @@ -41,7 +41,7 @@ public: * * \param parent The QObject* object that is the Qt parent of this object */ - SearchProxyModel(QObject* parent = nullptr) : QSortFilterProxyModel(parent) {} + SearchProxyModel(QObject* parent = nullptr); public slots: /** @@ -55,8 +55,9 @@ protected: bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const override; private: - QRegularExpression* _regExPattern = nullptr; bool acceptIndex(const QModelIndex& idx) const; + + QRegularExpression* _regExPattern = nullptr; }; class AssetsDialog final : public QDialog { diff --git a/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp index f464703576..00dff88e11 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp @@ -64,7 +64,7 @@ namespace { { int startIndex = 0; std::string token = "${USER_ASSETS}/"; - if (path.find(token) == 0) { + if (path.starts_with(token)) { startIndex = static_cast(token.length()); } const size_t slash = path.find_first_of('/', startIndex); @@ -301,6 +301,10 @@ void AssetsDialog::searchTextChanged(const QString& text) { } } +SearchProxyModel::SearchProxyModel(QObject* parent) + : QSortFilterProxyModel(parent) +{} + void SearchProxyModel::setFilterRegularExpression(const QString& pattern) { _regExPattern = new QRegularExpression( pattern, @@ -317,20 +321,19 @@ bool SearchProxyModel::filterAcceptsRow(int sourceRow, } bool SearchProxyModel::acceptIndex(const QModelIndex& idx) const { - if (idx.isValid()) { - QString text = idx.data(Qt::DisplayRole).toString(); - if (!_regExPattern) { - return false; - } - QRegularExpressionMatchIterator matchIterator = _regExPattern->globalMatch(text); - if (matchIterator.hasNext()) { + if (!idx.isValid() || !_regExPattern) { + return false; + } + QString text = idx.data(Qt::DisplayRole).toString(); + QRegularExpressionMatchIterator matchIterator = _regExPattern->globalMatch(text); + if (matchIterator.hasNext()) { + return true; + } + for (int row = 0; row < idx.model()->rowCount(idx); ++row) { + if (acceptIndex(idx.model()->index(row, 0, idx))) { return true; } - for (int row = 0; row < idx.model()->rowCount(idx); ++row) { - if (acceptIndex(idx.model()->index(row, 0, idx))) { - return true; - } - } } + return false; } From f179f20c9611f80d9dbb5b0de102affedca5754b Mon Sep 17 00:00:00 2001 From: Joakim Kilby Date: Mon, 14 Aug 2023 13:38:20 +0200 Subject: [PATCH 096/701] Remove tile-padding to reduce stair-stepping issues (#2842) * account for availability of next level in desired level solves #2834 * remove tile-padding option & functionality * remove (no longer needed) recursive read function since we no longer padd tiles we cannot sample outside of a read region anymore. * change default tilesize for heightlayers to avoid discontinuities * make frustum culling control a debug property * Small style guide fix * clarify if-statement with comment * add variable for default height-tile resolution, update comment --------- Co-authored-by: Alexander Bock --- .../shaders/texturetilemapping.glsl | 45 ++---- modules/globebrowsing/shaders/tile.glsl | 6 - modules/globebrowsing/src/gpulayergroup.cpp | 14 -- modules/globebrowsing/src/gpulayergroup.h | 3 +- modules/globebrowsing/src/layer.cpp | 25 +-- modules/globebrowsing/src/layer.h | 5 - .../src/memoryawaretilecache.cpp | 2 +- .../globebrowsing/src/rawtiledatareader.cpp | 149 ++---------------- modules/globebrowsing/src/rawtiledatareader.h | 7 - modules/globebrowsing/src/renderableglobe.cpp | 23 ++- modules/globebrowsing/src/renderableglobe.h | 1 + .../src/tileprovider/defaulttileprovider.cpp | 9 +- .../src/tileprovider/defaulttileprovider.h | 1 - .../src/tileprovider/temporaltileprovider.cpp | 1 - .../src/tileprovider/tileprovider.cpp | 1 - .../globebrowsing/src/tiletextureinitdata.cpp | 25 +-- .../globebrowsing/src/tiletextureinitdata.h | 8 +- 17 files changed, 60 insertions(+), 265 deletions(-) diff --git a/modules/globebrowsing/shaders/texturetilemapping.glsl b/modules/globebrowsing/shaders/texturetilemapping.glsl index d7e39c3431..cb59d52a45 100644 --- a/modules/globebrowsing/shaders/texturetilemapping.glsl +++ b/modules/globebrowsing/shaders/texturetilemapping.glsl @@ -108,30 +108,23 @@ vec4 performLayerSettings(vec4 value, LayerSettings settings) { return vec4(v, value.a * settings.opacity); } -vec2 tileUVToTextureSamplePosition(ChunkTile chunkTile, vec2 tileUV, PixelPadding padding) +vec2 tileUVToTextureSamplePosition(ChunkTile chunkTile, vec2 tileUV) { - vec2 uv = chunkTile.uvTransform.uvOffset + chunkTile.uvTransform.uvScale * tileUV; - - // compensateSourceTextureSampling - ivec2 resolution = textureSize(chunkTile.textureSampler, 0); - vec2 sourceSize = vec2(resolution) + padding.sizeDifference; - vec2 currentSize = vec2(resolution); - vec2 sourceToCurrentSize = currentSize / sourceSize; - return sourceToCurrentSize * (uv - padding.startOffset / sourceSize); + return chunkTile.uvTransform.uvOffset + chunkTile.uvTransform.uvScale * tileUV; } -vec4 getTexVal(ChunkTilePile chunkTilePile, vec3 w, vec2 uv, PixelPadding padding) { +vec4 getTexVal(ChunkTilePile chunkTilePile, vec3 w, vec2 uv) { vec4 v1 = texture( chunkTilePile.chunkTile0.textureSampler, - tileUVToTextureSamplePosition(chunkTilePile.chunkTile0, uv, padding) + tileUVToTextureSamplePosition(chunkTilePile.chunkTile0, uv) ); vec4 v2 = texture( chunkTilePile.chunkTile1.textureSampler, - tileUVToTextureSamplePosition(chunkTilePile.chunkTile1, uv, padding) + tileUVToTextureSamplePosition(chunkTilePile.chunkTile1, uv) ); vec4 v3 = texture( chunkTilePile.chunkTile2.textureSampler, - tileUVToTextureSamplePosition(chunkTilePile.chunkTile2, uv, padding) + tileUVToTextureSamplePosition(chunkTilePile.chunkTile2, uv) ); return w.x * v1 + w.y * v2 + w.z * v3; @@ -147,27 +140,27 @@ vec4 getSample#{layerGroup}#{i}(vec2 uv, vec3 levelWeights, // All tile layers are the same. Sample from texture #if (#{#{layerGroup}#{i}LayerType} == 0) // DefaultTileProvider - c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); + c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv); #elif (#{#{layerGroup}#{i}LayerType} == 1) // SingleImageProvider - c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); + c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv); #elif (#{#{layerGroup}#{i}LayerType} == 2) // ImageSequenceTileProvider - c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); + c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv); #elif (#{#{layerGroup}#{i}LayerType} == 3) // SizeReferenceTileProvider - c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); + c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv); #elif (#{#{layerGroup}#{i}LayerType} == 4) // TemporalTileProvider - c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); + c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv); #elif (#{#{layerGroup}#{i}LayerType} == 5) // TileIndexTileProvider - c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); + c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv); #elif (#{#{layerGroup}#{i}LayerType} == 6) // TileProviderByIndex - c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); + c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv); #elif (#{#{layerGroup}#{i}LayerType} == 7) // TileProviderByLevel - c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); + c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv); #elif (#{#{layerGroup}#{i}LayerType} == 8) // SolidColor c.rgb = #{layerGroup}[#{i}].color; #elif (#{#{layerGroup}#{i}LayerType} == 9) // SpoutImageProvider - c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); + c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv); #elif (#{#{layerGroup}#{i}LayerType} == 10) // VideoTileProvider - c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); + c = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv); #endif return c; @@ -332,12 +325,8 @@ vec4 calculateDebugColor(vec2 uv, vec4 fragPos, vec2 vertexResolution) { } float tileResolution(vec2 tileUV, ChunkTile chunkTile) { - PixelPadding padding; - padding.startOffset = ivec2(0); - padding.sizeDifference = ivec2(0); - vec2 heightResolution = textureSize(chunkTile.textureSampler, 0); - vec2 uv = tileUVToTextureSamplePosition(chunkTile, tileUV, padding); + vec2 uv = tileUVToTextureSamplePosition(chunkTile, tileUV); return gridDots(uv, heightResolution); } diff --git a/modules/globebrowsing/shaders/tile.glsl b/modules/globebrowsing/shaders/tile.glsl index b525bc3852..37872327bf 100644 --- a/modules/globebrowsing/shaders/tile.glsl +++ b/modules/globebrowsing/shaders/tile.glsl @@ -40,11 +40,6 @@ struct ChunkTile { TileUvTransform uvTransform; }; -struct PixelPadding { - ivec2 startOffset; - ivec2 sizeDifference; -}; - struct ChunkTilePile { ChunkTile chunkTile0; ChunkTile chunkTile1; @@ -69,7 +64,6 @@ struct Layer { TileDepthTransform depthTransform; LayerSettings settings; LayerAdjustment adjustment; - PixelPadding padding; // Other layer type properties stuff vec3 color; diff --git a/modules/globebrowsing/src/gpulayergroup.cpp b/modules/globebrowsing/src/gpulayergroup.cpp index adc2f7b6ea..8aa8a347b1 100644 --- a/modules/globebrowsing/src/gpulayergroup.cpp +++ b/modules/globebrowsing/src/gpulayergroup.cpp @@ -94,12 +94,6 @@ void GPULayerGroup::setValue(ghoul::opengl::ProgramObject& program, program.setUniform(t.uniformCache.uvOffset, ct.uvTransform.uvOffset); program.setUniform(t.uniformCache.uvScale, ct.uvTransform.uvScale); } - - program.setUniform(galuc.paddingStartOffset, al.tilePixelStartOffset()); - program.setUniform( - galuc.paddingSizeDifference, - al.tilePixelSizeDifference() - ); break; } case layers::Layer::ID::SolidColor: @@ -166,14 +160,6 @@ void GPULayerGroup::bind(ghoul::opengl::ProgramObject& p, const LayerGroup& laye tuc.uvOffset = p.uniformLocation(n + "uvTransform.uvOffset"); tuc.uvScale = p.uniformLocation(n + "uvTransform.uvScale"); } - - galuc.paddingStartOffset = p.uniformLocation( - name + "padding.startOffset" - ); - galuc.paddingSizeDifference = p.uniformLocation( - name + "padding.sizeDifference" - ); - break; } case layers::Layer::ID::SolidColor: diff --git a/modules/globebrowsing/src/gpulayergroup.h b/modules/globebrowsing/src/gpulayergroup.h index 7ff8197b22..dd9f4697a7 100644 --- a/modules/globebrowsing/src/gpulayergroup.h +++ b/modules/globebrowsing/src/gpulayergroup.h @@ -78,8 +78,7 @@ private: std::vector gpuChunkTiles; UniformCache(opacity, gamma, multiplier, offset, valueBlending, chromaKeyColor, - chromaKeyTolerance, paddingStartOffset, paddingSizeDifference, color, - depthOffset, depthScale) uniformCache; + chromaKeyTolerance, color, depthOffset, depthScale) uniformCache; bool isHeightLayer = false; }; diff --git a/modules/globebrowsing/src/layer.cpp b/modules/globebrowsing/src/layer.cpp index f9da70aa1a..867bfcbc94 100644 --- a/modules/globebrowsing/src/layer.cpp +++ b/modules/globebrowsing/src/layer.cpp @@ -132,10 +132,6 @@ namespace { // the layer is disabled std::optional enabled; - // Determines whether the downloaded tiles should have a padding added to the - // borders - std::optional padTiles; - // The opacity value of the layer std::optional opacity [[codegen::inrange(0.0, 1.0)]]; @@ -233,11 +229,7 @@ Layer::Layer(layers::Group::ID id, const ghoul::Dictionary& layerDict, LayerGrou addProperty(_guiDescription); } - const bool padTiles = p.padTiles.value_or(true); - - TileTextureInitData initData = tileTextureInitData(_layerGroupId, padTiles); - _padTilePixelStartOffset = initData.tilePixelStartOffset; - _padTilePixelSizeDifference = initData.tilePixelSizeDifference; + TileTextureInitData initData = tileTextureInitData(_layerGroupId); _opacity = p.opacity.value_or(_opacity); addProperty(Fadeable::_opacity); @@ -472,25 +464,12 @@ void Layer::update() { } } -glm::ivec2 Layer::tilePixelStartOffset() const { - return _padTilePixelStartOffset; -} - -glm::ivec2 Layer::tilePixelSizeDifference() const { - return _padTilePixelSizeDifference; -} - glm::vec2 Layer::tileUvToTextureSamplePosition(const TileUvTransform& uvTransform, const glm::vec2& tileUV, const glm::uvec2& resolution) { glm::vec2 uv = uvTransform.uvOffset + uvTransform.uvScale * tileUV; - - const glm::vec2 sourceSize = glm::vec2(resolution) + - glm::vec2(_padTilePixelSizeDifference); - const glm::vec2 currentSize = glm::vec2(resolution); - const glm::vec2 sourceToCurrentSize = currentSize / sourceSize; - return sourceToCurrentSize * (uv - glm::vec2(_padTilePixelStartOffset) / sourceSize); + return uv; } void Layer::initializeBasedOnType(layers::Layer::ID id, ghoul::Dictionary initDict) { diff --git a/modules/globebrowsing/src/layer.h b/modules/globebrowsing/src/layer.h index a8e732fcd5..e0679deda0 100644 --- a/modules/globebrowsing/src/layer.h +++ b/modules/globebrowsing/src/layer.h @@ -68,8 +68,6 @@ public: void update(); - glm::ivec2 tilePixelStartOffset() const; - glm::ivec2 tilePixelSizeDifference() const; glm::vec2 tileUvToTextureSamplePosition(const TileUvTransform& uvTransform, const glm::vec2& tileUV, const glm::uvec2& resolution); @@ -94,9 +92,6 @@ private: LayerRenderSettings _renderSettings; LayerAdjustment _layerAdjustment; - glm::ivec2 _padTilePixelStartOffset = glm::ivec2(0); - glm::ivec2 _padTilePixelSizeDifference = glm::ivec2(0); - const layers::Group::ID _layerGroupId; std::function _onChangeCallback; diff --git a/modules/globebrowsing/src/memoryawaretilecache.cpp b/modules/globebrowsing/src/memoryawaretilecache.cpp index 653ad00577..60d878a013 100644 --- a/modules/globebrowsing/src/memoryawaretilecache.cpp +++ b/modules/globebrowsing/src/memoryawaretilecache.cpp @@ -321,7 +321,7 @@ void MemoryAwareTileCache::createDefaultTextureContainers() { ZoneScoped; for (const layers::Group& gi : layers::Groups) { - TileTextureInitData initData = tileTextureInitData(gi.id, true); + TileTextureInitData initData = tileTextureInitData(gi.id); assureTextureContainerExists(initData); } } diff --git a/modules/globebrowsing/src/rawtiledatareader.cpp b/modules/globebrowsing/src/rawtiledatareader.cpp index 80a7005c9e..c0678b88e1 100644 --- a/modules/globebrowsing/src/rawtiledatareader.cpp +++ b/modules/globebrowsing/src/rawtiledatareader.cpp @@ -674,7 +674,7 @@ void RawTileDataReader::readImageData(IODescription& io, RawTile::ReadError& wor switch (_initData.ghoulTextureFormat) { case ghoul::opengl::Texture::Format::Red: { char* dest = imageDataDest; - const RawTile::ReadError err = repeatedRasterRead(1, io, dest); + const RawTile::ReadError err = rasterRead(1, io, dest); worstError = std::max(worstError, err); break; } @@ -686,7 +686,7 @@ void RawTileDataReader::readImageData(IODescription& io, RawTile::ReadError& wor // The final destination pointer is offsetted by one datum byte size // for every raster (or data channel, i.e. R in RGB) char* dest = imageDataDest + (i * _initData.bytesPerDatum); - const RawTile::ReadError err = repeatedRasterRead(1, io, dest); + const RawTile::ReadError err = rasterRead(1, io, dest); worstError = std::max(worstError, err); } } @@ -695,12 +695,12 @@ void RawTileDataReader::readImageData(IODescription& io, RawTile::ReadError& wor // The final destination pointer is offsetted by one datum byte size // for every raster (or data channel, i.e. R in RGB) char* dest = imageDataDest + (i * _initData.bytesPerDatum); - const RawTile::ReadError err = repeatedRasterRead(1, io, dest); + const RawTile::ReadError err = rasterRead(1, io, dest); worstError = std::max(worstError, err); } // Last read is the alpha channel char* dest = imageDataDest + (3 * _initData.bytesPerDatum); - const RawTile::ReadError err = repeatedRasterRead(2, io, dest); + const RawTile::ReadError err = rasterRead(2, io, dest); worstError = std::max(worstError, err); } else { // Three or more rasters @@ -708,7 +708,7 @@ void RawTileDataReader::readImageData(IODescription& io, RawTile::ReadError& wor // The final destination pointer is offsetted by one datum byte size // for every raster (or data channel, i.e. R in RGB) char* dest = imageDataDest + (i * _initData.bytesPerDatum); - const RawTile::ReadError err = repeatedRasterRead(i + 1, io, dest); + const RawTile::ReadError err = rasterRead(i + 1, io, dest); worstError = std::max(worstError, err); } } @@ -721,7 +721,7 @@ void RawTileDataReader::readImageData(IODescription& io, RawTile::ReadError& wor // The final destination pointer is offsetted by one datum byte size // for every raster (or data channel, i.e. R in RGB) char* dest = imageDataDest + (i * _initData.bytesPerDatum); - const RawTile::ReadError err = repeatedRasterRead(1, io, dest); + const RawTile::ReadError err = rasterRead(1, io, dest); worstError = std::max(worstError, err); } } @@ -730,12 +730,12 @@ void RawTileDataReader::readImageData(IODescription& io, RawTile::ReadError& wor // The final destination pointer is offsetted by one datum byte size // for every raster (or data channel, i.e. R in RGB) char* dest = imageDataDest + (i * _initData.bytesPerDatum); - const RawTile::ReadError err = repeatedRasterRead(1, io, dest); + const RawTile::ReadError err = rasterRead(1, io, dest); worstError = std::max(worstError, err); } // Last read is the alpha channel char* dest = imageDataDest + (3 * _initData.bytesPerDatum); - const RawTile::ReadError err = repeatedRasterRead(2, io, dest); + const RawTile::ReadError err = rasterRead(2, io, dest); worstError = std::max(worstError, err); } else { // Three or more rasters @@ -743,14 +743,14 @@ void RawTileDataReader::readImageData(IODescription& io, RawTile::ReadError& wor // The final destination pointer is offsetted by one datum byte size // for every raster (or data channel, i.e. R in RGB) char* dest = imageDataDest + (i * _initData.bytesPerDatum); - const RawTile::ReadError err = repeatedRasterRead(3 - i, io, dest); + const RawTile::ReadError err = rasterRead(3 - i, io, dest); worstError = std::max(worstError, err); } } if (nRastersToRead > 3) { // Alpha channel exists // Last read is the alpha channel char* dest = imageDataDest + (3 * _initData.bytesPerDatum); - const RawTile::ReadError err = repeatedRasterRead(4, io, dest); + const RawTile::ReadError err = rasterRead(4, io, dest); worstError = std::max(worstError, err); } break; @@ -773,20 +773,6 @@ IODescription RawTileDataReader::ioDescription(const TileIndex& tileIndex) const io.read.overview = 0; io.read.fullRegion.start = glm::ivec2(0, 0); io.read.fullRegion.numPixels = glm::ivec2(_rasterXSize, _rasterYSize); - // For correct sampling in dataset, we need to pad the texture tile - - PixelRegion scaledPadding = { - .start = _initData.tilePixelStartOffset, - .numPixels = _initData.tilePixelSizeDifference - }; - - const double scale = static_cast(io.read.region.numPixels.x) / - static_cast(io.write.region.numPixels.x); - scaledPadding.numPixels *= scale; - scaledPadding.start *= scale; - - io.read.region.start += scaledPadding.start; - io.read.region.numPixels += scaledPadding.numPixels; io.write.bytesPerLine = _initData.bytesPerLine; io.write.totalNumBytes = _initData.totalNumBytes; @@ -811,121 +797,6 @@ glm::ivec2 RawTileDataReader::fullPixelSize() const { return geodeticToPixel(Geodetic2{ 90.0, 180.0 }, _padfTransform); } -RawTile::ReadError RawTileDataReader::repeatedRasterRead(int rasterBand, - const IODescription& fullIO, - char* dataDestination, - int depth) const -{ - - // NOTE: - // Ascii graphics illustrates the implementation details of this method, for one - // specific case. Even though the illustrated case is specific, readers can - // hopefully find it useful to get the general idea. - - // Make a copy of the full IO desription as we will have to modify it - IODescription io = fullIO; - - // Example: - // We have an io description that defines a WRITE and a READ region. - // In this case the READ region extends outside of the defined io.read.fullRegion, - // meaning we will have to perform wrapping - - // io.write.region io.read.region - // | | - // V V - // +-------+ +-------+ - // | | | |--------+ - // | | | | | - // | | | | | - // +-------+ +-------+ | - // | | <-- io.read.fullRegion - // | | - // +--------------+ - - RawTile::ReadError worstError = RawTile::ReadError::None; - if (!isInside(io.read.region, io.read.fullRegion)) { - // Loop through each side: left, top, right, bottom - for (int i = 0; i < 4; ++i) { - // Example: - // We are currently considering the left side of the pixel region - const Side side = static_cast(i); - IODescription cutoff = cutIODescription( - io, - side, - edge(io.read.fullRegion, side) - ); - - // Example: - // We cut off the left part that was outside the io.read.fullRegion, and we - // now have an additional io description for the cut off region. - // Note that the cut-method used above takes care of the corresponding - // WRITE region for us. - - // cutoff.write.region cutoff.read.region - // | io.write.region | io.read.region - // | | | | - // V V V V - // +-+-----+ +-+-----+ - // | | | | | |--------+ - // | | | | | | | - // | | | | | | | - // +-+-----+ +-+-----+ | - // | | <-- io.read.fullRegion - // | | - // +--------------+ - - const int area = cutoff.read.region.numPixels.x * - cutoff.read.region.numPixels.y; - if (area > 0) { - // Wrap by repeating - Side oppositeSide = static_cast((i + 2) % 4); - - alignPixelRegion( - cutoff.read.region, - oppositeSide, - edge(io.read.fullRegion, oppositeSide) - ); - - // Example: - // The cut off region is wrapped to the opposite side of the region, - // i.e. "repeated". Note that we don't want WRITE region to change, - // we're only wrapping the READ region. - - // cutoff.write.region io.read.region cutoff.read.region - // | io.write.region | | - // | | V V - // V V +-----+ +-+ - // +-+-----+ | |------| | - // | | | | | | | - // | | | | | | | - // | | | +-----+ +-+ - // +-+-----+ | | <-- io.read.fullRegion - // | | - // +--------------+ - - // Example: - // The cutoff region has been repeated along one of its sides, but - // as we can see in this example, it still has a top part outside the - // defined gdal region. This is handled through recursion. - const RawTile::ReadError err = repeatedRasterRead( - rasterBand, - cutoff, - dataDestination, - depth + 1 - ); - - worstError = std::max(worstError, err); - } - } - } - - const RawTile::ReadError err = rasterRead(rasterBand, io, dataDestination); - - // The return error from a repeated rasterRead is ONLY based on the main region, - // which in the usual case will cover the main area of the patch anyway - return err; -} - TileMetaData RawTileDataReader::tileMetaData(RawTile& rawTile, const PixelRegion& region) const { diff --git a/modules/globebrowsing/src/rawtiledatareader.h b/modules/globebrowsing/src/rawtiledatareader.h index 1bc4d3c24e..f2860846d5 100644 --- a/modules/globebrowsing/src/rawtiledatareader.h +++ b/modules/globebrowsing/src/rawtiledatareader.h @@ -79,13 +79,6 @@ private: IODescription ioDescription(const TileIndex& tileIndex) const; - /** - * A recursive function that is able to perform wrapping in case the read region of - * the given IODescription is outside of the given write region. - */ - RawTile::ReadError repeatedRasterRead(int rasterBand, const IODescription& fullIO, - char* dataDestination, int depth = 0) const; - TileMetaData tileMetaData(RawTile& rawTile, const PixelRegion& region) const; const std::string _datasetFilePath; diff --git a/modules/globebrowsing/src/renderableglobe.cpp b/modules/globebrowsing/src/renderableglobe.cpp index 4658e212b1..e21987e1d9 100644 --- a/modules/globebrowsing/src/renderableglobe.cpp +++ b/modules/globebrowsing/src/renderableglobe.cpp @@ -69,7 +69,6 @@ namespace { // Global flags to modify the RenderableGlobe constexpr bool LimitLevelByAvailableData = true; - constexpr bool PerformFrustumCulling = true; constexpr bool PreformHorizonCulling = true; // Shadow structure @@ -98,6 +97,7 @@ namespace { // time being. --abock 2018-10-30 constexpr int DefaultSkirtedGridSegments = 64; constexpr int UnknownDesiredLevel = -1; + constexpr int DefaultHeightTileResolution = 512; const openspace::globebrowsing::GeodeticPatch Coverage = openspace::globebrowsing::GeodeticPatch(0, 0, 90, 180); @@ -126,6 +126,13 @@ namespace { openspace::properties::Property::Visibility::Developer }; + constexpr openspace::properties::Property::PropertyInfo PerformFrustumCullingInfo = { + "PerformFrustumCulling", + "Perform frusum culling", + "If this value is set to 'true', frustum culling will be performed.", + openspace::properties::Property::Visibility::AdvancedUser + }; + constexpr openspace::properties::Property::PropertyInfo ResetTileProviderInfo = { "ResetTileProviders", "Reset tile providers", @@ -543,6 +550,7 @@ RenderableGlobe::RenderableGlobe(const ghoul::Dictionary& dictionary) BoolProperty(ShowChunkEdgeInfo, false), BoolProperty(LevelProjectedAreaInfo, true), BoolProperty(ResetTileProviderInfo, false), + BoolProperty(PerformFrustumCullingInfo, true), IntProperty(ModelSpaceRenderingInfo, 14, 1, 22), IntProperty(DynamicLodIterationCountInfo, 16, 4, 128) }) @@ -649,6 +657,7 @@ RenderableGlobe::RenderableGlobe(const ghoul::Dictionary& dictionary) _debugPropertyOwner.addProperty(_debugProperties.showChunkEdges); _debugPropertyOwner.addProperty(_debugProperties.levelByProjectedAreaElseDistance); _debugPropertyOwner.addProperty(_debugProperties.resetTileProviders); + _debugPropertyOwner.addProperty(_debugProperties.performFrustumCulling); _debugPropertyOwner.addProperty(_debugProperties.modelSpaceRenderingCutoffLevel); _debugPropertyOwner.addProperty(_debugProperties.dynamicLodIterationCount); @@ -1602,11 +1611,11 @@ void RenderableGlobe::setCommonUniforms(ghoul::opengl::ProgramObject& programObj const glm::mat3& modelViewTransformMat3 = glm::mat3(modelViewTransform); - // This is an assumption that the height tile has a resolution of 64 * 64 + // This is an assumption that the height tile has a resolution of 512 * 512 // If it does not it will still produce "correct" normals. If the resolution is // higher the shadows will be softer, if it is lower, pixels will be visible. - // Since default is 64 this will most likely work fine. - constexpr float TileDelta = 1.f / DefaultSkirtedGridSegments; + // Since default is 512 this will most likely work fine. + constexpr float TileDelta = 1.f / DefaultHeightTileResolution; const glm::vec3 deltaTheta0 = modelViewTransformMat3 * (glm::vec3(corner10 - corner00) * TileDelta); const glm::vec3 deltaTheta1 = modelViewTransformMat3 * @@ -1890,7 +1899,7 @@ bool RenderableGlobe::testIfCullable(const Chunk& chunk, ZoneScoped; return (PreformHorizonCulling && isCullableByHorizon(chunk, renderData, heights)) || - (PerformFrustumCulling && isCullableByFrustum(chunk, renderData, mvp)); + (_debugProperties.performFrustumCulling && isCullableByFrustum(chunk, renderData, mvp)); } int RenderableGlobe::desiredLevel(const Chunk& chunk, const RenderData& renderData, @@ -2357,7 +2366,9 @@ int RenderableGlobe::desiredLevelByAvailableTileData(const Chunk& chunk) const { const std::vector& lyrs = _layerManager.layerGroup(gi.id).activeLayers(); for (Layer* layer : lyrs) { Tile::Status status = layer->tileStatus(chunk.tileIndex); - if (status == Tile::Status::OK) { + // Ensure that the current tile is OK and that the tileprovider for the current + // layer has enough data to support an additional level. + if (status == Tile::Status::OK && layer->tileProvider()->maxLevel() > currLevel + 1) { return UnknownDesiredLevel; } } diff --git a/modules/globebrowsing/src/renderableglobe.h b/modules/globebrowsing/src/renderableglobe.h index e6ed5c1c61..5c0654f5a4 100644 --- a/modules/globebrowsing/src/renderableglobe.h +++ b/modules/globebrowsing/src/renderableglobe.h @@ -130,6 +130,7 @@ private: properties::BoolProperty showChunkEdges; properties::BoolProperty levelByProjectedAreaElseDistance; properties::BoolProperty resetTileProviders; + properties::BoolProperty performFrustumCulling; properties::IntProperty modelSpaceRenderingCutoffLevel; properties::IntProperty dynamicLodIterationCount; } _debugProperties; diff --git a/modules/globebrowsing/src/tileprovider/defaulttileprovider.cpp b/modules/globebrowsing/src/tileprovider/defaulttileprovider.cpp index 60bb918b4e..616593897d 100644 --- a/modules/globebrowsing/src/tileprovider/defaulttileprovider.cpp +++ b/modules/globebrowsing/src/tileprovider/defaulttileprovider.cpp @@ -82,10 +82,6 @@ namespace { // [[codegen::verbatim(TilePixelSizeInfo.description)]] std::optional tilePixelSize; - // Determines whether the tiles should have a padding zone around it, making the - // interpolation between tiles more pleasant - std::optional padTiles; - // Determines if the tiles should be preprocessed before uploading to the GPU std::optional performPreProcessing; @@ -144,7 +140,6 @@ DefaultTileProvider::DefaultTileProvider(const ghoul::Dictionary& dictionary) // 2. Initialize default values for any optional Keys // getValue does not work for integers int pixelSize = p.tilePixelSize.value_or(0); - _padTiles = p.padTiles.value_or(_padTiles); // Only preprocess height layers by default _performPreProcessing = _layerGroupID == layers::Group::ID::HeightLayers; @@ -193,7 +188,7 @@ DefaultTileProvider::DefaultTileProvider(const ghoul::Dictionary& dictionary) _cacheProperties.compression = codegen::toString(compression); TileTextureInitData initData( - tileTextureInitData(_layerGroupID, _padTiles, pixelSize) + tileTextureInitData(_layerGroupID, pixelSize) ); _tilePixelSize = initData.dimensions.x; initAsyncTileDataReader(initData, _cacheProperties); @@ -279,7 +274,7 @@ void DefaultTileProvider::update() { if (_asyncTextureDataProvider->shouldBeDeleted()) { initAsyncTileDataReader( - tileTextureInitData(_layerGroupID, _padTiles, _tilePixelSize), + tileTextureInitData(_layerGroupID, _tilePixelSize), _cacheProperties ); } diff --git a/modules/globebrowsing/src/tileprovider/defaulttileprovider.h b/modules/globebrowsing/src/tileprovider/defaulttileprovider.h index e422fd9ad6..1cb777cb0e 100644 --- a/modules/globebrowsing/src/tileprovider/defaulttileprovider.h +++ b/modules/globebrowsing/src/tileprovider/defaulttileprovider.h @@ -57,7 +57,6 @@ private: std::unique_ptr _asyncTextureDataProvider; layers::Group::ID _layerGroupID = layers::Group::ID::Unknown; bool _performPreProcessing = false; - bool _padTiles = true; TileCacheProperties _cacheProperties; }; diff --git a/modules/globebrowsing/src/tileprovider/temporaltileprovider.cpp b/modules/globebrowsing/src/tileprovider/temporaltileprovider.cpp index 81ebabe395..e080d59bc7 100644 --- a/modules/globebrowsing/src/tileprovider/temporaltileprovider.cpp +++ b/modules/globebrowsing/src/tileprovider/temporaltileprovider.cpp @@ -737,7 +737,6 @@ Tile TemporalTileProvider::InterpolateTileProvider::tile(const TileIndex& tileIn prev.texture->dimensions().y, prev.texture->dataType(), prev.texture->format(), - TileTextureInitData::PadTiles::No, TileTextureInitData::ShouldAllocateDataOnCPU::No ); diff --git a/modules/globebrowsing/src/tileprovider/tileprovider.cpp b/modules/globebrowsing/src/tileprovider/tileprovider.cpp index 3db97c0c96..f1ea094896 100644 --- a/modules/globebrowsing/src/tileprovider/tileprovider.cpp +++ b/modules/globebrowsing/src/tileprovider/tileprovider.cpp @@ -97,7 +97,6 @@ void TileProvider::initializeDefaultTile() { 8, GL_UNSIGNED_BYTE, Texture::Format::RGBA, - TileTextureInitData::PadTiles::No, TileTextureInitData::ShouldAllocateDataOnCPU::Yes ); char* pixels = new char[initData.totalNumBytes]; diff --git a/modules/globebrowsing/src/tiletextureinitdata.cpp b/modules/globebrowsing/src/tiletextureinitdata.cpp index 3f5ff86783..6b195aae4b 100644 --- a/modules/globebrowsing/src/tiletextureinitdata.cpp +++ b/modules/globebrowsing/src/tiletextureinitdata.cpp @@ -26,9 +26,6 @@ namespace { -const glm::ivec2 TilePixelStartOffset = glm::ivec2(-2); -const glm::ivec2 TilePixelSizeDifference = glm::ivec2(4); - size_t numberOfRasters(ghoul::opengl::Texture::Format format) { switch (format) { case ghoul::opengl::Texture::Format::Red: @@ -104,18 +101,17 @@ openspace::globebrowsing::TileTextureInitData::HashKey calculateHashKey( namespace openspace::globebrowsing { -TileTextureInitData tileTextureInitData(layers::Group::ID id, bool shouldPadTiles, +TileTextureInitData tileTextureInitData(layers::Group::ID id, size_t preferredTileSize) { switch (id) { case layers::Group::ID::HeightLayers: { - const size_t tileSize = preferredTileSize ? preferredTileSize : 64; + const size_t tileSize = preferredTileSize ? preferredTileSize : 512; return TileTextureInitData( tileSize, tileSize, GL_FLOAT, ghoul::opengl::Texture::Format::Red, - TileTextureInitData::PadTiles(shouldPadTiles), TileTextureInitData::ShouldAllocateDataOnCPU::Yes ); } @@ -125,8 +121,7 @@ TileTextureInitData tileTextureInitData(layers::Group::ID id, bool shouldPadTile tileSize, tileSize, GL_UNSIGNED_BYTE, - ghoul::opengl::Texture::Format::BGRA, - TileTextureInitData::PadTiles(shouldPadTiles) + ghoul::opengl::Texture::Format::BGRA ); } case layers::Group::ID::Overlays: { @@ -135,8 +130,7 @@ TileTextureInitData tileTextureInitData(layers::Group::ID id, bool shouldPadTile tileSize, tileSize, GL_UNSIGNED_BYTE, - ghoul::opengl::Texture::Format::BGRA, - TileTextureInitData::PadTiles(shouldPadTiles) + ghoul::opengl::Texture::Format::BGRA ); } case layers::Group::ID::NightLayers: { @@ -145,8 +139,7 @@ TileTextureInitData tileTextureInitData(layers::Group::ID id, bool shouldPadTile tileSize, tileSize, GL_UNSIGNED_BYTE, - ghoul::opengl::Texture::Format::BGRA, - TileTextureInitData::PadTiles(shouldPadTiles) + ghoul::opengl::Texture::Format::BGRA ); } case layers::Group::ID::WaterMasks: { @@ -155,8 +148,7 @@ TileTextureInitData tileTextureInitData(layers::Group::ID id, bool shouldPadTile tileSize, tileSize, GL_UNSIGNED_BYTE, - ghoul::opengl::Texture::Format::BGRA, - TileTextureInitData::PadTiles(shouldPadTiles) + ghoul::opengl::Texture::Format::BGRA ); } default: { @@ -167,10 +159,8 @@ TileTextureInitData tileTextureInitData(layers::Group::ID id, bool shouldPadTile TileTextureInitData::TileTextureInitData(size_t width, size_t height, GLenum type, ghoul::opengl::Texture::Format textureFormat, - PadTiles pad, ShouldAllocateDataOnCPU allocCpu) + ShouldAllocateDataOnCPU allocCpu) : dimensions(width, height, 1) - , tilePixelStartOffset(pad ? TilePixelStartOffset : glm::ivec2(0)) - , tilePixelSizeDifference(pad ? TilePixelSizeDifference : glm::ivec2(0)) , glType(type) , ghoulTextureFormat(textureFormat) , nRasters(numberOfRasters(ghoulTextureFormat)) @@ -179,7 +169,6 @@ TileTextureInitData::TileTextureInitData(size_t width, size_t height, GLenum typ , bytesPerLine(bytesPerPixel * width) , totalNumBytes(bytesPerLine * height) , shouldAllocateDataOnCPU(allocCpu) - , padTiles(pad) , hashKey(calculateHashKey(dimensions, ghoulTextureFormat, glType)) {} diff --git a/modules/globebrowsing/src/tiletextureinitdata.h b/modules/globebrowsing/src/tiletextureinitdata.h index e1ac44411f..2aa7925098 100644 --- a/modules/globebrowsing/src/tiletextureinitdata.h +++ b/modules/globebrowsing/src/tiletextureinitdata.h @@ -39,10 +39,9 @@ class TileTextureInitData { public: using HashKey = uint64_t; BooleanType(ShouldAllocateDataOnCPU); - BooleanType(PadTiles); TileTextureInitData(size_t width, size_t height, GLenum type, - ghoul::opengl::Texture::Format textureFormat, PadTiles pad, + ghoul::opengl::Texture::Format textureFormat, ShouldAllocateDataOnCPU allocCpu = ShouldAllocateDataOnCPU::No); TileTextureInitData(const TileTextureInitData& original) = default; @@ -54,8 +53,6 @@ public: ~TileTextureInitData() = default; const glm::ivec3 dimensions; - const glm::ivec2 tilePixelStartOffset; - const glm::ivec2 tilePixelSizeDifference; const GLenum glType; const ghoul::opengl::Texture::Format ghoulTextureFormat; const size_t nRasters; @@ -64,11 +61,10 @@ public: const size_t bytesPerLine; const size_t totalNumBytes; const bool shouldAllocateDataOnCPU; - const bool padTiles; const HashKey hashKey; }; -TileTextureInitData tileTextureInitData(layers::Group::ID id, bool shouldPadTiles, +TileTextureInitData tileTextureInitData(layers::Group::ID id, size_t preferredTileSize = 0); } // namespace openspace::globebrowsing From 1b0b7e73f787b103017639e02e19c39e749508f7 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 14 Aug 2023 14:42:23 +0200 Subject: [PATCH 097/701] Fix faulty deinitialization in scene graph nodes that would cause nodes to be ignored (closes #2851). Add warning message if nodes are not deinitialized at the end of the program --- data/assets/scene/digitaluniverse/grids.asset | 1 + ext/ghoul | 2 +- src/scene/assetmanager.cpp | 7 ++++++- src/scene/scene.cpp | 6 ++++++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/data/assets/scene/digitaluniverse/grids.asset b/data/assets/scene/digitaluniverse/grids.asset index 2823482079..f37098eae8 100644 --- a/data/assets/scene/digitaluniverse/grids.asset +++ b/data/assets/scene/digitaluniverse/grids.asset @@ -669,6 +669,7 @@ asset.onDeinitialize(function() openspace.removeSceneGraphNode(EquatorialSphere) openspace.removeSceneGraphNode(EclipticSphereLabels) openspace.removeSceneGraphNode(EclipticSphere) + openspace.removeSceneGraphNode(OortSphere) openspace.removeSceneGraphNode(RadioSphere) end) diff --git a/ext/ghoul b/ext/ghoul index ede185dd8b..b8685a2fe0 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit ede185dd8b2f6c9cda5731b7e3512dec0f08a12e +Subproject commit b8685a2fe0c00516eb28183658974e9601b3edd0 diff --git a/src/scene/assetmanager.cpp b/src/scene/assetmanager.cpp index 418ff1e5fa..4181214ee7 100644 --- a/src/scene/assetmanager.cpp +++ b/src/scene/assetmanager.cpp @@ -143,11 +143,16 @@ AssetManager::~AssetManager() { void AssetManager::deinitialize() { ZoneScoped; - for (Asset* asset : _rootAssets) { + // In general, the potential dependencies in the root assets are ordered, which is + // index 0 might be the parent of 1, but not vice versa. So it is safer to do the + // order deinitialization in reverse + while (!_rootAssets.empty()) { + Asset* asset = _rootAssets.back(); if (!asset->hasInitializedParent()) { asset->deinitialize(); asset->unload(); } + _rootAssets.pop_back(); } _toBeDeleted.clear(); } diff --git a/src/scene/scene.cpp b/src/scene/scene.cpp index 17aa498279..25c45353a1 100644 --- a/src/scene/scene.cpp +++ b/src/scene/scene.cpp @@ -116,6 +116,12 @@ Scene::~Scene() { if (node->identifier() == "Root") { continue; } + + LWARNING(fmt::format( + "SceneGraphNode '{}' was not removed before shutdown", + node->identifier() + )); + // There might still be scene graph nodes around that weren't removed by the asset // manager as they would have been added manually by the user. This also serves as // a backstop for assets that forgot to implement the onDeinitialize functions From 153e71853ee5e7166babd01ffaf9893d2c56bc42 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 14 Aug 2023 15:05:39 +0200 Subject: [PATCH 098/701] Fix up the missing SkyBrowser functions for naming scheme --- data/assets/util/webgui.asset | 2 +- modules/skybrowser/skybrowsermodule.cpp | 9 +++-- modules/skybrowser/skybrowsermodule_lua.inl | 44 +++++++++++++++++++-- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/data/assets/util/webgui.asset b/data/assets/util/webgui.asset index aa59aa8000..cdaaa51adb 100644 --- a/data/assets/util/webgui.asset +++ b/data/assets/util/webgui.asset @@ -4,7 +4,7 @@ local guiCustomization = asset.require("customization/gui") -- Select which commit hashes to use for the frontend and backend -local frontendHash = "44a3e3aa89f250b74ffc4b7f3a503a5149c0e8de" +local frontendHash = "1379c57e0876473573a67a381214a53fda53e516" local frontend = asset.syncedResource({ Identifier = "WebGuiFrontend", diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index b1b661246b..837365b6b5 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -529,7 +529,8 @@ scripting::LuaLibrary SkyBrowserModule::luaLibrary() const { codegen::lua::StartSetup, codegen::lua::InitializeBrowser, codegen::lua::SendOutIdsToBrowsers, - codegen::lua::GetListOfImages, + codegen::lua::ListOfImages, + codegen::lua::ListOfImagesDeprecated, codegen::lua::SetHoverCircle, codegen::lua::MoveCircleToHoverImage, codegen::lua::DisableHoverCircle, @@ -538,7 +539,8 @@ scripting::LuaLibrary SkyBrowserModule::luaLibrary() const { codegen::lua::RemoveSelectedImageInBrowser, codegen::lua::AdjustCamera, codegen::lua::SetSelectedBrowser, - codegen::lua::GetTargetData, + codegen::lua::TargetData, + codegen::lua::TargetDataDeprecated, codegen::lua::CreateTargetBrowserPair, codegen::lua::RemoveTargetBrowserPair, codegen::lua::SetOpacityOfImageLayer, @@ -557,7 +559,8 @@ scripting::LuaLibrary SkyBrowserModule::luaLibrary() const { codegen::lua::ScrollOverBrowser, codegen::lua::LoadingImageCollectionComplete, codegen::lua::ShowAllTargetsAndBrowsers, - codegen::lua::GetWwtImageCollectionUrl, + codegen::lua::WwtImageCollectionUrl, + codegen::lua::WwtImageCollectionUrlDeprecated, codegen::lua::StopAnimations, codegen::lua::SetBorderRadius, codegen::lua::ReloadDisplayCopyOnNode diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index b84c568235..a23865c18a 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -317,7 +317,7 @@ std::string prunedIdentifier(std::string identifier) { /** * Returns the AAS WorldWide Telescope image collection url. */ -[[codegen::luawrap]] ghoul::Dictionary getWwtImageCollectionUrl() { +[[codegen::luawrap]] ghoul::Dictionary wwtImageCollectionUrl() { using namespace openspace; SkyBrowserModule* module = global::moduleEngine->module(); ghoul::Dictionary url; @@ -325,13 +325,27 @@ std::string prunedIdentifier(std::string identifier) { return url; } +/** + * Deprecated in favor of 'wwtImageCollectionUrl' + */ +[[codegen::luawrap("getWwtImageCollectionUrl")]] +ghoul::Dictionary wwtImageCollectionUrlDeprecated() +{ + LWARNINGC( + "Deprecation", + "'getWwtImageCollectionUrl' function is deprecated and should be replaced with " + "'wwtImageCollectionUrl'" + ); + return wwtImageCollectionUrl(); +} + /** * Returns a list of all the loaded AAS WorldWide Telescope images that have been loaded. * Each image has a name, thumbnail url, equatorial spherical coordinates RA and Dec, * equatorial Cartesian coordinates, if the image has celestial coordinates, credits text, * credits url and the identifier of the image which is a unique number. */ -[[codegen::luawrap]] ghoul::Dictionary getListOfImages() { +[[codegen::luawrap]] ghoul::Dictionary listOfImages() { using namespace openspace; // Send image list to GUI @@ -367,11 +381,24 @@ std::string prunedIdentifier(std::string identifier) { return list; } +/** + * Deprecated in favor of 'listOfExoplanets' + */ +[[codegen::luawrap("getListOfImages")]] ghoul::Dictionary listOfImagesDeprecated() +{ + LWARNINGC( + "Deprecation", + "'getListOfImages' function is deprecated and should be replaced with " + "'listOfImages'" + ); + return listOfImages(); +} + /** * Returns a table of data regarding the current view and the sky browsers and targets. * returns a table of data regarding the current targets. */ -[[codegen::luawrap]] ghoul::Dictionary getTargetData() { +[[codegen::luawrap]] ghoul::Dictionary targetData() { using namespace openspace; SkyBrowserModule* module = global::moduleEngine->module(); @@ -437,6 +464,17 @@ std::string prunedIdentifier(std::string identifier) { return data; } +/** + * Deprecated in favor of 'targetData' + */ +[[codegen::luawrap("getTargetData")]] ghoul::Dictionary targetDataDeprecated() { + LWARNINGC( + "Deprecation", + "'getTargetData' function is deprecated and should be replaced with 'targetData'" + ); + return targetData(); +} + /** * Takes an identifier to a sky browser or sky target. Rotates the camera so that the * target is placed in the center of the view. From 56abd768c9a8afe0da12626d49e0c83ffc912b58 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 14 Aug 2023 16:08:45 +0200 Subject: [PATCH 099/701] Update Voyager kernels to reach year 2100 (closes #2790) --- .../scene/solarsystem/missions/voyager/voyager1.asset | 11 ++++++----- .../scene/solarsystem/missions/voyager/voyager2.asset | 9 +++++---- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/data/assets/scene/solarsystem/missions/voyager/voyager1.asset b/data/assets/scene/solarsystem/missions/voyager/voyager1.asset index 630081d46e..275c15430d 100644 --- a/data/assets/scene/solarsystem/missions/voyager/voyager1.asset +++ b/data/assets/scene/solarsystem/missions/voyager/voyager1.asset @@ -14,7 +14,7 @@ local kernels = asset.syncedResource({ Name = "Voyager 1 Kernels", Type = "HttpSynchronization", Identifier = "voyager1_spice", - Version = 1 + Version = 2 }) @@ -25,8 +25,9 @@ local Kernels = { kernels .. "voyager_1.ST+1991_a54418u.merged.bsp", kernels .. "vgr1_jup230.bsp", kernels .. "vgr1_sat337.bsp", + kernels .. "vgr1.x2100.bsp", kernels .. "vgr1_super.bc", - kernels .. "vgr1_super_v2.bc" + kernels .. "vgr1_super_v2.bc", } local RotationMatrix = { @@ -227,9 +228,9 @@ local VoyagerTrailCruiseSaturnInf = { EnableFade = false, Color = { 0.70, 0.50, 0.20 }, StartTime = "1980 NOV 16", - EndTime = "2021 JAN 01", - -- 14656 is the number of days between the Start and End time - SampleInterval = 14656 * 2 + EndTime = "2100 JAN 01", + -- 43511 is the number of days between the Start and End time + SampleInterval = 43511 * 2 }, Tag = { "voyager1_trail" }, GUI = { diff --git a/data/assets/scene/solarsystem/missions/voyager/voyager2.asset b/data/assets/scene/solarsystem/missions/voyager/voyager2.asset index 68cd0c3a89..448776f05f 100644 --- a/data/assets/scene/solarsystem/missions/voyager/voyager2.asset +++ b/data/assets/scene/solarsystem/missions/voyager/voyager2.asset @@ -14,7 +14,7 @@ local kernels = asset.syncedResource({ Name = "Voyager 2 Kernels", Type = "HttpSynchronization", Identifier = "voyager2_spice", - Version = 1 + Version = 2 }) @@ -27,6 +27,7 @@ local Kernels = { kernels .. "vgr2_sat337.bsp", kernels .. "vgr2_ura083.bsp", kernels .. "vgr2_nep081.bsp", + kernels .. "vgr2.x2100.bsp", kernels .. "vgr2_super.bc", kernels .. "vgr2_super_v2.bc" } @@ -331,9 +332,9 @@ local VoyagerTrailCruiseNeptuneInf = { EnableFade = false, Color = { 0.70, 0.50, 0.20 }, StartTime = "1989 AUG 26", - EndTime = "2021 JAN 01", - -- 11451 is the number of days between the Start and End time - SampleInterval = 11451 * 2 + EndTime = "2100 JAN 01", + -- 40306 is the number of days between the Start and End time + SampleInterval = 40306 * 2 }, Tag = { "voyager2_trail" }, GUI = { From 16591fab567c27a6848a1b262d7d66739c502d6a Mon Sep 17 00:00:00 2001 From: GPayne Date: Mon, 14 Aug 2023 15:53:45 -0600 Subject: [PATCH 100/701] Added another visual test for JWST --- tests/visual/jwst/unfolded.ostest | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 tests/visual/jwst/unfolded.ostest diff --git a/tests/visual/jwst/unfolded.ostest b/tests/visual/jwst/unfolded.ostest new file mode 100644 index 0000000000..93759912c2 --- /dev/null +++ b/tests/visual/jwst/unfolded.ostest @@ -0,0 +1,12 @@ +[ + { "type": "pause", + "value": "true"}, + { "type": "time", + "value": "2022-01-22T05:24:50.00"}, + { "type": "navigationstate", + "value": "{Anchor='JWSTModel',Pitch=-0.0016592552067427437,Position={-18.15692138671875,17.05841827392578,-21.566741943359375},ReferenceFrame='Root',Up={0.7974728925265553,0.5576779554782311,-0.2302873936170828},Yaw=-0.005725894528578101}"}, + { "type": "wait", + "value": "20"}, + { "type": "screenshot", + "value": "unfolded"} +] From d88cc9d9d56facdfd1b03a8e352d381f11c1793a Mon Sep 17 00:00:00 2001 From: Malin E Date: Tue, 15 Aug 2023 11:14:44 +0200 Subject: [PATCH 101/701] Make sure that the volume textures never gets smaller than 1x1, fixes #2852 --- src/rendering/framebufferrenderer.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 6c85a386ac..d2fbfd3ffa 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -517,10 +517,10 @@ void FramebufferRenderer::updateDownscaleTextures() { 0, GL_RGBA32F, static_cast( - _resolution.x * _downscaleVolumeRendering.currentDownscaleFactor + glm::max(_resolution.x * _downscaleVolumeRendering.currentDownscaleFactor, 1.f) ), static_cast( - _resolution.y * _downscaleVolumeRendering.currentDownscaleFactor + glm::max(_resolution.y * _downscaleVolumeRendering.currentDownscaleFactor, 1.f) ), 0, GL_RGBA, @@ -538,10 +538,10 @@ void FramebufferRenderer::updateDownscaleTextures() { 0, GL_DEPTH_COMPONENT32F, static_cast( - _resolution.x * _downscaleVolumeRendering.currentDownscaleFactor + glm::max(_resolution.x * _downscaleVolumeRendering.currentDownscaleFactor, 1.f) ), static_cast( - _resolution.y * _downscaleVolumeRendering.currentDownscaleFactor + glm::max(_resolution.y * _downscaleVolumeRendering.currentDownscaleFactor, 1.f) ), 0, GL_DEPTH_COMPONENT, @@ -846,10 +846,10 @@ void FramebufferRenderer::updateResolution() { 0, GL_RGBA32F, static_cast( - _resolution.x * _downscaleVolumeRendering.currentDownscaleFactor + glm::max(_resolution.x * _downscaleVolumeRendering.currentDownscaleFactor, 1.f) ), static_cast( - _resolution.y * _downscaleVolumeRendering.currentDownscaleFactor + glm::max(_resolution.y * _downscaleVolumeRendering.currentDownscaleFactor, 1.f) ), 0, GL_RGBA, @@ -878,10 +878,10 @@ void FramebufferRenderer::updateResolution() { 0, GL_DEPTH_COMPONENT32F, static_cast( - _resolution.x * _downscaleVolumeRendering.currentDownscaleFactor + glm::max(_resolution.x * _downscaleVolumeRendering.currentDownscaleFactor, 1.f) ), static_cast( - _resolution.y * _downscaleVolumeRendering.currentDownscaleFactor + glm::max(_resolution.y * _downscaleVolumeRendering.currentDownscaleFactor, 1.f) ), 0, GL_DEPTH_COMPONENT, From bd153b3f4f0087bb399bd24ba0265f69cc37a411 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 17 Aug 2023 01:59:26 +0200 Subject: [PATCH 102/701] Use correct error type in geojsoncomponent; Check for (0,0,0) camera vectors in navigator; Fix issue with non-ASCII characters when making identifiers --- .../globebrowsing/src/geojson/geojsoncomponent.cpp | 3 ++- .../src/geojson/globegeometryfeature.cpp | 8 ++++---- modules/video/src/videoplayer.cpp | 3 +-- src/navigation/orbitalnavigator.cpp | 14 +++++++++++++- src/scene/scene.cpp | 2 +- 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/modules/globebrowsing/src/geojson/geojsoncomponent.cpp b/modules/globebrowsing/src/geojson/geojsoncomponent.cpp index d3f6b43afc..ca3dbf5423 100644 --- a/modules/globebrowsing/src/geojson/geojsoncomponent.cpp +++ b/modules/globebrowsing/src/geojson/geojsoncomponent.cpp @@ -698,12 +698,13 @@ void GeoJsonComponent::parseSingleFeature(const geos::io::GeoJSONFeature& featur _featuresPropertyOwner.addPropertySubOwner(_features.back().get()); } - catch (const ghoul::MissingCaseException&) { + catch (const ghoul::RuntimeError& error) { LERROR(fmt::format( "Error creating GeoJson layer with identifier '{}'. Problem reading " "feature {} in GeoJson file '{}'.", identifier(), indexInFile, _geoJsonFile )); + LERRORC(error.component, error.message); // Do nothing } } diff --git a/modules/globebrowsing/src/geojson/globegeometryfeature.cpp b/modules/globebrowsing/src/geojson/globegeometryfeature.cpp index 74c699b874..170928cf2b 100644 --- a/modules/globebrowsing/src/geojson/globegeometryfeature.cpp +++ b/modules/globebrowsing/src/geojson/globegeometryfeature.cpp @@ -232,18 +232,18 @@ void GlobeGeometryFeature::createFromSingleGeosGeometry(const geos::geom::Geomet _type = GeometryType::Polygon; } catch (geos::util::IllegalStateException& e) { - LERROR(fmt::format( + throw ghoul::RuntimeError(fmt::format( "Non-simple (e.g. self-intersecting) polygons not supported yet. " "GEOS error: '{}'", e.what() )); - throw ghoul::MissingCaseException(); // TODO: handle self-intersections points // https://www.sciencedirect.com/science/article/pii/S0304397520304199 } catch (geos::util::GEOSException& e) { - LERROR(fmt::format("Unknown geos error: {}", e.what())); - throw ghoul::MissingCaseException(); + throw ghoul::RuntimeError(fmt::format( + "Unknown geos error: {}", e.what() + )); } break; } diff --git a/modules/video/src/videoplayer.cpp b/modules/video/src/videoplayer.cpp index b199aa898f..3b69a3f744 100644 --- a/modules/video/src/videoplayer.cpp +++ b/modules/video/src/videoplayer.cpp @@ -739,9 +739,8 @@ void VideoPlayer::handleMpvProperties(mpv_event* event) { } break; } - default: { + default: throw ghoul::MissingCaseException(); - } } } diff --git a/src/navigation/orbitalnavigator.cpp b/src/navigation/orbitalnavigator.cpp index 738ad8901a..992dce2a0e 100644 --- a/src/navigation/orbitalnavigator.cpp +++ b/src/navigation/orbitalnavigator.cpp @@ -746,6 +746,12 @@ void OrbitalNavigator::updateCameraStateFromStates(double deltaTime) { .rotation = _camera->rotationQuaternion() }; + if (glm::length(pose.position) == 0.0) { + // If the position is 0.0, a lot of the calculations downstairs will fail as we + // calculate relative offsets from the center of the anchor node + return; + } + const bool hasPreviousPositions = _previousAnchorNodePosition.has_value() && _previousAimNodePosition.has_value(); @@ -872,6 +878,11 @@ void OrbitalNavigator::updateCameraScalingFromAnchor(double deltaTime) { const glm::dvec3 anchorPos = _anchorNode->worldPosition(); const glm::dvec3 cameraPos = _camera->positionVec3(); + if (glm::length(cameraPos) == 0.0) { + // Calculating the surface position fails for (0,0,0) vectors + return; + } + SurfacePositionHandle posHandle = calculateSurfacePositionHandle(*_anchorNode, cameraPos); @@ -1123,7 +1134,8 @@ void OrbitalNavigator::setRetargetInterpolationTime(float durationInSeconds) { bool OrbitalNavigator::shouldFollowAnchorRotation(const glm::dvec3& cameraPosition) const { - if (!_anchorNode || !_followAnchorNodeRotation) { + if (!_anchorNode || !_followAnchorNodeRotation || glm::length(cameraPosition) == 0.0) + { return false; } diff --git a/src/scene/scene.cpp b/src/scene/scene.cpp index 25c45353a1..cbd7203a50 100644 --- a/src/scene/scene.cpp +++ b/src/scene/scene.cpp @@ -888,7 +888,7 @@ std::string makeIdentifier(std::string s) { std::replace_if( s.begin(), s.end(), - [](char c) { return std::ispunct(c) != 0; }, + [](unsigned char c) { return std::ispunct(c) != 0; }, '-' ); std::replace(s.begin(), s.end(), ' ', '_'); From cd7788ff1d2269405a4a37c422d92f4382e3be16 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 17 Aug 2023 15:46:49 +0200 Subject: [PATCH 103/701] Fix error with eclipse shadow cone flipping --- .../space/rendering/renderableeclipsecone.cpp | 41 +++++++++++++++---- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/modules/space/rendering/renderableeclipsecone.cpp b/modules/space/rendering/renderableeclipsecone.cpp index 05b528c4b8..72ef239df6 100644 --- a/modules/space/rendering/renderableeclipsecone.cpp +++ b/modules/space/rendering/renderableeclipsecone.cpp @@ -49,7 +49,8 @@ namespace { "Points", "This value determines the number of control points that is used to construct " "the shadow geometry. The higher this number, the more detailed the shadow is, " - "but it will have a negative impact on the performance", + "but it will have a negative impact on the performance. Also note that rendering " + "errors will occur if this value is even", openspace::properties::Property::Visibility::AdvancedUser }; @@ -178,7 +179,7 @@ documentation::Documentation RenderableEclipseCone::Documentation() { RenderableEclipseCone::RenderableEclipseCone(const ghoul::Dictionary& dictionary) : Renderable(dictionary) - , _numberOfPoints(NumberPointsInfo, 190, 1, 300) + , _numberOfPoints(NumberPointsInfo, 191, 1, 300) , _shadowLength(ShadowLengthInfo, 0.1f, 0.f, 2.f) , _showUmbralShadow(ShowUmbralShadowInfo, true) , _umbralShadowColor( @@ -335,7 +336,7 @@ std::vector calculateShadowPoints(const std::vector& srcT const glm::dvec3 dir = glm::normalize(dst - src); // The start point is the terminator point on the Moon - glm::vec3 p1 = dst; + glm::vec3 p1 = dst -dir * lengthScale*1000.0; vertices.push_back({ p1.x, p1.y, p1.z }); // The end point is calculated by forward propagating the incoming direction @@ -346,6 +347,8 @@ std::vector calculateShadowPoints(const std::vector& srcT } void RenderableEclipseCone::createCone(double et) { + ZoneScoped; + // Big picture for the calculation for this example (lightSource = Sun, // shadower = Moon, shadowee = Earth). We get the limb (= penumbral terminator) of the // Sun as viewed from the Moon, then the limb of the Moon as viewed from the Sun. @@ -375,6 +378,17 @@ void RenderableEclipseCone::createCone(double et) { p *= 1000.0; } + // 1a. For some reason in some situations the angular position of the first vertex is + // rotating, which causes a mismatch in the direction calculations. In order to + // prevent that, we rotate the positions so that the point with the highest z + // component is always the first point + auto it = std::max_element( + resSrc.terminatorPoints.begin(), + resSrc.terminatorPoints.end(), + [](const glm::dvec3& p1, const glm::dvec3& p2) { return p1.z > p2.z; } + ); + std::rotate(resSrc.terminatorPoints.begin(), it, resSrc.terminatorPoints.end()); + // 2. Get the penumbral terminator of the shadower from the lightsource SpiceManager::TerminatorEllipseResult resDst = SpiceManager::ref().terminatorEllipse( @@ -394,11 +408,20 @@ void RenderableEclipseCone::createCone(double et) { for (glm::dvec3& p : resDst.terminatorPoints) { p *= 1000.0; } - // Spice calculates the terminator points in a fixed clockwise/counterclockwise - // direction from the point of the view of the observer. Since we are switching target - // and observer, this means that one of the sets of points is clockwise, while the - // other is counterclockwise. In order for the right points to match up, we need to - // reverse the order of one of them. It doesn't matter which one, so we pick this one + + // 2a. Doing the same as in 1a + auto jt = std::max_element( + resDst.terminatorPoints.begin(), + resDst.terminatorPoints.end(), + [](const glm::dvec3& p1, const glm::dvec3& p2) { return p1.z > p2.z; } + ); + std::rotate(resDst.terminatorPoints.begin(), jt, resDst.terminatorPoints.end()); + + // 2b. Spice calculates the terminator points in a fixed counterclockwise direction + // from the point of the view of the observer. Since we are switching target and + // observer, this means that one of the sets of points is clockwise, while the other + // is counterclockwise. In order for the right points to match up, we need to reverse + // the order of one of them. It doesn't matter which one, so we pick this one std::reverse(resDst.terminatorPoints.begin(), resDst.terminatorPoints.end()); ghoul_assert( @@ -489,7 +512,7 @@ void RenderableEclipseCone::createCone(double et) { _nVertices = static_cast(penumbralVertices.size()); } if (_showUmbralShadow) { - _nVertices = static_cast(penumbralVertices.size()); + _nVertices = static_cast(umbralVertices.size()); } glBindVertexArray(_vao); From 4ae61a848e3ea6ffb036ed4abaaa121da6ab54ee Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Fri, 18 Aug 2023 15:32:19 +0200 Subject: [PATCH 104/701] Using linear texture filtering on AMD until the crash can be fixed (addresses #2843) --- .../src/memoryawaretilecache.cpp | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/modules/globebrowsing/src/memoryawaretilecache.cpp b/modules/globebrowsing/src/memoryawaretilecache.cpp index 60d878a013..e6863132fa 100644 --- a/modules/globebrowsing/src/memoryawaretilecache.cpp +++ b/modules/globebrowsing/src/memoryawaretilecache.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include namespace { @@ -211,22 +212,31 @@ void MemoryAwareTileCache::TextureContainer::reset() { _textures.clear(); _freeTexture = 0; + + using namespace ghoul::systemcapabilities; + + ghoul::opengl::Texture::FilterMode mode = + OpenGLCap.gpuVendor() == OpenGLCapabilitiesComponent::Vendor::AmdATI ? + ghoul::opengl::Texture::FilterMode::Linear : + ghoul::opengl::Texture::FilterMode::AnisotropicMipMap; + for (size_t i = 0; i < _numTextures; ++i) { using namespace ghoul::opengl; + std::unique_ptr tex = std::make_unique( _initData.dimensions, GL_TEXTURE_2D, _initData.ghoulTextureFormat, toGlTextureFormat(_initData.glType, _initData.ghoulTextureFormat), _initData.glType, - Texture::FilterMode::AnisotropicMipMap, + mode, Texture::WrappingMode::ClampToEdge, Texture::AllocateData(_initData.shouldAllocateDataOnCPU) ); tex->setDataOwnership(Texture::TakeOwnership::Yes); tex->uploadTexture(); - tex->setFilter(Texture::FilterMode::AnisotropicMipMap); + tex->setFilter(mode); _textures.push_back(std::move(tex)); } @@ -475,7 +485,13 @@ void MemoryAwareTileCache::createTileAndPut(ProviderTileKey key, RawTile rawTile // Hi there, I know someone will be tempted to change this to a Linear filtering // mode at some point. This will introduce rendering artifacts when looking at the // globe at oblique angles (see #2752) - tex->setFilter(ghoul::opengl::Texture::FilterMode::AnisotropicMipMap); + using namespace ghoul::systemcapabilities; + ghoul::opengl::Texture::FilterMode mode = + OpenGLCap.gpuVendor() == OpenGLCapabilitiesComponent::Vendor::AmdATI ? + ghoul::opengl::Texture::FilterMode::Linear : + ghoul::opengl::Texture::FilterMode::AnisotropicMipMap; + + tex->setFilter(mode); Tile tile{ tex, std::move(rawTile.tileMetaData), Tile::Status::OK }; TileTextureInitData::HashKey initDataKey = initData.hashKey; _textureContainerMap[initDataKey].second->put(std::move(key), std::move(tile)); From 1f32394fb288c061f623aec87389c2674799fb0e Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Fri, 18 Aug 2023 16:32:56 +0200 Subject: [PATCH 105/701] Issue/2225 - Add exoplanets from a CSV file (#2846) * Make reading exoplanet data from CSV during runtime work * Add function descriptions * Clarify an info message * Initialize all data parameters with NaN, to prevent unpredictable values when a parameter is not included in the dataset Co-authored-by: Alexander Bock --------- Co-authored-by: Alexander Bock --- modules/exoplanets/exoplanetshelper.cpp | 19 + modules/exoplanets/exoplanetshelper.h | 131 +++-- modules/exoplanets/exoplanetsmodule.cpp | 12 +- modules/exoplanets/exoplanetsmodule.h | 1 + modules/exoplanets/exoplanetsmodule_lua.inl | 153 ++++-- .../tasks/exoplanetsdatapreparationtask.cpp | 478 ++++++++++-------- .../tasks/exoplanetsdatapreparationtask.h | 53 +- 7 files changed, 561 insertions(+), 286 deletions(-) diff --git a/modules/exoplanets/exoplanetshelper.cpp b/modules/exoplanets/exoplanetshelper.cpp index 58975f5205..01c374044f 100644 --- a/modules/exoplanets/exoplanetshelper.cpp +++ b/modules/exoplanets/exoplanetshelper.cpp @@ -161,4 +161,23 @@ void sanitizeNameString(std::string& s) { s.erase(remove(s.begin(), s.end(), '\''), s.end()); } +void updateStarDataFromNewPlanet(StarData& starData, const ExoplanetDataEntry& p) { + const glm::vec3 pos = glm::vec3(p.positionX, p.positionY, p.positionZ); + if (starData.position != pos && isValidPosition(pos)) { + starData.position = pos; + } + if (starData.radius != p.rStar && !std::isnan(p.rStar)) { + starData.radius = p.rStar; + } + if (starData.bv != p.bmv && !std::isnan(p.bmv)) { + starData.bv = p.bmv; + } + if (starData.teff != p.teff && !std::isnan(p.teff)) { + starData.teff = p.teff; + } + if (starData.luminosity != p.luminosity && !std::isnan(p.luminosity)) { + starData.luminosity = p.luminosity; + } +} + } // namespace openspace::exoplanets diff --git a/modules/exoplanets/exoplanetshelper.h b/modules/exoplanets/exoplanetshelper.h index d4e9c9ca0f..83368d4f7d 100644 --- a/modules/exoplanets/exoplanetshelper.h +++ b/modules/exoplanets/exoplanetshelper.h @@ -33,43 +33,95 @@ namespace openspace::exoplanets { struct ExoplanetDataEntry { - float a; // Orbital semi-major axis in AU - double aUpper; // Upper uncertainty of orbital semi-major axis - double aLower; // Lower uncertainty of orbital semi-major axis - float bigOmega; // Longitude of ascending node in degrees - float bigOmegaUpper; // Upper uncertainty of longitude of ascending node - float bigOmegaLower; // Lower uncertainty of longitude of ascending node - bool binary; // Star known to be binary? - float bmv; // Star B − V color - float ecc; // Orbital eccentricity - float eccUpper; // Upper uncertainty of orbital eccentricity - float eccLower; // Lower uncertainty of orbital eccentricity - float i; // Orbital inclination in degrees (for transiting systems only) - float iUpper; // Upper uncertainty of orbital inclination - float iLower; // Lower uncertainty of orbital inclination - int nPlanets; // Number of known planets in the planetary system - int nStars; // Number of stars in the planetary system - float omega; // Argument of periastron in degrees - float omegaUpper; // Upper uncertainty of argument of periastron - float omegaLower; // Lower uncertainty of argument of periastron - double per; // Orbital period in days - float perUpper; // Upper uncertainty of period - float perLower; // Lower uncertainty of period - double r; // Radius of the planet in Jupiter radii - double rUpper; // Upper uncertainty of radius of the planet - double rLower; // Lower uncertainty of radius of the planet - float rStar; // Estimated radius of the star in solar radii - float rStarUpper; // Upper uncertainty of estimated star radius - float rStarLower; // Lower uncertainty of estimated star radius - float luminosity; // Star luminosity, in units of solar luminosities - float luminosityUpper; // Upper uncertainty of star luminosity - float luminosityLower; // Lower uncertainty of star luminosity - float teff; // Star's effective temperature in Kelvin - float teffUpper; // Upper uncertainty of effective temperature - float teffLower; // Lower uncertainty of effective temperature - double tt; // Epoch of transit center in HJD-2440000 - float ttUpper; // Upper uncertainty of epoch of transit center - float ttLower; // Lower uncertainty of epoch of transit center + // Orbital semi-major axis in AU + float a = std::numeric_limits::quiet_NaN(); + // Upper uncertainty of orbital semi-major axis + double aUpper = std::numeric_limits::quiet_NaN(); + // Lower uncertainty of orbital semi-major axis + double aLower = std::numeric_limits::quiet_NaN(); + + // Longitude of ascending node in degrees + float bigOmega = std::numeric_limits::quiet_NaN(); + // Upper uncertainty of longitude of ascending node + float bigOmegaUpper = std::numeric_limits::quiet_NaN(); + // Lower uncertainty of longitude of ascending node + float bigOmegaLower = std::numeric_limits::quiet_NaN(); + + // Star known to be binary? + bool binary = false; + + // Star B − V color + float bmv = std::numeric_limits::quiet_NaN(); + + // Orbital eccentricity + float ecc = std::numeric_limits::quiet_NaN(); + // Upper uncertainty of orbital eccentricity + float eccUpper = std::numeric_limits::quiet_NaN(); + // Lower uncertainty of orbital eccentricity + float eccLower = std::numeric_limits::quiet_NaN(); + + // Orbital inclination in degrees (for transiting systems only) + float i = std::numeric_limits::quiet_NaN(); + // Upper uncertainty of orbital inclination + float iUpper = std::numeric_limits::quiet_NaN(); + // Lower uncertainty of orbital inclination + float iLower = std::numeric_limits::quiet_NaN(); + + // Number of known planets in the planetary system + int nPlanets = std::numeric_limits::quiet_NaN(); + + // Number of stars in the planetary system + int nStars = std::numeric_limits::quiet_NaN(); + + // Argument of periastron in degrees + float omega = std::numeric_limits::quiet_NaN(); + // Upper uncertainty of argument of periastron + float omegaUpper = std::numeric_limits::quiet_NaN(); + // Lower uncertainty of argument of periastron + float omegaLower = std::numeric_limits::quiet_NaN(); + + // Orbital period in days + double per = std::numeric_limits::quiet_NaN(); + // Upper uncertainty of period + float perUpper = std::numeric_limits::quiet_NaN(); + // Lower uncertainty of period + float perLower = std::numeric_limits::quiet_NaN(); + + // Radius of the planet in Jupiter radii + double r = std::numeric_limits::quiet_NaN(); + // Upper uncertainty of radius of the planet + double rUpper = std::numeric_limits::quiet_NaN(); + // Lower uncertainty of radius of the planet + double rLower = std::numeric_limits::quiet_NaN(); + + // Estimated radius of the star in solar radii + float rStar = std::numeric_limits::quiet_NaN(); + // Upper uncertainty of estimated star radius + float rStarUpper = std::numeric_limits::quiet_NaN(); + // Lower uncertainty of estimated star radius + float rStarLower = std::numeric_limits::quiet_NaN(); + + // Star luminosity, in units of solar luminosities + float luminosity = std::numeric_limits::quiet_NaN(); + // Upper uncertainty of star luminosity + float luminosityUpper = std::numeric_limits::quiet_NaN(); + // Lower uncertainty of star luminosity + float luminosityLower = std::numeric_limits::quiet_NaN(); + + // Star's effective temperature in Kelvin + float teff = std::numeric_limits::quiet_NaN(); + // Upper uncertainty of effective temperature + float teffUpper = std::numeric_limits::quiet_NaN(); + // Lower uncertainty of effective temperature + float teffLower = std::numeric_limits::quiet_NaN(); + + // Epoch of transit center in HJD-2440000 + double tt = std::numeric_limits::quiet_NaN(); + // Upper uncertainty of epoch of transit center + float ttUpper = std::numeric_limits::quiet_NaN(); + // Lower uncertainty of epoch of transit center + float ttLower = std::numeric_limits::quiet_NaN(); + // Star position's X-coordinate in parsec float positionX = std::numeric_limits::quiet_NaN(); // Star position's Y-coordinate in parsec @@ -110,6 +162,11 @@ glm::dmat3 computeSystemRotation(glm::dvec3 starPosition); void sanitizeNameString(std::string& s); +// Star data should not vary between planets, but one data entry might lack data +// for the host star while another does not. So for every planet, update star data +// if needed +void updateStarDataFromNewPlanet(StarData& starData, const ExoplanetDataEntry& p); + } // namespace openspace::exoplanets #endif // __OPENSPACE_MODULE_EXOPLANETS___EXOPLANETSHELPER___H__ diff --git a/modules/exoplanets/exoplanetsmodule.cpp b/modules/exoplanets/exoplanetsmodule.cpp index 5bda398894..a724c68c5f 100644 --- a/modules/exoplanets/exoplanetsmodule.cpp +++ b/modules/exoplanets/exoplanetsmodule.cpp @@ -147,6 +147,7 @@ namespace { constexpr std::string_view ExoplanetsDataFileName = "exoplanets_data.bin"; constexpr std::string_view LookupTableFileName = "lookup.txt"; + constexpr std::string_view TeffToBvConversionFileName = "teff_bv.txt"; struct [[codegen::Dictionary(ExoplanetsModule)]] Parameters { // [[codegen::verbatim(EnabledInfo.description)]] @@ -246,6 +247,14 @@ std::string ExoplanetsModule::lookUpTablePath() const { ).string(); } +std::string ExoplanetsModule::teffToBvConversionFilePath() const { + ghoul_assert(hasDataFiles(), "Data files not loaded"); + + return absPath(fmt::format( + "{}/{}", _exoplanetsDataFolder.value(), TeffToBvConversionFileName + )).string(); +} + std::string ExoplanetsModule::bvColormapPath() const { return _bvColorMapPath; } @@ -348,7 +357,8 @@ scripting::LuaLibrary ExoplanetsModule::luaLibrary() const { codegen::lua::RemoveExoplanetSystem, codegen::lua::ListOfExoplanets, codegen::lua::ListOfExoplanetsDeprecated, - codegen::lua::ListAvailableExoplanetSystems + codegen::lua::ListAvailableExoplanetSystems, + codegen::lua::LoadExoplanetsFromCsv } }; } diff --git a/modules/exoplanets/exoplanetsmodule.h b/modules/exoplanets/exoplanetsmodule.h index 7943967ba7..a77b6a43b5 100644 --- a/modules/exoplanets/exoplanetsmodule.h +++ b/modules/exoplanets/exoplanetsmodule.h @@ -44,6 +44,7 @@ public: bool hasDataFiles() const; std::string exoplanetsDataPath() const; std::string lookUpTablePath() const; + std::string teffToBvConversionFilePath() const; std::string bvColormapPath() const; std::string starTexturePath() const; std::string starGlareTexturePath() const; diff --git a/modules/exoplanets/exoplanetsmodule_lua.inl b/modules/exoplanets/exoplanetsmodule_lua.inl index 2552f2037d..bdd98a510a 100644 --- a/modules/exoplanets/exoplanetsmodule_lua.inl +++ b/modules/exoplanets/exoplanetsmodule_lua.inl @@ -23,7 +23,9 @@ ****************************************************************************************/ #include +#include #include +#include #include #include @@ -95,32 +97,16 @@ openspace::exoplanets::ExoplanetSystem findExoplanetSystemInData( system.planetNames.push_back(name); system.planetsData.push_back(p); - // Star data - Should not vary between planets, but one data entry might lack data - // for the host star while another does not. So for every planet, update star data - // if needed - const glm::vec3 pos = glm::vec3(p.positionX, p.positionY, p.positionZ); - if (system.starData.position != pos && isValidPosition(pos)) { - system.starData.position = pos; - } - if (system.starData.radius != p.rStar && !std::isnan(p.rStar)) { - system.starData.radius = p.rStar; - } - if (system.starData.bv != p.bmv && !std::isnan(p.bmv)) { - system.starData.bv = p.bmv; - } - if (system.starData.teff != p.teff && !std::isnan(p.teff)) { - system.starData.teff = p.teff; - } - if (system.starData.luminosity != p.luminosity && !std::isnan(p.luminosity)) { - system.starData.luminosity = p.luminosity; - } + updateStarDataFromNewPlanet(system.starData, p); } system.starName = starName; return system; } -void createExoplanetSystem(const std::string& starName) { +void createExoplanetSystem(const std::string& starName, + openspace::exoplanets::ExoplanetSystem system) +{ using namespace openspace; using namespace exoplanets; @@ -140,12 +126,6 @@ void createExoplanetSystem(const std::string& starName) { return; } - ExoplanetSystem system = findExoplanetSystemInData(starName); - if (system.planetsData.empty()) { - LERROR(fmt::format("Exoplanet system '{}' could not be found", starName)); - return; - } - const glm::vec3 starPosInParsec = system.starData.position; if (!isValidPosition(starPosInParsec)) { LERROR(fmt::format( @@ -238,6 +218,8 @@ void createExoplanetSystem(const std::string& starName) { // Planets for (size_t i = 0; i < system.planetNames.size(); i++) { + // Note that we are here overriding some invalid parameters in the planet data. + // Use a reference, so that it is changed down the line ExoplanetDataEntry& planet = system.planetsData[i]; const std::string planetName = system.planetNames[i]; @@ -616,17 +598,29 @@ std::vector hostStarsWithSufficientData() { [[codegen::luawrap]] void addExoplanetSystem( std::variant> starNames) { + std::vector starsToAdd; + if (std::holds_alternative(starNames)) { // The user provided a single name - std::string starName = std::get(starNames); - createExoplanetSystem(starName); + const std::string starName = std::get(starNames); + starsToAdd.push_back(starName); } else { - std::vector sns = std::get>(starNames); - for (const std::string& starName : sns) { - createExoplanetSystem(starName); - } + starsToAdd = std::get>(starNames); } + + for (const std::string& starName : starsToAdd) { + openspace::exoplanets::ExoplanetSystem systemData = + findExoplanetSystemInData(starName); + + if (systemData.planetsData.empty()) { + LERROR(fmt::format("Exoplanet system '{}' could not be found", starName)); + return; + } + + createExoplanetSystem(starName, systemData); + } + } [[codegen::luawrap]] void removeExoplanetSystem(std::string starName) { @@ -639,6 +633,11 @@ std::vector hostStarsWithSufficientData() { ); } +/** + * Returns a list with names of the host star of all the exoplanet systems + * that have sufficient data for generating a visualization, based on the + * module's loaded data file. + */ [[codegen::luawrap]] std::vector listOfExoplanets() { std::vector names = hostStarsWithSufficientData(); return names; @@ -674,6 +673,96 @@ listOfExoplanetsDeprecated() )); } +/** + * Load a set of exoplanets based on custom data, in the form of a CSV file, and add + * them to the rendering. Can be used to load custom datasets, or more recent planets + * than what are included in the internal data file that is released with OpenSpace. + * + * The format and column names in the CSV sould be the same as the ones provided by the + * NASA Exoplanet Archive. https://exoplanetarchive.ipac.caltech.edu/ + * + * We recommend downloading the file from the Exoplanet Archive's Composite data table, + * where multiple sources are combined into one row per planet. + * https://exoplanetarchive.ipac.caltech.edu/cgi-bin/TblView/nph-tblView?app=ExoTbls&config=PSCompPars + * + * Please remember to include all columns in the file download, as missing data columns + * may lead to an incomplete visualization. + * + * Also, avoid loading too large files of planets, as each added system will affect the + * rendering performance. + */ +[[codegen::luawrap]] void loadExoplanetsFromCsv(std::string csvFile) { + using namespace openspace; + using namespace exoplanets; + + using PlanetData = ExoplanetsDataPreparationTask::PlanetData; + + std::ifstream inputDataFile(csvFile); + if (!inputDataFile.good()) { + LERROR(fmt::format("Failed to open input file {}", csvFile)); + return; + } + + std::vector columnNames = + ExoplanetsDataPreparationTask::readFirstDataRow(inputDataFile); + + const ExoplanetsModule* module = global::moduleEngine->module(); + const std::string teffBvConversionPath = module->teffToBvConversionFilePath(); + + std::map hostNameToSystemDataMap; + + // Parse the file line by line to compose system information + std::string row; + while (std::getline(inputDataFile, row)) { + PlanetData planetData = ExoplanetsDataPreparationTask::parseDataRow( + row, + columnNames, + "", + module->teffToBvConversionFilePath() + ); + + LINFO(fmt::format("Reading data for planet: '{}' ", planetData.name)); + + if (!hasSufficientData(planetData.dataEntry)) { + LWARNING(fmt::format("Insufficient data for exoplanet: '{}'", planetData.name)); + continue; + } + + auto found = hostNameToSystemDataMap.find(planetData.host); + if (found != hostNameToSystemDataMap.end()) { + // Found a match. Add the planet to the system data + ExoplanetSystem& system = found->second; + sanitizeNameString(planetData.name); + system.planetNames.push_back(planetData.name); + system.planetsData.push_back(planetData.dataEntry); + updateStarDataFromNewPlanet(system.starData, planetData.dataEntry); + } + else { + // No host found. Add a new one + ExoplanetSystem system; + sanitizeNameString(planetData.name); + system.planetNames.push_back(planetData.name); + system.planetsData.push_back(planetData.dataEntry); + updateStarDataFromNewPlanet(system.starData, planetData.dataEntry); + + hostNameToSystemDataMap[planetData.host] = system; + } + } + + // Add all the added exoplanet systems + for (const std::pair& entry : hostNameToSystemDataMap) { + const std::string& hostName = entry.first; + const ExoplanetSystem& data = entry.second; + createExoplanetSystem(hostName, data); + } + + LINFO(fmt::format( + "Read data for {} exoplanet systems from CSV file: '{}'. Please wait until " + "they are all finished initializing. You may have to reload the user interface.", + hostNameToSystemDataMap.size(), csvFile + )); +} + #include "exoplanetsmodule_lua_codegen.cpp" } // namespace diff --git a/modules/exoplanets/tasks/exoplanetsdatapreparationtask.cpp b/modules/exoplanets/tasks/exoplanetsdatapreparationtask.cpp index 4b9477fa80..621c287dac 100644 --- a/modules/exoplanets/tasks/exoplanetsdatapreparationtask.cpp +++ b/modules/exoplanets/tasks/exoplanetsdatapreparationtask.cpp @@ -118,24 +118,9 @@ void ExoplanetsDataPreparationTask::perform( int version = 1; binFile.write(reinterpret_cast(&version), sizeof(int)); - auto readFirstDataRow = [](std::ifstream& file, std::string& line) -> void { - while (std::getline(file, line)) { - bool shouldSkip = line[0] == '#' || line.empty(); - if (!shouldSkip) break; - } - }; - - // Find the line containing the data names - std::string columnNamesRow; - readFirstDataRow(inputDataFile, columnNamesRow); - - // Read column names into a vector, for later access - std::vector columnNames; - std::stringstream sStream(columnNamesRow); - std::string colName; - while (std::getline(sStream, colName, ',')) { - columnNames.push_back(colName); - } + // Read until the first line contaning the column names, and save them for + // later access + std::vector columnNames = readFirstDataRow(inputDataFile); // Read total number of items int total = 0; @@ -146,37 +131,94 @@ void ExoplanetsDataPreparationTask::perform( inputDataFile.clear(); inputDataFile.seekg(0); - // Read past the first line, containing the data names - readFirstDataRow(inputDataFile, row); + // The reading is restarted, so we need to read past the first line, + // containing the data names, again + readFirstDataRow(inputDataFile); LINFO(fmt::format("Loading {} exoplanets", total)); + int exoplanetCount = 0; + while (std::getline(inputDataFile, row)) { + ++exoplanetCount; + progressCallback(static_cast(exoplanetCount) / static_cast(total)); + + PlanetData planetData = parseDataRow( + row, + columnNames, + _inputSpeckPath, + _teffToBvFilePath + ); + + // Create look-up table + long pos = static_cast(binFile.tellp()); + std::string planetName = planetData.host + " " + planetData.component; + lutFile << planetName << "," << pos << std::endl; + + binFile.write( + reinterpret_cast(&planetData.dataEntry), + sizeof(ExoplanetDataEntry) + ); + } + + progressCallback(1.f); +} + +std::vector +ExoplanetsDataPreparationTask::readFirstDataRow(std::ifstream& file) +{ + std::string line; + + // Read past any comments and empty lines + while (std::getline(file, line)) { + bool shouldSkip = line.empty() || line[0] == '#'; + if (!shouldSkip) { + break; + } + } + + // The identified line should contain the column names. Return them! + std::vector columnNames; + std::stringstream sStream(line); + std::string colName; + while (std::getline(sStream, colName, ',')) { + columnNames.push_back(colName); + } + + return columnNames; +}; + +ExoplanetsDataPreparationTask::PlanetData +ExoplanetsDataPreparationTask::parseDataRow(std::string row, + const std::vector& columnNames, + std::filesystem::path positionSourceFile, + std::filesystem::path bvFromTeffConversionFile) +{ auto readFloatData = [](const std::string& str) -> float { - #ifdef WIN32 +#ifdef WIN32 float result; auto [p, ec] = std::from_chars(str.data(), str.data() + str.size(), result); if (ec == std::errc()) { return result; } return std::numeric_limits::quiet_NaN(); - #else +#else // clang is missing float support for std::from_chars return !str.empty() ? std::stof(str.c_str(), nullptr) : NAN; - #endif - }; +#endif +}; auto readDoubleData = [](const std::string& str) -> double { - #ifdef WIN32 +#ifdef WIN32 double result; auto [p, ec] = std::from_chars(str.data(), str.data() + str.size(), result); if (ec == std::errc()) { return result; } return std::numeric_limits::quiet_NaN(); - #else +#else // clang is missing double support for std::from_chars return !str.empty() ? std::stod(str.c_str(), nullptr) : NAN; - #endif +#endif }; auto readIntegerData = [](const std::string& str) -> int { @@ -194,202 +236,206 @@ void ExoplanetsDataPreparationTask::perform( return result; }; + float ra = std::numeric_limits::quiet_NaN(); // decimal degrees + float dec = std::numeric_limits::quiet_NaN(); // decimal degrees + float distanceInParsec = std::numeric_limits::quiet_NaN(); + + std::istringstream lineStream(row); + int columnIndex = 0; + ExoplanetDataEntry p; + std::string component; + std::string starName; + std::string name; + std::string data; - int exoplanetCount = 0; - while (std::getline(inputDataFile, row)) { - ++exoplanetCount; - progressCallback(static_cast(exoplanetCount) / static_cast(total)); + while (std::getline(lineStream, data, ',')) { + const std::string& column = columnNames[columnIndex]; + columnIndex++; - std::string component; - std::string starName; - - float ra = std::numeric_limits::quiet_NaN(); // decimal degrees - float dec = std::numeric_limits::quiet_NaN(); // decimal degrees - float distanceInParsec = std::numeric_limits::quiet_NaN(); - - std::istringstream lineStream(row); - int columnIndex = 0; - while (std::getline(lineStream, data, ',')) { - const std::string& column = columnNames[columnIndex]; - columnIndex++; - - if (column == "pl_letter") { - component = readStringData(data); - } - // Orbital semi-major axis - else if (column == "pl_orbsmax") { - p.a = readFloatData(data); - } - else if (column == "pl_orbsmaxerr1") { - p.aUpper = readDoubleData(data); - } - else if (column == "pl_orbsmaxerr2") { - p.aLower = -readDoubleData(data); - } - // Orbital eccentricity - else if (column == "pl_orbeccen") { - p.ecc = readFloatData(data); - } - else if (column == "pl_orbeccenerr1") { - p.eccUpper = readFloatData(data); - } - else if (column == "pl_orbeccenerr2") { - p.eccLower = -readFloatData(data); - } - // Orbital inclination - else if (column == "pl_orbincl") { - p.i = readFloatData(data); - } - else if (column == "pl_orbinclerr1") { - p.iUpper = readFloatData(data); - } - else if (column == "pl_orbinclerr2") { - p.iLower = -readFloatData(data); - } - // Argument of periastron - else if (column == "pl_orblper") { - p.omega = readFloatData(data); - } - else if (column == "pl_orblpererr1") { - p.omegaUpper = readFloatData(data); - } - else if (column == "pl_orblpererr2") { - p.omegaLower = -readFloatData(data); - } - // Orbital period - else if (column == "pl_orbper") { - p.per = readDoubleData(data); - } - else if (column == "pl_orbpererr1") { - p.perUpper = readFloatData(data); - } - else if (column == "pl_orbpererr2") { - p.perLower = -readFloatData(data); - } - // Radius of the planet (Jupiter radii) - else if (column == "pl_radj") { - p.r = readDoubleData(data); - } - else if (column == "pl_radjerr1") { - p.rUpper = readDoubleData(data); - } - else if (column == "pl_radjerr2") { - p.rLower = -readDoubleData(data); - } - // Time of transit midpoint - else if (column == "pl_tranmid") { - p.tt = readDoubleData(data); - } - else if (column == "pl_tranmiderr1") { - p.ttUpper = readFloatData(data); - } - else if (column == "pl_tranmiderr2") { - p.ttLower = -readFloatData(data); - } - // Star - name and position - else if (column == "hostname") { - starName = readStringData(data); - glm::vec3 position = starPosition(starName); - p.positionX = position[0]; - p.positionY = position[1]; - p.positionZ = position[2]; - } - else if (column == "ra") { - ra = readFloatData(data); - } - else if (column == "dec") { - dec = readFloatData(data); - } - else if (column == "sy_dist") { - distanceInParsec = readFloatData(data); - } - // Star radius - else if (column == "st_rad") { - p.rStar = readFloatData(data); - } - else if (column == "st_raderr1") { - p.rStarUpper = readFloatData(data); - } - else if (column == "st_raderr2") { - p.rStarLower = -readFloatData(data); - } - // Effective temperature and color of star - // (B-V color index computed from star's effective temperature) - else if (column == "st_teff") { - p.teff = readFloatData(data); - p.bmv = bvFromTeff(p.teff); - } - else if (column == "st_tefferr1") { - p.teffUpper = readFloatData(data); - } - else if (column == "st_tefferr2") { - p.teffLower = -readFloatData(data); - } - // Star luminosity - else if (column == "st_lum") { - float dataInLogSolar = readFloatData(data); - p.luminosity = static_cast(std::pow(10, dataInLogSolar)); - } - else if (column == "st_lumerr1") { - float dataInLogSolar = readFloatData(data); - p.luminosityUpper = static_cast(std::pow(10, dataInLogSolar)); - } - else if (column == "st_lumerr2") { - float dataInLogSolar = readFloatData(data); - p.luminosityLower = static_cast(-std::pow(10, dataInLogSolar)); - } - // Is the planet orbiting a binary system? - else if (column == "cb_flag") { - p.binary = static_cast(readIntegerData(data)); - } - // Number of stars in the system - else if (column == "sy_snum") { - p.nStars = readIntegerData(data); - } - // Number of planets in the system - else if (column == "sy_pnum") { - p.nPlanets = readIntegerData(data); - } + if (column == "pl_letter") { + component = readStringData(data); } - - // @TODO (emmbr 2020-10-05) Currently, the dataset has no information about the - // longitude of the ascending node, but maybe it might in the future - p.bigOmega = std::numeric_limits::quiet_NaN(); - p.bigOmegaUpper = std::numeric_limits::quiet_NaN(); - p.bigOmegaLower = std::numeric_limits::quiet_NaN(); - - bool foundPositionFromSpeck = !std::isnan(p.positionX); - bool hasDistance = !std::isnan(distanceInParsec); - bool hasIcrsCoords = !std::isnan(ra) && !std::isnan(dec) && hasDistance; - - if (!foundPositionFromSpeck && hasIcrsCoords) { - glm::dvec3 pos = icrsToGalacticCartesian(ra, dec, distanceInParsec); - p.positionX = static_cast(pos.x); - p.positionY = static_cast(pos.y); - p.positionZ = static_cast(pos.z); + else if (column == "pl_name") { + name = readStringData(data); + } + // Orbital semi-major axis + else if (column == "pl_orbsmax") { + p.a = readFloatData(data); + } + else if (column == "pl_orbsmaxerr1") { + p.aUpper = readDoubleData(data); + } + else if (column == "pl_orbsmaxerr2") { + p.aLower = -readDoubleData(data); + } + // Orbital eccentricity + else if (column == "pl_orbeccen") { + p.ecc = readFloatData(data); + } + else if (column == "pl_orbeccenerr1") { + p.eccUpper = readFloatData(data); + } + else if (column == "pl_orbeccenerr2") { + p.eccLower = -readFloatData(data); + } + // Orbital inclination + else if (column == "pl_orbincl") { + p.i = readFloatData(data); + } + else if (column == "pl_orbinclerr1") { + p.iUpper = readFloatData(data); + } + else if (column == "pl_orbinclerr2") { + p.iLower = -readFloatData(data); + } + // Argument of periastron + else if (column == "pl_orblper") { + p.omega = readFloatData(data); + } + else if (column == "pl_orblpererr1") { + p.omegaUpper = readFloatData(data); + } + else if (column == "pl_orblpererr2") { + p.omegaLower = -readFloatData(data); + } + // Orbital period + else if (column == "pl_orbper") { + p.per = readDoubleData(data); + } + else if (column == "pl_orbpererr1") { + p.perUpper = readFloatData(data); + } + else if (column == "pl_orbpererr2") { + p.perLower = -readFloatData(data); + } + // Radius of the planet (Jupiter radii) + else if (column == "pl_radj") { + p.r = readDoubleData(data); + } + else if (column == "pl_radjerr1") { + p.rUpper = readDoubleData(data); + } + else if (column == "pl_radjerr2") { + p.rLower = -readDoubleData(data); + } + // Time of transit midpoint + else if (column == "pl_tranmid") { + p.tt = readDoubleData(data); + } + else if (column == "pl_tranmiderr1") { + p.ttUpper = readFloatData(data); + } + else if (column == "pl_tranmiderr2") { + p.ttLower = -readFloatData(data); + } + // Star - name and position + else if (column == "hostname") { + starName = readStringData(data); + glm::vec3 position = starPosition(starName, positionSourceFile); + p.positionX = position[0]; + p.positionY = position[1]; + p.positionZ = position[2]; + } + else if (column == "ra") { + ra = readFloatData(data); + } + else if (column == "dec") { + dec = readFloatData(data); + } + else if (column == "sy_dist") { + distanceInParsec = readFloatData(data); + } + // Star radius + else if (column == "st_rad") { + p.rStar = readFloatData(data); + } + else if (column == "st_raderr1") { + p.rStarUpper = readFloatData(data); + } + else if (column == "st_raderr2") { + p.rStarLower = -readFloatData(data); + } + // Effective temperature and color of star + // (B-V color index computed from star's effective temperature) + else if (column == "st_teff") { + p.teff = readFloatData(data); + p.bmv = bvFromTeff(p.teff, bvFromTeffConversionFile); + } + else if (column == "st_tefferr1") { + p.teffUpper = readFloatData(data); + } + else if (column == "st_tefferr2") { + p.teffLower = -readFloatData(data); + } + // Star luminosity + else if (column == "st_lum") { + float dataInLogSolar = readFloatData(data); + p.luminosity = static_cast(std::pow(10, dataInLogSolar)); + } + else if (column == "st_lumerr1") { + float dataInLogSolar = readFloatData(data); + p.luminosityUpper = static_cast(std::pow(10, dataInLogSolar)); + } + else if (column == "st_lumerr2") { + float dataInLogSolar = readFloatData(data); + p.luminosityLower = static_cast(-std::pow(10, dataInLogSolar)); + } + // Is the planet orbiting a binary system? + else if (column == "cb_flag") { + p.binary = readIntegerData(data) != 0; + } + // Number of stars in the system + else if (column == "sy_snum") { + p.nStars = readIntegerData(data); + } + // Number of planets in the system + else if (column == "sy_pnum") { + p.nPlanets = readIntegerData(data); } - - // Create look-up table - long pos = static_cast(binFile.tellp()); - std::string planetName = starName + " " + component; - lutFile << planetName << "," << pos << std::endl; - - binFile.write(reinterpret_cast(&p), sizeof(ExoplanetDataEntry)); } - progressCallback(1.f); + // @TODO (emmbr 2020-10-05) Currently, the dataset has no information about the + // longitude of the ascending node, but maybe it might in the future + p.bigOmega = std::numeric_limits::quiet_NaN(); + p.bigOmegaUpper = std::numeric_limits::quiet_NaN(); + p.bigOmegaLower = std::numeric_limits::quiet_NaN(); + + bool foundPositionFromSpeck = !std::isnan(p.positionX); + bool hasDistance = !std::isnan(distanceInParsec); + bool hasIcrsCoords = !std::isnan(ra) && !std::isnan(dec) && hasDistance; + + if (!foundPositionFromSpeck && hasIcrsCoords) { + glm::dvec3 pos = icrsToGalacticCartesian(ra, dec, distanceInParsec); + p.positionX = static_cast(pos.x); + p.positionY = static_cast(pos.y); + p.positionZ = static_cast(pos.z); + } + + return { + .host = starName, + .name = name, + .component = component, + .dataEntry = p + }; } -glm::vec3 ExoplanetsDataPreparationTask::starPosition(const std::string& starName) { - std::ifstream exoplanetsFile(_inputSpeckPath); - if (!exoplanetsFile) { - LERROR(fmt::format("Error opening file expl.speck")); +glm::vec3 ExoplanetsDataPreparationTask::starPosition(const std::string& starName, + const std::filesystem::path& sourceFile) +{ + glm::vec3 position = glm::vec3(std::numeric_limits::quiet_NaN()); + + if (sourceFile.empty()) { + // No file specified => return NaN position + return position; } - glm::vec3 position{ std::numeric_limits::quiet_NaN() }; - std::string line; + std::ifstream exoplanetsFile(sourceFile); + if (!exoplanetsFile) { + LERROR(fmt::format("Error opening file {}", sourceFile)); + } + std::string line; while (std::getline(exoplanetsFile, line)) { bool shouldSkipLine = ( line.empty() || line[0] == '#' || line.substr(0, 7) == "datavar" || @@ -423,17 +469,21 @@ glm::vec3 ExoplanetsDataPreparationTask::starPosition(const std::string& starNam return position; } -float ExoplanetsDataPreparationTask::bvFromTeff(float teff) { +float ExoplanetsDataPreparationTask::bvFromTeff(float teff, + const std::filesystem::path& conversionFile) +{ if (std::isnan(teff)) { return std::numeric_limits::quiet_NaN(); } - std::ifstream teffToBvFile(_teffToBvFilePath); + std::ifstream teffToBvFile(conversionFile); if (!teffToBvFile.good()) { - LERROR(fmt::format("Failed to open teff_bv.txt file")); + LERROR(fmt::format("Failed to open file {}", conversionFile)); return std::numeric_limits::quiet_NaN(); } + // Find the line in the file that most closely corresponds to the specified teff, + // and finally interpolate the value float bv = 0.f; float bvUpper = 0.f; float bvLower = 0.f; diff --git a/modules/exoplanets/tasks/exoplanetsdatapreparationtask.h b/modules/exoplanets/tasks/exoplanetsdatapreparationtask.h index 39bdd0ae65..5d0542af28 100644 --- a/modules/exoplanets/tasks/exoplanetsdatapreparationtask.h +++ b/modules/exoplanets/tasks/exoplanetsdatapreparationtask.h @@ -27,6 +27,8 @@ #include +#include + #include #include #include @@ -35,11 +37,49 @@ namespace openspace::exoplanets { class ExoplanetsDataPreparationTask : public Task { public: + struct PlanetData { + std::string host; + std::string name; + std::string component; + ExoplanetDataEntry dataEntry; + }; + ExoplanetsDataPreparationTask(const ghoul::Dictionary& dictionary); std::string description() override; void perform(const Task::ProgressCallback& progressCallback) override; static documentation::Documentation documentation(); + /** + * The exoplanet file includes a set of commented lines in the beginning. This + * funciton skips those lines, as well as any empty lines, and continues reading + * until it find the first valid data line (which will be the column names). + * + * \param file The input file stream used for reading the file + * \return The content of the first data row (i.e. the column names). + */ + static std::vector readFirstDataRow(std::ifstream& file); + + /** + * Parse a row in the CSV file of exoplanets. Assumes the same format and column + * names as provided by the NASA Exoplanet Archive. + * (https://exoplanetarchive.ipac.caltech.edu/) + * + * \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. + * 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 + * \param bvFromTeffConversionFile A text file containing a mapping between effective + * temperature (teff) values and B-V color index values. Each line should include + * two values separated by a comma: first the teff value and hten the B-V value + * \return An object containing the parsed information. + */ + static PlanetData parseDataRow(std::string row, + const std::vector& columnNames, + std::filesystem::path positionSourceFile, + std::filesystem::path bvFromTeffConversionFile); + private: std::filesystem::path _inputDataPath; std::filesystem::path _inputSpeckPath; @@ -47,10 +87,19 @@ private: std::filesystem::path _outputLutPath; std::filesystem::path _teffToBvFilePath; - glm::vec3 starPosition(const std::string& starName); + /** + * Try to find the star position from an input speck file. If not found, the + * returned position will contain NaN values. + * + * \param starName The name of the star to look for in the file + * \param sourceFile The name of the file in which to look + * \return The resulting star position, given in galactix XYZ + */ + static glm::vec3 starPosition(const std::string& starName, + const std::filesystem::path& sourceFile); // Compute b-v color from teff value using a conversion file - float bvFromTeff(float teff); + static float bvFromTeff(float teff, const std::filesystem::path& conversionFile); }; } // namespace openspace::exoplanets From 4d5ce33903e097d19e2932bd3bce31c26e533294 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Fri, 18 Aug 2023 16:33:59 +0200 Subject: [PATCH 106/701] Add UI descriptions and asset metas to a bunch of assets (#2845) * Add asset meta and GUI description to AltAz grid and move to Night sky in menu To avoid confusion with other grids, that have a global position rather than a local one * Add asset metas and GUI descriptions to Night Sky assets * Add metas and update name of some example assets * Night sky asset meta * Add descriptions and asset metas to scale objects --------- Co-authored-by: Ylva Selling --- .../educational/scale/arc_de_triomphe.asset | 14 +++++++++++++ data/assets/educational/scale/big_ben.asset | 13 ++++++++++++ .../educational/scale/burj_khalifa.asset | 14 +++++++++++++ .../educational/scale/eiffeltower.asset | 13 ++++++++++++ .../scale/empire_state_building.asset | 14 +++++++++++++ .../educational/scale/gateway_arch.asset | 13 ++++++++++++ .../scale/golden_gate_bridge.asset | 13 ++++++++++++ .../scale/kuala_lumpur_tower.asset | 13 ++++++++++++ data/assets/educational/scale/rose_bowl.asset | 16 +++++++++++++++ .../assets/educational/scale/school_bus.asset | 15 +++++++++++++- data/assets/educational/scale/scientist.asset | 12 +++++++++++ .../educational/scale/statue_of_liberty.asset | 15 ++++++++++++++ data/assets/examples/dashboarditems.asset | 12 +++++++++++ .../assets/examples/debugcoordinateaxes.asset | 17 ++++++++++++++++ data/assets/examples/discs.asset | 10 ++++++++++ data/assets/examples/globerotation.asset | 12 +++++++++++ data/assets/examples/globetranslation.asset | 12 +++++++++++ data/assets/examples/grids.asset | 14 +++++++++++++ data/assets/examples/joystickproperty.asset | 11 ++++++++++ data/assets/examples/primitives.asset | 11 ++++++++++ .../examples/renderableplaneimageonline.asset | 12 +++++++++++ data/assets/examples/screenspacebrowser.asset | 11 ++++++++++ data/assets/examples/spheres.asset | 12 +++++++++++ data/assets/examples/statemachine.asset | 11 ++++++++++ data/assets/examples/urlsynchronization.asset | 16 +++++++++++++++ data/assets/examples/video/videoglobe.asset | 6 +++--- data/assets/examples/video/videoplane.asset | 6 +++--- .../examples/video/videoscreenspace.asset | 6 +++--- data/assets/examples/video/videosphere.asset | 6 +++--- data/assets/nightsky/altaz.asset | 20 +++++++++++++++++-- .../assets/nightsky/cardinal_directions.asset | 16 +++++++++++++++ data/assets/nightsky/ecliptic_band.asset | 13 ++++++++++++ data/assets/nightsky/equatorial_band.asset | 12 +++++++++++ data/assets/nightsky/galactic_band.asset | 13 ++++++++++++ data/assets/nightsky/light_pollution.asset | 15 ++++++++++++++ data/assets/nightsky/meridian.asset | 12 +++++++++++ data/assets/nightsky/nightsky.asset | 10 ++++++++++ data/assets/nightsky/planets.asset | 19 ++++++++++++++++++ data/assets/nightsky/zenith.asset | 14 +++++++++++++ 39 files changed, 479 insertions(+), 15 deletions(-) diff --git a/data/assets/educational/scale/arc_de_triomphe.asset b/data/assets/educational/scale/arc_de_triomphe.asset index 7b42395fae..3640c96a83 100644 --- a/data/assets/educational/scale/arc_de_triomphe.asset +++ b/data/assets/educational/scale/arc_de_triomphe.asset @@ -40,6 +40,8 @@ local ScaleModel = { }, GUI = { Name = "Arc de Triomphe", + Description = [[The triumphal arch is 50 m (164 ft) tall and has a footprint of + 45x22 m (148x72 ft).]], Path = "/Scale Objects" } } @@ -83,3 +85,15 @@ end) asset.export(ScaleModel) asset.export("UpdatePositionAction", UpdatePositionAction.Identifier) asset.export("ResetPositionAction", ResetPositionAction.Identifier) + + +asset.meta = { + Name = "Scale Model - Arc de Triomphe", + Version = "1.0", + Description = [[A 1:1 scale model of the Arc de Triomphe. Per default it is placed at + its actual position in Paris, France. But the asset also includes actions to move it + to a position under the camera, or back to its original position.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/educational/scale/big_ben.asset b/data/assets/educational/scale/big_ben.asset index b5a88e6eff..6720edafe6 100644 --- a/data/assets/educational/scale/big_ben.asset +++ b/data/assets/educational/scale/big_ben.asset @@ -42,6 +42,7 @@ local ScaleModel = { }, GUI = { Name = "Big Ben", + Description = "The clock tower is 96 m (316 ft) tall.", Path = "/Scale Objects" } } @@ -85,3 +86,15 @@ end) asset.export(ScaleModel) asset.export("UpdatePositionAction", UpdatePositionAction.Identifier) asset.export("ResetPositionAction", ResetPositionAction.Identifier) + + +asset.meta = { + Name = "Scale Model - Big Ben", + Version = "1.0", + Description = [[A 1:1 scale model of the Big Ben. Per default it is placed at its + actual position in London, England. But the asset also includes actions to move + it to a position under the camera, or back to its original position.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/educational/scale/burj_khalifa.asset b/data/assets/educational/scale/burj_khalifa.asset index b69921106b..0f7d24101e 100644 --- a/data/assets/educational/scale/burj_khalifa.asset +++ b/data/assets/educational/scale/burj_khalifa.asset @@ -43,6 +43,8 @@ local ScaleModel = { }, GUI = { Name = "Burj Khalifa", + Description = [[The skyscraper is 830 m (2,722 ft) tall, and the tallest in the + world as of 2009.]], Path = "/Scale Objects" } } @@ -85,3 +87,15 @@ end) asset.export(ScaleModel) asset.export("UpdatePositionAction", UpdatePositionAction.Identifier) asset.export("ResetPositionAction", ResetPositionAction.Identifier) + + +asset.meta = { + Name = "Scale Model - Burj Khalifa", + Version = "1.0", + Description = [[A 1:1 scale model of the Burj Khalifa. Per default it is placed at its + actual position in Dubai. But the asset also includes actions to move it to a + position under the camera, or back to its original position.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/educational/scale/eiffeltower.asset b/data/assets/educational/scale/eiffeltower.asset index 4437cdedab..ed612a1271 100644 --- a/data/assets/educational/scale/eiffeltower.asset +++ b/data/assets/educational/scale/eiffeltower.asset @@ -46,6 +46,7 @@ local ScaleModel = { }, GUI = { Name = "Eiffel Tower", + Description = "The tower is 330 m (1,083 ft) tall.", Path = "/Scale Objects" } } @@ -89,3 +90,15 @@ end) asset.export(ScaleModel) asset.export("UpdatePositionAction", UpdatePositionAction.Identifier) asset.export("ResetPositionAction", ResetPositionAction.Identifier) + + +asset.meta = { + Name = "Scale Model - Eiffel Tower", + Version = "1.0", + Description = [[A 1:1 scale model of the Eiffel Tower. Per default it is placed at + its actual position in Paris, France. But the asset also includes actions to move it + to a position under the camera, or back to its original position.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/educational/scale/empire_state_building.asset b/data/assets/educational/scale/empire_state_building.asset index 0ba6828e1f..c35daf815e 100644 --- a/data/assets/educational/scale/empire_state_building.asset +++ b/data/assets/educational/scale/empire_state_building.asset @@ -45,6 +45,8 @@ local ScaleModel = { }, GUI = { Name = "Empire State Building", + Description = [[The building is 443 m (1,454 ft) tall, including the spire, and has + 102 floors. It has a footprint of 129x57 m (424x187 ft).]], Path = "/Scale Objects" } } @@ -88,3 +90,15 @@ end) asset.export(ScaleModel) asset.export("UpdatePositionAction", UpdatePositionAction.Identifier) asset.export("ResetPositionAction", ResetPositionAction.Identifier) + + +asset.meta = { + Name = "Scale Model - Empire State Building", + Version = "1.0", + Description = [[A 1:1 scale model of the Empire State Building. Per default it is + placed at its actual position in New York City. But the asset also includes actions + to move it to a position under the camera, or back to its original position.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/educational/scale/gateway_arch.asset b/data/assets/educational/scale/gateway_arch.asset index 451b19e50b..2d089375e4 100644 --- a/data/assets/educational/scale/gateway_arch.asset +++ b/data/assets/educational/scale/gateway_arch.asset @@ -46,6 +46,7 @@ local ScaleModel = { }, GUI = { Name = "Gateway Arch", + Description = "The arch monument is 192 m (630 ft) tall.", Path = "/Scale Objects" } } @@ -89,3 +90,15 @@ end) asset.export(ScaleModel) asset.export("UpdatePositionAction", UpdatePositionAction.Identifier) asset.export("ResetPositionAction", ResetPositionAction.Identifier) + + +asset.meta = { + Name = "Scale Model - Gateway Arch", + Version = "1.0", + Description = [[A 1:1 scale model of the Gateway Arch. Per default it is placed at its + actual position in Saint Louis, Missouri. But the asset also includes actions to move + it to a position under the camera, or back to its original position.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/educational/scale/golden_gate_bridge.asset b/data/assets/educational/scale/golden_gate_bridge.asset index e66860e047..5e7b07d3fc 100644 --- a/data/assets/educational/scale/golden_gate_bridge.asset +++ b/data/assets/educational/scale/golden_gate_bridge.asset @@ -46,6 +46,7 @@ local ScaleModel = { }, GUI = { Name = "Golden Gate Bridge", + Description = "The bridge is 2,737 m (8,980 ft) long and 227 m (746 ft) high.", Path = "/Scale Objects" } } @@ -89,3 +90,15 @@ end) asset.export(ScaleModel) asset.export("UpdatePositionAction", UpdatePositionAction.Identifier) asset.export("ResetPositionAction", ResetPositionAction.Identifier) + + +asset.meta = { + Name = "Scale Model - Golden Gate Bridge", + Version = "1.0", + Description = [[A 1:1 scale model of the Golden Gate Bridge. Per default it is placed + at its actual position in San Fransisco. But the asset also includes actions to move + it to a position under the camera, or back to its original position.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/educational/scale/kuala_lumpur_tower.asset b/data/assets/educational/scale/kuala_lumpur_tower.asset index 24faa8229a..6a4f7ce950 100644 --- a/data/assets/educational/scale/kuala_lumpur_tower.asset +++ b/data/assets/educational/scale/kuala_lumpur_tower.asset @@ -40,6 +40,7 @@ local ScaleModel = { }, GUI = { Name = "Kuala Lumpur Tower", + Description = "The tower is 421 m (1,381 ft) tall.", Path = "/Scale Objects" } } @@ -83,3 +84,15 @@ end) asset.export(ScaleModel) asset.export("UpdatePositionAction", UpdatePositionAction.Identifier) asset.export("ResetPositionAction", ResetPositionAction.Identifier) + + +asset.meta = { + Name = "Scale Model - Kuala Lumpur Tower", + Version = "1.0", + Description = [[A 1:1 scale model of the Kuala Lumpur Tower. Per default it is placed + at its actual position in Kuala Lumpur, Malaysia. But the asset also includes actions + to move it to a position under the camera, or back to its original position.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/educational/scale/rose_bowl.asset b/data/assets/educational/scale/rose_bowl.asset index 97f93c86fd..67f3a660a1 100644 --- a/data/assets/educational/scale/rose_bowl.asset +++ b/data/assets/educational/scale/rose_bowl.asset @@ -41,6 +41,10 @@ local ScaleModel = { }, GUI = { Name = "Rose Bowl", + Description = [[The stadium seats over 92,000 people, with 77 rows of seats. It + measures 880 feet (268 meters) from the north rim to the south rim, and 695 feet + (212 meters) from east to west. The turfed area is 79,156 square feet (7354 + square meters).]], Path = "/Scale Objects" } } @@ -84,3 +88,15 @@ end) asset.export(ScaleModel) asset.export("UpdatePositionAction", UpdatePositionAction.Identifier) asset.export("ResetPositionAction", ResetPositionAction.Identifier) + + +asset.meta = { + Name = "Scale Model - Rose Bowl Stadium", + Version = "1.0", + Description = [[A 1:1 scale model of the Rose Bowl Stadium. Per default it is placed + at its actual position in Pasadena, California. But the asset also includes actions + to move it to a position under the camera, or back to its original position.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/educational/scale/school_bus.asset b/data/assets/educational/scale/school_bus.asset index 8147de93ff..ba9cdf20db 100644 --- a/data/assets/educational/scale/school_bus.asset +++ b/data/assets/educational/scale/school_bus.asset @@ -41,6 +41,8 @@ local ScaleModel = { }, GUI = { Name = "School bus", + Desription = [[The average length of a full size US school bus is above 35 feet + (10.7 meters).]], Path = "/Scale Objects" } } @@ -61,7 +63,7 @@ local ResetPositionAction = { Name = "Reset School bus position", Command = [[ openspace.globebrowsing.setNodePosition("Scale_SchoolBus", "]] .. earthAsset.Earth.Identifier .. [[", ]] .. Location[1] .. "," .. Location[2] .. ")", - Documentation = "Resets the school bus back to its actual location", + Documentation = "Resets the school bus back to its start location", GuiPath = "/Scale Objects", IsLocal = false } @@ -83,3 +85,14 @@ end) asset.export(ScaleModel) asset.export("UpdatePositionAction", UpdatePositionAction.Identifier) asset.export("ResetPositionAction", ResetPositionAction.Identifier) + + +asset.meta = { + Name = "Scale Model - Eiffel Tower", + Version = "1.0", + Description = [[A 1:1 scale model of a US school bus, with actions to move + it to a position under the camera, or back to its start position.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/educational/scale/scientist.asset b/data/assets/educational/scale/scientist.asset index 14d0139859..8e889ac0f0 100644 --- a/data/assets/educational/scale/scientist.asset +++ b/data/assets/educational/scale/scientist.asset @@ -41,6 +41,7 @@ local ScaleModel = { }, GUI = { Name = "Scientist", + Description = [[The average height of a human is a bit under 170 cm (5'7").]], Path = "/Scale Objects" } } @@ -84,3 +85,14 @@ end) asset.export(ScaleModel) asset.export("UpdatePositionAction", UpdatePositionAction.Identifier) asset.export("ResetPositionAction", ResetPositionAction.Identifier) + + +asset.meta = { + Name = "Scale Model - Eiffel Tower", + Version = "1.0", + Description = [[A 1:1 scale model of a human scientist, with actions to move + it to a position under the camera, or back to its start position.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/educational/scale/statue_of_liberty.asset b/data/assets/educational/scale/statue_of_liberty.asset index 076469747e..31171ac56e 100644 --- a/data/assets/educational/scale/statue_of_liberty.asset +++ b/data/assets/educational/scale/statue_of_liberty.asset @@ -41,6 +41,8 @@ local ScaleModel = { }, GUI = { Name = "Statue of Liberty", + Description = [[From ground level, the statue is 93 meters (305 feet) tall, up to the + torch.]], Path = "/Scale Objects" } } @@ -84,3 +86,16 @@ end) asset.export(ScaleModel) asset.export("UpdatePositionAction", UpdatePositionAction.Identifier) asset.export("ResetPositionAction", ResetPositionAction.Identifier) + + +asset.meta = { + Name = "Scale Model - Statue of Liberty", + Version = "1.0", + Description = [[A 1:1 scale model of the Statue of Liberty. Per default it is + placed at its actual position on Liberty Island in New York City. But the asset + also includes actions to move it to a position under the camera, or back to its + original position.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/examples/dashboarditems.asset b/data/assets/examples/dashboarditems.asset index cb6cdad74e..f6c3b14179 100644 --- a/data/assets/examples/dashboarditems.asset +++ b/data/assets/examples/dashboarditems.asset @@ -100,3 +100,15 @@ asset.export(Mission) asset.export(PropertyValue) asset.export(ElapsedTime) asset.export(InputState) + + +asset.meta = { + Name = "Dashboard Items Example", + Version = "1.0", + Description = [[Examples of different types of dashboard items. These are dynamic + information texts that will be shown over the rendering (per default in the top + left corner, on flat screens).]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/examples/debugcoordinateaxes.asset b/data/assets/examples/debugcoordinateaxes.asset index d7477a6bf7..4f5050aa29 100644 --- a/data/assets/examples/debugcoordinateaxes.asset +++ b/data/assets/examples/debugcoordinateaxes.asset @@ -19,6 +19,7 @@ local EarthBarycenterAxes = { Type = "RenderableCartesianAxes" }, GUI = { + Name = "Earth Barycenter Axes", Path = "/Other/Coordinate Systems" } } @@ -36,6 +37,7 @@ local EarthInertialAxes = { Type = "RenderableCartesianAxes" }, GUI = { + Name = "Earth Inertial Axes", Path = "/Other/Coordinate Systems" } } @@ -53,6 +55,7 @@ local EarthIAUAxes = { Type = "RenderableCartesianAxes" }, GUI = { + Name = "Earth IAU Axes", Path = "/Other/Coordinate Systems" } } @@ -70,6 +73,7 @@ local SunIAUAxes = { Type = "RenderableCartesianAxes" }, GUI = { + Name = "Sun IAU Axes", Path = "/Other/Coordinate Systems" } } @@ -87,6 +91,7 @@ local SolarSystemBarycenterAxes = { Type = "RenderableCartesianAxes" }, GUI = { + Name = "Solar System Barycenter Axes", Path = "/Other/Coordinate Systems" } } @@ -114,3 +119,15 @@ asset.export(EarthInertialAxes) asset.export(EarthIAUAxes) asset.export(SunIAUAxes) asset.export(SolarSystemBarycenterAxes) + + +asset.meta = { + Name = "Debug Coordinates", + Version = "1.0", + Description = [[A set of coordinate axes demonstrating different XYZ coordinate + reference frames that are useful for debugging, such as the Earth or Solar + System Barycenter.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/examples/discs.asset b/data/assets/examples/discs.asset index cfa461021f..b07e87af93 100644 --- a/data/assets/examples/discs.asset +++ b/data/assets/examples/discs.asset @@ -51,3 +51,13 @@ end) asset.export(BasicDisc) asset.export(FullEllipticDisc) + + +asset.meta = { + Name = "Example Discs", + Version = "1.0", + Description = [[Examples of different types of rendered discs.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/examples/globerotation.asset b/data/assets/examples/globerotation.asset index b3060b9d1d..f267be6e56 100644 --- a/data/assets/examples/globerotation.asset +++ b/data/assets/examples/globerotation.asset @@ -55,3 +55,15 @@ asset.onDeinitialize(function() end) asset.export(ExampleGlobeRotation) + + +asset.meta = { + Name = "Model Example", + Version = "1.0", + Description = [[An example that demonstrates how to load a 3D model from a geometry + file, together with some basic functionality. The model is placed on the surface + of a planet using a GlobeRotation and GlobeTranslation.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/examples/globetranslation.asset b/data/assets/examples/globetranslation.asset index 6ac330c077..ba393ed61c 100644 --- a/data/assets/examples/globetranslation.asset +++ b/data/assets/examples/globetranslation.asset @@ -72,3 +72,15 @@ end) asset.export(ExampleFixedHeight) asset.export(ExampleAdaptiveHeight) + + +asset.meta = { + Name = "GlobeTranslation Example", + Version = "1.0", + Description = [[An example that demonstrates how to place an object on a planet surface + using the "GlobeTranslation" transform. For the altitude, a fixed height can be used, + or the height can be queried from the height map]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/examples/grids.asset b/data/assets/examples/grids.asset index 95dbe754c0..4f7e699f13 100644 --- a/data/assets/examples/grids.asset +++ b/data/assets/examples/grids.asset @@ -19,6 +19,7 @@ local RadialGrid = { }, GUI = { Name = "Example Radial Grid", + Description = [[A circular 2D grid, with segments based on the radius and angle.]], Path = "/Examples/Grids" } } @@ -43,6 +44,7 @@ local PlanarGrid = { }, GUI = { Name = "Example Grid", + Description = [[A basic 2D grid, with a given size and number of segments.]], Path = "/Examples/Grids" } } @@ -63,6 +65,7 @@ local SphericalGrid = { }, GUI = { Name = "Example Spherical Grid", + Description = [[A grid in the form of a 3D sphere.]], Path = "/Examples/Grids" } } @@ -84,6 +87,7 @@ local BoxGrid = { }, GUI = { Name = "Example Box Grid", + Description = [[A grid in the form of a 3D box.]], Path = "/Examples/Grids" } } @@ -107,3 +111,13 @@ asset.export(RadialGrid) asset.export(PlanarGrid) asset.export(SphericalGrid) asset.export(BoxGrid) + + +asset.meta = { + Name = "Example Grids", + Version = "1.0", + Description = [[Examples of different types of rendered grids.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/examples/joystickproperty.asset b/data/assets/examples/joystickproperty.asset index d0afb768ae..8ed0a3a36d 100644 --- a/data/assets/examples/joystickproperty.asset +++ b/data/assets/examples/joystickproperty.asset @@ -94,3 +94,14 @@ asset.onInitialize(function() "Freeze current scale for Earth. Or release it to the trigger again." ) end) + + +asset.meta = { + Name = "Joystick example", + Version = "1.0", + Description = [[Example asset that binds a joystick to use for input and navigation. + More info on the OpenSpace wiki page.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/examples/primitives.asset b/data/assets/examples/primitives.asset index 8adf31d570..98f4aebad6 100644 --- a/data/assets/examples/primitives.asset +++ b/data/assets/examples/primitives.asset @@ -57,3 +57,14 @@ end) asset.export(Circle) asset.export(Ellipse) + + +asset.meta = { + Name = "Primitives Example", + Version = "1.0", + Description = [[Examples of different simple rendered primitives, such as circles + and ellipses.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/examples/renderableplaneimageonline.asset b/data/assets/examples/renderableplaneimageonline.asset index e6297da464..6e48992e23 100644 --- a/data/assets/examples/renderableplaneimageonline.asset +++ b/data/assets/examples/renderableplaneimageonline.asset @@ -13,6 +13,7 @@ local RenderablePlaneImageOnline = { URL = "http://data.openspaceproject.com/examples/renderableplaneimageonline.jpg" }, GUI = { + Description = "A plane that loads a texture from the internet.", Path = "/Examples" } } @@ -27,3 +28,14 @@ asset.onDeinitialize(function() end) asset.export(RenderablePlaneImageOnline) + + +asset.meta = { + Name = "RenderablePlaneImageOnline Example", + Version = "1.0", + Description = [[Example of how to create a textured plane in 3D space, where the + texture is loaded from a web URL]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/examples/screenspacebrowser.asset b/data/assets/examples/screenspacebrowser.asset index 98e2ab4bea..5a1ceec89d 100644 --- a/data/assets/examples/screenspacebrowser.asset +++ b/data/assets/examples/screenspacebrowser.asset @@ -15,3 +15,14 @@ asset.onDeinitialize(function() end) asset.export(Browser) + + +asset.meta = { + Name = "ScreenSpaceBrowser Example", + Version = "1.0", + Description = [[Example of how to load and show a webpage in the rendering. The loaded + webpage is shown in screen space.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/examples/spheres.asset b/data/assets/examples/spheres.asset index 1d3dd15195..f217370437 100644 --- a/data/assets/examples/spheres.asset +++ b/data/assets/examples/spheres.asset @@ -49,3 +49,15 @@ end) for _, n in ipairs(spheres) do asset.export(n) end + + +asset.meta = { + Name = "Spheres Example", + Version = "1.0", + Description = [[Example showing how to render textured spheres in 3D space. Some + coding logic is used to generate 9 spheres with different size and position.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} + diff --git a/data/assets/examples/statemachine.asset b/data/assets/examples/statemachine.asset index 97b48baf46..174d572311 100644 --- a/data/assets/examples/statemachine.asset +++ b/data/assets/examples/statemachine.asset @@ -71,3 +71,14 @@ asset.onInitialize(function() openspace.statemachine.createStateMachine(States, Transitions, "Earth") end) + + +asset.meta = { + Name = "State Machine", + Version = "1.0", + Description = [[Example of how to create a state machine in OpenSpace, where each + state and transition between states may trigger different behaviors.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/examples/urlsynchronization.asset b/data/assets/examples/urlsynchronization.asset index 0e74438b49..6005a176c6 100644 --- a/data/assets/examples/urlsynchronization.asset +++ b/data/assets/examples/urlsynchronization.asset @@ -31,6 +31,9 @@ asset.syncedResource({ Override = true }) +-- Load a resource without hashing, meaning that the bare directory name will be +-- used for the downloaded file. If UseHash is true, the hash of the URL is appended +-- to the directory name to produce a unique directory under all circumstances asset.syncedResource({ Name = "Example No Hash", Type = "UrlSynchronization", @@ -38,3 +41,16 @@ asset.syncedResource({ Url = "http://wms.itn.liu.se/Mercury/Messenger_Mosaic/Messenger_Mosaic.wms", UseHash = false }) + + +asset.meta = { + Name = "UrlSynchronization", + Version = "1.0", + Description = [[Example showing how to load resources (any type of data file) from + online sources, using the UrlSynchronization resource type. These can then be used + in other assets. See more information on resources on the OpenSpace wiki page. + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/examples/video/videoglobe.asset b/data/assets/examples/video/videoglobe.asset index 490c165c10..657ed5e04e 100644 --- a/data/assets/examples/video/videoglobe.asset +++ b/data/assets/examples/video/videoglobe.asset @@ -1,4 +1,4 @@ --- To learn how you can include your own video, see the wiki +-- To learn how you can include your own video, see the wiki -- http://wiki.openspaceproject.com/docs/builders/assets/resources.html local earth = asset.require("scene/solarsystem/planets/earth/earth") @@ -27,9 +27,9 @@ asset.export("layer", Layer) asset.meta = { - Name = "Video Player Test", + Name = "Video Player on Globe Example", Version = "1.0", - Description = "An example asset that shows how to include a video on Earth", + Description = "An example asset that shows how to include a video on Earth.", Author = "OpenSpace Team", URL = "https://openspaceproject.com", License = "MIT" diff --git a/data/assets/examples/video/videoplane.asset b/data/assets/examples/video/videoplane.asset index f27722ebe9..f81fda6a47 100644 --- a/data/assets/examples/video/videoplane.asset +++ b/data/assets/examples/video/videoplane.asset @@ -1,4 +1,4 @@ --- To learn how you can include your own video, see the wiki +-- To learn how you can include your own video, see the wiki -- http://wiki.openspaceproject.com/docs/builders/assets/resources.html local transforms = asset.require("scene/solarsystem/planets/earth/transforms") @@ -40,9 +40,9 @@ asset.export(Plane) asset.meta = { - Name = "Video Plane Test", + Name = "Video Plane Example", Version = "1.0", - Description = "An example asset that shows how to include a video on a plane", + Description = "An example asset that shows how to include a video on a plane.", Author = "OpenSpace Team", URL = "https://openspaceproject.com", License = "MIT" diff --git a/data/assets/examples/video/videoscreenspace.asset b/data/assets/examples/video/videoscreenspace.asset index c6982ff66e..4b52ce4a6b 100644 --- a/data/assets/examples/video/videoscreenspace.asset +++ b/data/assets/examples/video/videoscreenspace.asset @@ -1,4 +1,4 @@ --- To learn how you can include your own video, see the wiki +-- To learn how you can include your own video, see the wiki -- http://wiki.openspaceproject.com/docs/builders/assets/resources.html local ScreenSpace = { @@ -22,9 +22,9 @@ asset.export(ScreenSpace) asset.meta = { - Name = "Video ScreenSpace", + Name = "ScreenSpace Video Example", Version = "1.0", - Description = "An example asset that shows how to include a video in screen space", + Description = "An example asset that shows how to include a video in screen space.", Author = "OpenSpace Team", URL = "https://openspaceproject.com", License = "MIT" diff --git a/data/assets/examples/video/videosphere.asset b/data/assets/examples/video/videosphere.asset index d2a5df19ac..960a70c58c 100644 --- a/data/assets/examples/video/videosphere.asset +++ b/data/assets/examples/video/videosphere.asset @@ -1,4 +1,4 @@ --- To learn how you can include your own video, see the wiki +-- To learn how you can include your own video, see the wiki -- http://wiki.openspaceproject.com/docs/builders/assets/resources.html local Sphere = { @@ -30,9 +30,9 @@ asset.export(Sphere) asset.meta = { - Name = "Video Player on Sphere", + Name = "Video Player on Sphere Example", Version = "1.0", - Description = "An example asset that shows how to include a video on a sphere", + Description = "An example asset that shows how to include a video on a sphere.", Author = "OpenSpace Team", URL = "https://openspaceproject.com", License = "MIT" diff --git a/data/assets/nightsky/altaz.asset b/data/assets/nightsky/altaz.asset index 6a4d0727ad..9aea1c2449 100644 --- a/data/assets/nightsky/altaz.asset +++ b/data/assets/nightsky/altaz.asset @@ -26,7 +26,7 @@ local AltAzGridPosition = { }, GUI = { Name = "Altitude/Azimuth Grid Position", - Path = "/Other/Grids", + Path = "/Other/Night Sky", Hidden = true } } @@ -54,7 +54,11 @@ local AltAzGrid = { }, GUI = { Name = "Altitude/Azimuth Grid", - Path = "/Other/Grids" + Description = [[A local Altitude/Azimuth grid centered around your position on a + planetary surface. The grid can be toggled, hidden or shown using the accompanying + actions in the actions panel, under "Night Sky". Use these actions to move it to + another planet. The default is Earth.]], + Path = "/Other/Night Sky" } } @@ -120,3 +124,15 @@ asset.export(AltAzGrid) asset.export("ShowAltaz", ShowAltaz.Identifier) asset.export("HideAltaz", HideAltaz.Identifier) asset.export("ToggleAltaz", ToggleAltaz.Identifier) + + +asset.meta = { + Name = "Altitude/Azimuth Grid", + Version = "1.0", + Description = [[A local Altitude/Azimuth grid centered around your position on a + planetary surface. The asset also includes some actions to toggle, hide or + show the grid.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/nightsky/cardinal_directions.asset b/data/assets/nightsky/cardinal_directions.asset index 3edce459fe..c499cb0019 100644 --- a/data/assets/nightsky/cardinal_directions.asset +++ b/data/assets/nightsky/cardinal_directions.asset @@ -60,6 +60,9 @@ local CardinalDirectionSphere = { }, GUI = { Name = "Cardinal Directions", + Description = [[A textured sphere showing the cardinal directions. + The sphere is placed on the planet surface and follows the camera's movements. + ]], Path = "/Other/Night Sky" } } @@ -153,3 +156,16 @@ asset.export("ShowNeswBandSmall", ShowNeswBand.Identifier) asset.export("ShowNeswLetters", ShowNeswLetters.Identifier) asset.export("ShowNeswLettersSmall", ShowNeswLettersSmall.Identifier) asset.export("HideNesw", HideNesw.Identifier) + + +asset.meta = { + Name = "Cardinal Directions", + Version = "1.0", + Description = [[Adds a sphere showing the cardinal directions, that follows the camera + around when navigating on the planet surface. It also includes actions to change the + texture of the sphere to different styles. + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/nightsky/ecliptic_band.asset b/data/assets/nightsky/ecliptic_band.asset index 90a89193cd..d46b6c2e0d 100644 --- a/data/assets/nightsky/ecliptic_band.asset +++ b/data/assets/nightsky/ecliptic_band.asset @@ -40,6 +40,7 @@ local EclipticLine = { }, GUI = { Name = "Ecliptic Line", + Description = "A line representation of the Ecliptic plane.", Path = "/Other/Lines" } } @@ -65,6 +66,7 @@ local EclipticBand = { }, GUI = { Name = "Ecliptic Band", + Description = "A band representation of the Ecliptic plane.", Path = "/Other/Lines" } } @@ -158,3 +160,14 @@ asset.export("ToggleEclipticLine", ToggleEclipticLine.Identifier) asset.export("ShowEclipticBand", ShowEclipticBand.Identifier) asset.export("HideEclipticBand", HideEclipticBand.Identifier) asset.export("ToggleEclipticBand", ToggleEclipticBand.Identifier) + + +asset.meta = { + Name = "Ecliptic Band/Line", + Version = "1.0", + Description = [[A line and band representation of the Ecliptic plane, including actions + to toggle, hide and show each of them.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/nightsky/equatorial_band.asset b/data/assets/nightsky/equatorial_band.asset index 5b049121c4..8a71079761 100644 --- a/data/assets/nightsky/equatorial_band.asset +++ b/data/assets/nightsky/equatorial_band.asset @@ -33,6 +33,7 @@ local EquatorialLine = { }, GUI = { Name = "Equatorial Line", + Description = "A line representation of the Equatorial plane.", Path = "/Other/Lines" } } @@ -87,3 +88,14 @@ asset.export(EquatorialLine) asset.export("ShowEquatorialLine", ShowEquatorialLine.Identifier) asset.export("HideEquatorialLine", HideEquatorialLine.Identifier) asset.export("ToggleEquatorialLine", ToggleEquatorialLine.Identifier) + + +asset.meta = { + Name = "Equatorial Line", + Version = "1.0", + Description = [[A line representation of the Equatorial plane, including actions + to toggle, hide and show it.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/nightsky/galactic_band.asset b/data/assets/nightsky/galactic_band.asset index 94724286a9..fbe3615454 100644 --- a/data/assets/nightsky/galactic_band.asset +++ b/data/assets/nightsky/galactic_band.asset @@ -22,6 +22,7 @@ local GalacticBand = { }, GUI = { Name = "Galactic Equator Line", + Description = "A line representation of the Galactic Equator plane.", Path = "/Other/Lines" } } @@ -73,3 +74,15 @@ end) asset.export(GalacticBand) asset.export("ShowGalacticBand", ShowGalacticBand.Identifier) asset.export("HideGalacticBand", HideGalacticBand.Identifier) + + +asset.meta = { + Name = "Galactic Line", + Version = "1.0", + Description = [[A line representation of the Galactic Equator plane, including actions + to toggle, hide and show it.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} + diff --git a/data/assets/nightsky/light_pollution.asset b/data/assets/nightsky/light_pollution.asset index d2b6eace04..806a75fbee 100644 --- a/data/assets/nightsky/light_pollution.asset +++ b/data/assets/nightsky/light_pollution.asset @@ -48,6 +48,9 @@ local LightPollutionSphere = { }, GUI = { Name = "Light Pollution Sphere", + Description = [[A sphere used to simulate the effect of light pollution on + the night sky. Different pollution levels can be set using the provided actions. + These alter the opacity of the sphere.]], Path = "/Other/Night Sky", Hidden = false } @@ -250,3 +253,15 @@ asset.export("SetLightPollutionLevel7", SetLightPollutionLevel7.Identifier) asset.export("SetLightPollutionLevel8", SetLightPollutionLevel8.Identifier) asset.export("SetLightPollutionLevel9", SetLightPollutionLevel9.Identifier) asset.export("UndoLightPollution", UndoLightPollution.Identifier) + + +asset.meta = { + Name = "Light Pollution", + Version = "1.0", + Description = [[Includes a sphere used to simulate the effect of light pollution on + the night sky, and actions to set the desired level of pollution (with a scale + from 1-9).]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/nightsky/meridian.asset b/data/assets/nightsky/meridian.asset index 9497c47c12..0c3e3c31eb 100644 --- a/data/assets/nightsky/meridian.asset +++ b/data/assets/nightsky/meridian.asset @@ -50,6 +50,7 @@ local MeridianPlane = { }, GUI = { Name = "Local Meridian", + Description = [[A line representation of the Local Meridian]], Path = "/Other/Lines" } } @@ -118,3 +119,14 @@ asset.export(MeridianPlane) asset.export("ShowMeridian", ShowMeridian.Identifier) asset.export("HideMeridian", HideMeridian.Identifier) asset.export("ToggleMeridian", ToggleMeridian.Identifier) + + +asset.meta = { + Name = "Meridian", + Version = "1.0", + Description = [[A line representation of the Local Meridian, including actions + to toggle, hide and show it.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/nightsky/nightsky.asset b/data/assets/nightsky/nightsky.asset index 57cc9e2dd0..2bca47efa6 100644 --- a/data/assets/nightsky/nightsky.asset +++ b/data/assets/nightsky/nightsky.asset @@ -9,3 +9,13 @@ asset.require("./zenith", false) asset.require("./planets", false) asset.require("actions/nightsky/camera", false) asset.require("actions/nightsky/daytime", false) + + +asset.meta = { + Name = "Night Sky Assets", + Version = "1.0", + Description = [[A collection of assets useful for studying the night sky.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/nightsky/planets.asset b/data/assets/nightsky/planets.asset index f5855cf4a7..33d3ba205a 100644 --- a/data/assets/nightsky/planets.asset +++ b/data/assets/nightsky/planets.asset @@ -30,6 +30,8 @@ local Mercury = { Tag = { "nightsky_billboard" }, GUI = { Name = "Night Sky Mercury", + Description = [[A night sky version of the planet Mercury, making it visible as + a bright object on the sky (textured representation).]], Path = "/Other/Night Sky/Planets" } } @@ -50,6 +52,8 @@ local Venus = { Tag = { "nightsky_billboard" }, GUI = { Name = "Night Sky Venus", + Description = [[A night sky version of the planet Venus, making it visible as + a bright object on the sky (textured representation).]], Path = "/Other/Night Sky/Planets" } } @@ -90,6 +94,8 @@ local Jupiter = { Tag = { "nightsky_billboard" }, GUI = { Name = "Night Sky Jupiter", + Description = [[A night sky version of the planet Jupiter, making it visible as + a bright object on the sky (textured representation).]], Path = "/Other/Night Sky/Planets" } } @@ -110,6 +116,8 @@ local Saturn = { Tag = { "nightsky_billboard" }, GUI = { Name = "Night Sky Saturn", + Description = [[A night sky version of the planet Saturn, making it visible as + a bright object on the sky (textured representation).]], Path = "/Other/Night Sky/Planets" } } @@ -198,3 +206,14 @@ asset.export(Saturn) asset.export("ShowNightSkyPlanets", ShowNightSkyPlanets.Identifier) asset.export("HideNightSkyPlanets", HideNightSkyPlanets.Identifier) asset.export("ToggleNightSkyPlanets", ToggleNightSkyPlanets.Identifier) + + +asset.meta = { + Name = "Night Sky Planets", + Version = "1.0", + Description = [[A collection of night sky versions of the planets Mercury, Venus, + Mars, Jupiter and Saturn, including actions to toggle, hide and show them.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/nightsky/zenith.asset b/data/assets/nightsky/zenith.asset index 0170bcc5ec..0819e27ea5 100644 --- a/data/assets/nightsky/zenith.asset +++ b/data/assets/nightsky/zenith.asset @@ -58,6 +58,9 @@ local ZenithDot = { }, GUI = { Name = "Zenith", + Description = [[A dot representation of the Local Zenith, based on the camera's + current position on a planet. Use the provided show or toggle action to move it + between planets. The default is Earth.]], Path = "/Other/Points" } } @@ -124,3 +127,14 @@ asset.export(ZenithDot) asset.export("ShowZenith", ShowZenith.Identifier) asset.export("HideZenith", HideZenith.Identifier) asset.export("ToggleZenith", ToggleZenith.Identifier) + + +asset.meta = { + Name = "Zenith", + Version = "1.0", + Description = [[A dot representation of the Local Zenith (based on the current + camera positon), including actions to toggle, hide and show it.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} From 31b04c1412c946d9e004bfe6189664f2c00fa7b4 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Fri, 18 Aug 2023 16:40:59 +0200 Subject: [PATCH 107/701] Update GUI hash --- data/assets/util/webgui.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/util/webgui.asset b/data/assets/util/webgui.asset index cdaaa51adb..3e67f8f319 100644 --- a/data/assets/util/webgui.asset +++ b/data/assets/util/webgui.asset @@ -4,7 +4,7 @@ local guiCustomization = asset.require("customization/gui") -- Select which commit hashes to use for the frontend and backend -local frontendHash = "1379c57e0876473573a67a381214a53fda53e516" +local frontendHash = "f28b121318e266bd546c7c9f6bdf5a790e66c742" local frontend = asset.syncedResource({ Identifier = "WebGuiFrontend", From c18ab499653c6b8dfa3b265bc6c40acd2eb17386 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 21 Aug 2023 13:26:26 +0200 Subject: [PATCH 108/701] Sort additional scripts by row-order, not selection-order (closes #2862) --- .../ext/launcher/src/profile/scriptlogdialog.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/OpenSpace/ext/launcher/src/profile/scriptlogdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/scriptlogdialog.cpp index 80524b5b18..d78e105118 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/scriptlogdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/scriptlogdialog.cpp @@ -167,7 +167,18 @@ void ScriptlogDialog::updateScriptList() { void ScriptlogDialog::saveChosenScripts() { std::vector chosenScripts; QList itemList = _scriptlogList->selectedItems(); - for (QListWidgetItem* item : _scriptlogList->selectedItems()) { + + // The selected items are returned in order of **selection** not in row-order, so we + // need to sort them first + std::sort( + itemList.begin(), + itemList.end(), + [this](QListWidgetItem* lhs, QListWidgetItem* rhs) { + return _scriptlogList->row(lhs) < _scriptlogList->row(rhs); + } + ); + + for (QListWidgetItem* item : itemList) { chosenScripts.push_back(item->text().toStdString()); } emit scriptsSelected(chosenScripts); From d13dd78838c967f5685d0a1c674d009b1530fcaa Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 21 Aug 2023 13:36:37 +0200 Subject: [PATCH 109/701] Nuking the cache folder when an inconsistent state in the cache is detected, rather than crashing (closes #2850) --- ext/ghoul | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/ghoul b/ext/ghoul index b8685a2fe0..24486b7c56 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit b8685a2fe0c00516eb28183658974e9601b3edd0 +Subproject commit 24486b7c5645f41a3b13f39dbe9ae58a98abbdc9 From 3efd5407cb10dd2824806ee2a4af96221142aca4 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Tue, 22 Aug 2023 15:22:39 +0200 Subject: [PATCH 110/701] Fix crash when flying to NS with nonexisting anchor, and actually print error from path creation --- src/navigation/path.cpp | 8 ++++++++ src/navigation/pathnavigator.cpp | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/navigation/path.cpp b/src/navigation/path.cpp index 0d741bbf89..d6cd9b1a04 100644 --- a/src/navigation/path.cpp +++ b/src/navigation/path.cpp @@ -517,6 +517,14 @@ Path createPathFromDictionary(const ghoul::Dictionary& dictionary, const NavigationState navigationState = NavigationState(p.navigationState.value()); + const SceneGraphNode* targetNode = sceneGraphNode(navigationState.anchor); + if (!targetNode) { + throw ghoul::RuntimeError(fmt::format( + "Could not find anchor node '{}' in provided navigation state", + navigationState.anchor + )); + } + waypoints = { Waypoint(navigationState) }; break; } diff --git a/src/navigation/pathnavigator.cpp b/src/navigation/pathnavigator.cpp index f61478fcb5..49f4732272 100644 --- a/src/navigation/pathnavigator.cpp +++ b/src/navigation/pathnavigator.cpp @@ -290,7 +290,7 @@ void PathNavigator::createPath(const ghoul::Dictionary& dictionary) { // Do nothing } catch (const ghoul::RuntimeError& e) { - LERROR(fmt::format("Could not create path. Reason: ", e.message)); + LERROR(fmt::format("Could not create path. Reason: {}", e.message)); return; } From 08d5662c17d2a44cda0ad8e606dfac8ac16fea2b Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Tue, 22 Aug 2023 15:43:26 +0200 Subject: [PATCH 111/701] Update faulty tags for Charon and update some other pluto moon tags for consistency --- .../solarsystem/dwarf_planets/pluto/charon/charon.asset | 2 +- .../dwarf_planets/pluto/charon/charon_trail.asset | 3 ++- .../scene/solarsystem/dwarf_planets/pluto/minor/hydra.asset | 5 +++-- .../solarsystem/dwarf_planets/pluto/minor/kerberos.asset | 5 +++-- .../scene/solarsystem/dwarf_planets/pluto/minor/nix.asset | 5 +++-- .../scene/solarsystem/dwarf_planets/pluto/minor/styx.asset | 2 +- 6 files changed, 13 insertions(+), 9 deletions(-) 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 368e950a3b..5b774f1bd9 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/charon/charon.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/charon/charon.asset @@ -44,7 +44,7 @@ local Charon = { Color = { 1.0, 1.0, 0.0 } } }, - Tag = { "planet_solarSystem", "planet_terrestrial" }, + Tag = { "moon_solarSystem", "moon_dwarf", "moon_pluto", "moon_major", "moon_major_pluto" }, GUI = { Path = "/Solar System/Dwarf Planets/Pluto/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 377b3bd797..d24adb6466 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 @@ -21,7 +21,8 @@ local CharonBarycentricTrail = { "moonTrail_solarSystem", "moonTrail_dwarf", "moonTrail_pluto", - "moonTrail_minor" + "moonTrail_major", + "moonTrail_major_pluto" }, GUI = { Name = "Charon Barycentric Trail", 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 aa11471028..8dfa6a0743 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/hydra.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/hydra.asset @@ -19,7 +19,7 @@ local Hydra = { SegmentsPerPatch = 64, Layers = {} }, - Tag = { "moon_solarSystem", "moon_dwarf", "moon_pluto", "moon_minor" }, + Tag = { "moon_solarSystem", "moon_dwarf", "moon_pluto", "moon_minor", "moon_minor_pluto" }, GUI = { Path = "/Solar System/Dwarf Planets/Pluto/Moons/Hydra" } @@ -43,7 +43,8 @@ local HydraTrail = { "moonTrail_solarSystem", "moonTrail_dwarf", "moonTrail_pluto", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_pluto" }, GUI = { Name = "Hydra Trail", 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 fe4683585f..9594d8dfc4 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/kerberos.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/kerberos.asset @@ -18,7 +18,7 @@ local Kerberos = { SegmentsPerPatch = 64, Layers = {} }, - Tag = { "moon_solarSystem", "moon_dwarf", "moon_pluto", "moon_minor" }, + Tag = { "moon_solarSystem", "moon_dwarf", "moon_pluto", "moon_minor", "moon_minor_pluto" }, GUI = { Path = "/Solar System/Dwarf Planets/Pluto/Moons/Kerberos" } @@ -42,7 +42,8 @@ local KerberosTrail = { "moonTrail_solarSystem", "moonTrail_dwarf", "moonTrail_pluto", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_pluto" }, GUI = { Name = "Kerberos Trail", 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 85728475ec..8c1dbea469 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/nix.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/nix.asset @@ -18,7 +18,7 @@ local Nix = { SegmentsPerPatch = 64, Layers = {} }, - Tag = { "moon_solarSystem", "moon_dwarf", "moon_pluto", "moon_minor" }, + Tag = { "moon_solarSystem", "moon_dwarf", "moon_pluto", "moon_minor", "moon_minor_pluto" }, GUI = { Path = "/Solar System/Dwarf Planets/Pluto/Moons/Nix" } @@ -42,7 +42,8 @@ local NixTrail = { "moonTrail_solarSystem", "moonTrail_dwarf", "moonTrail_pluto", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_pluto" }, GUI = { Name = "Nix Trail", 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 76d28680d1..89c64aa3bb 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,7 @@ local Styx = { SegmentsPerPatch = 64, Layers = {} }, - Tag = { "moon_solarSystem", "moon_dwarf", "moon_pluto", "moon_minor" }, + Tag = { "moon_solarSystem", "moon_dwarf", "moon_pluto", "moon_minor", "moon_minor_pluto" }, GUI = { Path = "/Solar System/Dwarf Planets/Pluto/Moons/Styx" } From caa9492c42ffa8d7b326a257e9ea32ab369016b0 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Tue, 22 Aug 2023 16:58:39 +0200 Subject: [PATCH 112/701] Update GUI hash --- data/assets/util/webgui.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/util/webgui.asset b/data/assets/util/webgui.asset index 3e67f8f319..998debfe36 100644 --- a/data/assets/util/webgui.asset +++ b/data/assets/util/webgui.asset @@ -4,7 +4,7 @@ local guiCustomization = asset.require("customization/gui") -- Select which commit hashes to use for the frontend and backend -local frontendHash = "f28b121318e266bd546c7c9f6bdf5a790e66c742" +local frontendHash = "7ed2de3b136b4712454c944a3838c2171c26605a" local frontend = asset.syncedResource({ Identifier = "WebGuiFrontend", From baf0974c5681efca9199c916dff4dc623bc39fed Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Tue, 22 Aug 2023 18:07:32 +0200 Subject: [PATCH 113/701] Increase default value for linear rotation speed (closes #2584) --- src/navigation/pathnavigator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/navigation/pathnavigator.cpp b/src/navigation/pathnavigator.cpp index 49f4732272..f2c5418192 100644 --- a/src/navigation/pathnavigator.cpp +++ b/src/navigation/pathnavigator.cpp @@ -137,7 +137,7 @@ PathNavigator::PathNavigator() , _speedScale(SpeedScaleInfo, 1.f, 0.01f, 2.f) , _applyIdleBehaviorOnFinish(IdleBehaviorOnFinishInfo, false) , _arrivalDistanceFactor(ArrivalDistanceFactorInfo, 2.0, 0.1, 20.0) - , _linearRotationSpeedFactor(RotationSpeedFactorInfo, 1.5f, 0.1f, 3.f) + , _linearRotationSpeedFactor(RotationSpeedFactorInfo, 2.f, 0.1f, 3.f) , _minValidBoundingSphere(MinBoundingSphereInfo, 10.0, 1.0, 3e10) , _relevantNodeTags(RelevantNodeTagsInfo) { From 2d9932e3238caee48e0a4786faa90de92fc9bee9 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Wed, 23 Aug 2023 08:47:59 +0200 Subject: [PATCH 114/701] Add tag to another pluto moon File was apparently not saved or included in the last commit.. --- .../scene/solarsystem/dwarf_planets/pluto/minor/styx.asset | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 89c64aa3bb..3385785481 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/styx.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/styx.asset @@ -41,7 +41,8 @@ local StyxTrail = { "moonTrail_solarSystem", "moonTrail_dwarf", "moonTrail_pluto", - "moonTrail_minor" + "moonTrail_minor", + "moonTrail_minor_pluto" }, GUI = { Name = "Styx Trail", From 31a47d2a06c3d6dcd4bc19b4d6ef81c4c7235fda Mon Sep 17 00:00:00 2001 From: Gene Payne Date: Fri, 25 Aug 2023 16:46:55 -0600 Subject: [PATCH 115/701] Added reference to meta in base sgct schema --- config/schema/sgcteditor.schema.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/schema/sgcteditor.schema.json b/config/schema/sgcteditor.schema.json index 7f0b2276d4..b8b0eb3672 100644 --- a/config/schema/sgcteditor.schema.json +++ b/config/schema/sgcteditor.schema.json @@ -313,6 +313,9 @@ "minor": { "type": "integer" } }, "required": [ "name", "major", "minor" ] + }, + "meta": { + "$ref": "sgct.schema.json#/$defs/meta" } }, "additionalProperties": false, From bd35397e9e4374534de68d28865caddd8beee98c Mon Sep 17 00:00:00 2001 From: Gene Payne Date: Fri, 25 Aug 2023 16:49:20 -0600 Subject: [PATCH 116/701] Bump sgct submodule rev to get meta fix in base sgct schema --- apps/OpenSpace/ext/sgct | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index d643b8bf2a..ca7a076139 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit d643b8bf2a456006f16c3623ff00d6ce572dff51 +Subproject commit ca7a076139b9b2a915b18bc6e8091bae2cbf186b From f591938f013768f44c0ca8b1be076e4a28bd9424 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Tue, 29 Aug 2023 09:12:02 +0200 Subject: [PATCH 117/701] Add options to disable roll and zoom in OrbitalNavigator (#2866) --- .../openspace/navigation/orbitalnavigator.h | 3 + src/navigation/orbitalnavigator.cpp | 88 +++++++++++++++---- 2 files changed, 76 insertions(+), 15 deletions(-) diff --git a/include/openspace/navigation/orbitalnavigator.h b/include/openspace/navigation/orbitalnavigator.h index b269eb79a9..cd88bfaa46 100644 --- a/include/openspace/navigation/orbitalnavigator.h +++ b/include/openspace/navigation/orbitalnavigator.h @@ -214,6 +214,9 @@ private: LimitZoom _limitZoom; + properties::BoolProperty _disableZoom; + properties::BoolProperty _disableRoll; + properties::FloatProperty _mouseSensitivity; properties::FloatProperty _joystickSensitivity; properties::FloatProperty _websocketSensitivity; diff --git a/src/navigation/orbitalnavigator.cpp b/src/navigation/orbitalnavigator.cpp index 992dce2a0e..3cc92030e2 100644 --- a/src/navigation/orbitalnavigator.cpp +++ b/src/navigation/orbitalnavigator.cpp @@ -374,6 +374,25 @@ namespace { // @VISIBILITY(?) openspace::properties::Property::Visibility::AdvancedUser }; + + constexpr openspace::properties::Property::PropertyInfo DisableZoomInfo = { + "DisableZoom", + "Disable Zoom", + "When set to true, disables all vertical navigation based on input. This means " + "that the camera cannot be moved closer to or further away from the current " + "anchor node", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo DisableRollInfo = { + "DisableRoll", + "Disable Roll", + "When set to true, disables all rolling camera motions based on input. This " + "means that the camera cannot be rotated to change the perceived up-direction " + "of the current anchor node, or rotate the horizon on a planet, for example", + openspace::properties::Property::Visibility::AdvancedUser + }; + } // namespace namespace openspace::interaction { @@ -477,6 +496,8 @@ OrbitalNavigator::OrbitalNavigator() , _mouseStates(_mouseSensitivity * 0.0001, 1 / (_friction.friction + 0.0000001)) , _joystickStates(_joystickSensitivity * 0.1, 1 / (_friction.friction + 0.0000001)) , _websocketStates(_websocketSensitivity, 1 / (_friction.friction + 0.0000001)) + , _disableZoom(DisableZoomInfo, false) + , _disableRoll(DisableRollInfo, false) { _anchor.onChange([this]() { if (_anchor.value().empty()) { @@ -644,14 +665,39 @@ OrbitalNavigator::OrbitalNavigator() _followRotationInterpolator.setInterpolationTime(_followRotationInterpolationTime); addProperty(_followRotationInterpolationTime); - _invertMouseButtons.onChange( - [this]() { _mouseStates.setInvertMouseButton(_invertMouseButtons); } - ); + _invertMouseButtons.onChange([this]() { + _mouseStates.setInvertMouseButton(_invertMouseButtons); + }); addProperty(_invertMouseButtons); addProperty(_mouseSensitivity); addProperty(_joystickSensitivity); addProperty(_websocketSensitivity); + + addProperty(_disableZoom); + _disableZoom.onChange([this]() { + if (_disableZoom) { + LWARNING( + "Zooming has been disabled. No vertical camera motion based on " + "input will occur until re-enabled. See setting in Orbital Navigator" + ); + } + else { + LINFO("Zooming has been enabled"); + } + }); + addProperty(_disableRoll); + _disableRoll.onChange([this]() { + if (_disableRoll) { + LWARNING( + "Camera roll has been disabled. No rolling camera motion based on " + "input will occur until re-enabled. See setting in Orbital Navigator" + ); + } + else { + LINFO("Camera roll has been enabled"); + } + }); } glm::dvec3 OrbitalNavigator::anchorNodeToCameraVector() const { @@ -811,7 +857,10 @@ void OrbitalNavigator::updateCameraStateFromStates(double deltaTime) { ); // Update local rotation based on user input - camRot.localRotation = roll(deltaTime, camRot.localRotation); + if (!_disableRoll) { + camRot.localRotation = roll(deltaTime, camRot.localRotation); + } + camRot.localRotation = interpolateLocalRotation(deltaTime, camRot.localRotation); camRot.localRotation = rotateLocally(deltaTime, camRot.localRotation); @@ -853,20 +902,29 @@ void OrbitalNavigator::updateCameraStateFromStates(double deltaTime) { ); // Rotate around the surface out direction based on user input - camRot.globalRotation = rotateHorizontally( - deltaTime, - camRot.globalRotation, - posHandle - ); + if (!_disableRoll) { + camRot.globalRotation = rotateHorizontally( + deltaTime, + camRot.globalRotation, + posHandle + ); + } // Perform the vertical movements based on user input - pose.position = translateVertically(deltaTime, pose.position, anchorPos, posHandle); + if (!_disableZoom) { + pose.position = translateVertically( + deltaTime, + pose.position, + anchorPos, + posHandle + ); - pose.position = pushToSurface( - pose.position, - anchorPos, - posHandle - ); + pose.position = pushToSurface( + pose.position, + anchorPos, + posHandle + ); + } pose.rotation = composeCameraRotation(camRot); From 0bf22efe720215056e514e2cf96cb35fd4aa04de Mon Sep 17 00:00:00 2001 From: GPayne Date: Wed, 30 Aug 2023 20:30:20 -0600 Subject: [PATCH 118/701] Reference latest commit in sgct submodule master --- apps/OpenSpace/ext/sgct | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index ca7a076139..654a594e2d 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit ca7a076139b9b2a915b18bc6e8091bae2cbf186b +Subproject commit 654a594e2d6e8f8784b1f73b02ae96ff33be0848 From 455ee9335afa4b1c800dd6b96a01c1793282a466 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 31 Aug 2023 18:19:37 +0200 Subject: [PATCH 119/701] Add a proper blackout to the ScreenSpaceRenderables and a property and codegen option to toggle that behavior (#2868) --- .../rendering/screenspacerenderable.h | 7 ++-- .../base/rendering/screenspaceframebuffer.cpp | 4 +-- .../base/rendering/screenspaceframebuffer.h | 2 +- modules/base/shaders/screenspace_fs.glsl | 3 +- .../include/screenspaceskybrowser.h | 2 +- .../skybrowser/src/screenspaceskybrowser.cpp | 14 ++++---- modules/video/include/screenspacevideo.h | 2 +- modules/video/src/screenspacevideo.cpp | 4 +-- .../webbrowser/include/screenspacebrowser.h | 2 +- modules/webbrowser/src/screenspacebrowser.cpp | 8 ++--- src/rendering/renderengine.cpp | 4 +-- src/rendering/screenspacerenderable.cpp | 36 ++++++++++++++----- 12 files changed, 55 insertions(+), 33 deletions(-) diff --git a/include/openspace/rendering/screenspacerenderable.h b/include/openspace/rendering/screenspacerenderable.h index 6ef0225c8a..0d832a7b68 100644 --- a/include/openspace/rendering/screenspacerenderable.h +++ b/include/openspace/rendering/screenspacerenderable.h @@ -61,7 +61,7 @@ public: ScreenSpaceRenderable(const ghoul::Dictionary& dictionary); virtual ~ScreenSpaceRenderable() override; - virtual void render(); + virtual void render(float blackoutFactor); virtual bool initialize(); virtual bool initializeGL(); @@ -102,7 +102,7 @@ protected: glm::vec3 raeToCartesian(const glm::vec3& rae) const; glm::vec3 cartesianToRae(const glm::vec3& cartesian) const; - void draw(glm::mat4 modelTransform); + void draw(glm::mat4 modelTransform, float blackoutFactor); virtual void bindTexture() = 0; virtual void unbindTexture(); @@ -114,6 +114,7 @@ protected: glm::vec3 sanitizeSphericalCoordinates(glm::vec3 spherical) const; properties::BoolProperty _enabled; + properties::BoolProperty _renderDuringBlackout; properties::BoolProperty _usePerspectiveProjection; properties::BoolProperty _useRadiusAzimuthElevation; properties::BoolProperty _faceCamera; @@ -140,7 +141,7 @@ protected: properties::TriggerProperty _delete; glm::ivec2 _objectSize = glm::ivec2(0); - UniformCache(color, opacity, mvp, texture, backgroundColor, gamma, + UniformCache(color, opacity, blackoutFactor, mvp, texture, backgroundColor, gamma, borderColor, borderWidth) _uniformCache; std::unique_ptr _shader; }; diff --git a/modules/base/rendering/screenspaceframebuffer.cpp b/modules/base/rendering/screenspaceframebuffer.cpp index b6cf74bf62..5da3fffb18 100644 --- a/modules/base/rendering/screenspaceframebuffer.cpp +++ b/modules/base/rendering/screenspaceframebuffer.cpp @@ -105,7 +105,7 @@ bool ScreenSpaceFramebuffer::deinitializeGL() { return true; } -void ScreenSpaceFramebuffer::render() { +void ScreenSpaceFramebuffer::render(float blackoutFactor) { const glm::vec2& resolution = global::windowDelegate->currentDrawBufferResolution(); const glm::vec4& size = _size.value(); @@ -145,7 +145,7 @@ void ScreenSpaceFramebuffer::render() { glm::vec3((1.f / xratio), (1.f / yratio), 1.f) ); const glm::mat4 modelTransform = globalRotation*translation*localRotation*scale; - draw(modelTransform); + draw(modelTransform, blackoutFactor); } } diff --git a/modules/base/rendering/screenspaceframebuffer.h b/modules/base/rendering/screenspaceframebuffer.h index ad9d2d15d8..96ad201faf 100644 --- a/modules/base/rendering/screenspaceframebuffer.h +++ b/modules/base/rendering/screenspaceframebuffer.h @@ -55,7 +55,7 @@ public: bool initializeGL() override; bool deinitializeGL() override; - void render() override; + void render(float blackoutFactor) override; bool isReady() const override; void setSize(glm::vec4 size); diff --git a/modules/base/shaders/screenspace_fs.glsl b/modules/base/shaders/screenspace_fs.glsl index 1ff3f0fe9c..0124d1c5d0 100644 --- a/modules/base/shaders/screenspace_fs.glsl +++ b/modules/base/shaders/screenspace_fs.glsl @@ -31,6 +31,7 @@ in float vs_depth; uniform sampler2D tex; uniform vec3 color = vec3(1.0); uniform float opacity = 1.0; +uniform float blackoutFactor = 1.0; uniform vec4 backgroundColor = vec4(0.0); uniform float gamma = 1.0; uniform vec2 borderWidth = vec2(0.1); @@ -56,6 +57,6 @@ Fragment getFragment() { } frag.depth = vs_depth; - frag.color.rgb = pow(frag.color.rgb, vec3(1.0/(gamma))); + frag.color.rgb = pow(frag.color.rgb, vec3(1.0/(gamma))) * blackoutFactor; return frag; } diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index 13d41db2a8..de47a0355a 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -43,7 +43,7 @@ public: bool initializeGL() override; bool deinitializeGL() override; glm::mat4 scaleMatrix() override; - void render() override; + void render(float blackoutFactor) override; void update() override; float opacity() const noexcept override; diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index f66c17fb45..29566eff1b 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -314,16 +314,16 @@ bool ScreenSpaceSkyBrowser::deinitializeGL() { return true; } -void ScreenSpaceSkyBrowser::render() { +void ScreenSpaceSkyBrowser::render(float blackoutFactor) { WwtCommunicator::render(); if (!_isHidden) { - draw( + glm::mat4 mat = globalRotationMatrix() * translationMatrix() * localRotationMatrix() * - scaleMatrix() - ); + scaleMatrix(); + draw(mat, blackoutFactor); } // Render the display copies @@ -342,12 +342,12 @@ void ScreenSpaceSkyBrowser::render() { )); } - draw( + glm::mat4 mat = globalRotationMatrix() * glm::translate(glm::mat4(1.f), coordinates) * localRotation * - scaleMatrix() - ); + scaleMatrix(); + draw(mat, blackoutFactor); } } } diff --git a/modules/video/include/screenspacevideo.h b/modules/video/include/screenspacevideo.h index a864567aa7..723a572093 100644 --- a/modules/video/include/screenspacevideo.h +++ b/modules/video/include/screenspacevideo.h @@ -43,7 +43,7 @@ public: bool initializeGL() override; bool deinitializeGL() override; void update() override; - void render() override; + void render(float blackoutFactor) override; static documentation::Documentation Documentation(); diff --git a/modules/video/src/screenspacevideo.cpp b/modules/video/src/screenspacevideo.cpp index a7b59e94ea..01a71b406d 100644 --- a/modules/video/src/screenspacevideo.cpp +++ b/modules/video/src/screenspacevideo.cpp @@ -79,9 +79,9 @@ void ScreenSpaceVideo::update() { } } -void ScreenSpaceVideo::render() { +void ScreenSpaceVideo::render(float blackoutFactor) { if (_videoPlayer.isInitialized()) { - ScreenSpaceRenderable::render(); + ScreenSpaceRenderable::render(blackoutFactor); } } diff --git a/modules/webbrowser/include/screenspacebrowser.h b/modules/webbrowser/include/screenspacebrowser.h index cf765cbd09..cafb114dc4 100644 --- a/modules/webbrowser/include/screenspacebrowser.h +++ b/modules/webbrowser/include/screenspacebrowser.h @@ -68,7 +68,7 @@ public: bool initializeGL() override; bool deinitializeGL() override; - void render() override; + void render(float blackoutFactor) override; void update() override; bool isReady() const override; diff --git a/modules/webbrowser/src/screenspacebrowser.cpp b/modules/webbrowser/src/screenspacebrowser.cpp index b3c18a9bc3..cf7d45fc78 100644 --- a/modules/webbrowser/src/screenspacebrowser.cpp +++ b/modules/webbrowser/src/screenspacebrowser.cpp @@ -152,18 +152,18 @@ bool ScreenSpaceBrowser::deinitializeGL() { return ScreenSpaceRenderable::deinitializeGL(); } -void ScreenSpaceBrowser::render() { +void ScreenSpaceBrowser::render(float blackoutFactor) { if (!_renderHandler->isTextureReady()) { return; } _renderHandler->updateTexture(); - draw( + glm::mat4 mat = globalRotationMatrix() * translationMatrix() * localRotationMatrix() * - scaleMatrix() - ); + scaleMatrix(); + draw(mat, blackoutFactor); } void ScreenSpaceBrowser::update() { diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index f88a18352f..7adc3ddbc4 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -728,7 +728,7 @@ void RenderEngine::render(const glm::mat4& sceneMatrix, const glm::mat4& viewMat RenderFont(*_fontFrameInfo, penPosition, res); } - if (renderingEnabled && !delegate.isGuiWindow() && _globalBlackOutFactor > 0.f) { + if (renderingEnabled && !delegate.isGuiWindow()) { ZoneScopedN("Render Screenspace Renderable"); std::vector ssrs; @@ -755,7 +755,7 @@ void RenderEngine::render(const glm::mat4& sceneMatrix, const glm::mat4& viewMat glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); for (ScreenSpaceRenderable* ssr : ssrs) { - ssr->render(); + ssr->render(_globalBlackOutFactor); } glDisable(GL_BLEND); } diff --git a/src/rendering/screenspacerenderable.cpp b/src/rendering/screenspacerenderable.cpp index 8f39aad7f0..f3535aec34 100644 --- a/src/rendering/screenspacerenderable.cpp +++ b/src/rendering/screenspacerenderable.cpp @@ -43,9 +43,9 @@ #include namespace { - constexpr std::array UniformNames = { - "color", "opacity", "mvpMatrix", "tex", "backgroundColor", "gamma", "borderColor", - "borderWidth" + constexpr std::array UniformNames = { + "color", "opacity", "blackoutFactor", "mvpMatrix", "tex", "backgroundColor", + "gamma", "borderColor", "borderWidth" }; constexpr openspace::properties::Property::PropertyInfo EnabledInfo = { @@ -55,6 +55,16 @@ namespace { openspace::properties::Property::Visibility::AdvancedUser }; + constexpr openspace::properties::Property::PropertyInfo RenderDuringBlackoutInfo = { + "RenderDuringBlackout", + "Render during Blackout", + "If this value is 'true', this screenspace renderable is going to ignore the " + "global blackout factor from the Render Engine and will always render at full " + "opacity. If it is 'false', it will adhere to the factor and fade out like the " + "rest of the 3D rendering", + openspace::properties::Property::Visibility::User + }; + constexpr openspace::properties::Property::PropertyInfo UseRadiusAzimuthElevationInfo = { @@ -191,6 +201,9 @@ namespace { // [[codegen::verbatim(EnabledInfo.description)]] std::optional enabled; + // [[codegen::verbatim(RenderDuringBlackoutInfo.description)]] + std::optional renderDuringBlackout; + // [[codegen::verbatim(UseRadiusAzimuthElevationInfo.description)]] std::optional useRadiusAzimuthElevation; @@ -282,6 +295,7 @@ std::string ScreenSpaceRenderable::makeUniqueIdentifier(std::string name) { ScreenSpaceRenderable::ScreenSpaceRenderable(const ghoul::Dictionary& dictionary) : properties::PropertyOwner({ "" }) , _enabled(EnabledInfo, true) + , _renderDuringBlackout(RenderDuringBlackoutInfo, false) , _usePerspectiveProjection(UsePerspectiveProjectionInfo, false) , _useRadiusAzimuthElevation(UseRadiusAzimuthElevationInfo, false) , _faceCamera(FaceCameraInfo, true) @@ -327,6 +341,8 @@ ScreenSpaceRenderable::ScreenSpaceRenderable(const ghoul::Dictionary& dictionary } addProperty(_enabled); + _renderDuringBlackout = p.renderDuringBlackout.value_or(_renderDuringBlackout); + addProperty(_renderDuringBlackout); addProperty(_useRadiusAzimuthElevation); addProperty(_usePerspectiveProjection); addProperty(_faceCamera); @@ -436,15 +452,15 @@ bool ScreenSpaceRenderable::deinitializeGL() { return true; } -void ScreenSpaceRenderable::render() { +void ScreenSpaceRenderable::render(float blackoutFactor) { ZoneScoped; - draw( + glm::mat4 mat = globalRotationMatrix() * translationMatrix() * localRotationMatrix() * - scaleMatrix() - ); + scaleMatrix(); + draw(mat, blackoutFactor); } bool ScreenSpaceRenderable::isReady() const { @@ -622,7 +638,7 @@ glm::mat4 ScreenSpaceRenderable::translationMatrix() { return glm::translate(glm::mat4(1.f), translation); } -void ScreenSpaceRenderable::draw(glm::mat4 modelTransform) { +void ScreenSpaceRenderable::draw(glm::mat4 modelTransform, float blackoutFactor) { glDisable(GL_CULL_FACE); _shader->activate(); @@ -634,6 +650,10 @@ void ScreenSpaceRenderable::draw(glm::mat4 modelTransform) { _shader->setUniform(_uniformCache.color, _multiplyColor); _shader->setUniform(_uniformCache.opacity, opacity()); + _shader->setUniform( + _uniformCache.blackoutFactor, + _renderDuringBlackout ? 1.f : blackoutFactor + ); _shader->setUniform(_uniformCache.backgroundColor, _backgroundColor); _shader->setUniform(_uniformCache.gamma, _gamma); _shader->setUniform(_uniformCache.borderWidth, borderUV); From c3ae39da62db15e7b44b4687dcdf785d3e8dfce7 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Fri, 1 Sep 2023 08:10:10 -0400 Subject: [PATCH 120/701] Change name of line fade in RenderableTrail from Fade to LineFade (#2857) * Change name of line fade in RenderableTrail from Fade to LineFade * Adress review comments --------- Co-authored-by: Emma Broman --- modules/base/rendering/renderabletrail.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/base/rendering/renderabletrail.cpp b/modules/base/rendering/renderabletrail.cpp index f6a25cdf22..31477e4be6 100644 --- a/modules/base/rendering/renderabletrail.cpp +++ b/modules/base/rendering/renderabletrail.cpp @@ -86,8 +86,8 @@ namespace { openspace::properties::Property::Visibility::NoviceUser }; - constexpr openspace::properties::Property::PropertyInfo FadeInfo = { - "Fade", + constexpr openspace::properties::Property::PropertyInfo LineFadeInfo = { + "LineFade", "Line fade", "The fading factor that is applied to the trail if the 'EnableFade' value is " "'true'. If it is 'false', this setting has no effect. The higher the number, " @@ -138,8 +138,8 @@ namespace { // [[codegen::verbatim(EnableFadeInfo.description)]] std::optional enableFade; - // [[codegen::verbatim(FadeInfo.description)]] - std::optional fade; + // [[codegen::verbatim(LineFadeInfo.description)]] + std::optional lineFade; // [[codegen::verbatim(LineWidthInfo.description)]] std::optional lineWidth; @@ -173,7 +173,7 @@ RenderableTrail::Appearance::Appearance() }) , lineColor(LineColorInfo, glm::vec3(1.f), glm::vec3(0.f), glm::vec3(1.f)) , useLineFade(EnableFadeInfo, true) - , lineFade(FadeInfo, 1.f, 0.f, 30.f) + , lineFade(LineFadeInfo, 1.f, 0.f, 30.f) , lineWidth(LineWidthInfo, 10.f, 1.f, 20.f) , pointSize(PointSizeInfo, 1, 1, 64) , renderingModes( @@ -211,7 +211,7 @@ RenderableTrail::RenderableTrail(const ghoul::Dictionary& dictionary) _appearance.lineColor = p.color; _appearance.useLineFade = p.enableFade.value_or(_appearance.useLineFade); - _appearance.lineFade = p.fade.value_or(_appearance.lineFade); + _appearance.lineFade = p.lineFade.value_or(_appearance.lineFade); _appearance.lineWidth = p.lineWidth.value_or(_appearance.lineWidth); _appearance.pointSize = p.pointSize.value_or(_appearance.pointSize); From b49a8704dc134b2595b8694e95ed3747d01108e4 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 6 Sep 2023 08:55:02 +0200 Subject: [PATCH 121/701] Add new asset showing a text marker for the moon (closes #2831) --- .../planets/earth/moon/markers.asset | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 data/assets/scene/solarsystem/planets/earth/moon/markers.asset diff --git a/data/assets/scene/solarsystem/planets/earth/moon/markers.asset b/data/assets/scene/solarsystem/planets/earth/moon/markers.asset new file mode 100644 index 0000000000..e6fc604800 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/moon/markers.asset @@ -0,0 +1,51 @@ +local transforms = asset.require("./moon") + + + +local texturesPath = asset.syncedResource({ + Name = "Moon Textures", + Type = "HttpSynchronization", + Identifier = "moon_textures", + Version = 3 +}) + + +local MoonMarker = { + Identifier = "MoonMarker", + Parent = transforms.Moon.Identifier, + Renderable = { + Type = "RenderablePlaneImageLocal", + Enabled = false, + Size = 3.0E7, + Origin = "Center", + Billboard = true, + Texture = texturesPath .. "marker.png", + BlendMode = "Additive" + }, + GUI = { + Name = "Moon Marker", + Path = "/Solar System/Planets/Earth/Moon" + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(MoonMarker) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(MoonMarker) +end) + +asset.export(MoonMarker) + + + +asset.meta = { + Name = "Moon marker", + Version = "1.0", + Description = "Moon marker with name, sized for Earth view", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} From 4447de87f53b28d0ccb415d26f3d78f5eedbbf1f Mon Sep 17 00:00:00 2001 From: Malin E Date: Thu, 7 Sep 2023 13:21:29 +0200 Subject: [PATCH 122/701] Issue/2768 (#2872) * Rename remote scripting property to reflect better what it does * Change the remote scripting name in all modules * Update all scripts and action calls to use the new property for sync * Simplify code that decides whether to send actions to nodes and peers * Move Lua console hint text to be right top aligned * Update Lua script topic * Added new JSON key whether or not the script should be synced to other nodes and peers * Per default all scripts sync to everyone In the next full release, we should have two separate keys that decides whether to sync and send to nodes and peers separately * Add some comments that explain why there is no sync for some scripts * Make sync argument in trigger action function BooleanType --- include/openspace/interaction/actionmanager.h | 6 +- include/openspace/rendering/luaconsole.h | 3 +- include/openspace/scripting/scriptengine.h | 10 +- modules/debugging/debuggingmodule_lua.inl | 24 ++-- modules/exoplanets/exoplanetsmodule_lua.inl | 36 ++++-- .../src/geojson/geojsoncomponent.cpp | 6 +- modules/imgui/src/guiactioncomponent.cpp | 12 +- modules/imgui/src/guigibscomponent.cpp | 3 +- .../imgui/src/guiglobebrowsingcomponent.cpp | 3 +- modules/imgui/src/guispacetimecomponent.cpp | 117 ++++++++++++++---- modules/imgui/src/renderproperties.cpp | 3 +- modules/iswa/rendering/iswacygnet.cpp | 6 +- modules/iswa/rendering/iswakameleongroup.cpp | 6 +- modules/iswa/rendering/kameleonplane.cpp | 3 +- modules/iswa/rendering/screenspacecygnet.cpp | 3 +- modules/iswa/util/iswamanager.cpp | 15 ++- modules/iswa/util/iswamanager_lua.inl | 6 +- .../server/include/topics/luascripttopic.h | 2 +- .../src/topics/flightcontrollertopic.cpp | 3 +- modules/server/src/topics/luascripttopic.cpp | 24 +++- .../server/src/topics/setpropertytopic.cpp | 3 +- .../src/topics/triggerpropertytopic.cpp | 3 +- modules/skybrowser/skybrowsermodule.cpp | 9 +- modules/skybrowser/skybrowsermodule_lua.inl | 38 ++++-- modules/skybrowser/src/targetbrowserpair.cpp | 6 +- modules/statemachine/src/state.cpp | 6 +- modules/statemachine/src/transition.cpp | 3 +- src/engine/openspaceengine.cpp | 18 ++- src/events/eventengine.cpp | 8 +- src/interaction/actionmanager.cpp | 28 +++-- src/interaction/actionmanager_lua.inl | 10 +- src/interaction/joystickcamerastates.cpp | 8 +- src/interaction/keybindingmanager.cpp | 6 +- src/interaction/sessionrecording.cpp | 3 +- src/navigation/navigationhandler.cpp | 32 ++++- src/navigation/pathnavigator.cpp | 9 +- src/network/parallelpeer.cpp | 5 +- src/rendering/luaconsole.cpp | 76 ++++++++---- src/rendering/renderengine.cpp | 9 +- src/rendering/screenspacerenderable.cpp | 6 +- src/scene/scene.cpp | 6 +- src/scripting/scriptengine.cpp | 28 +++-- src/scripting/scriptscheduler.cpp | 3 +- 43 files changed, 449 insertions(+), 165 deletions(-) diff --git a/include/openspace/interaction/actionmanager.h b/include/openspace/interaction/actionmanager.h index 9054b3fc09..610bdbf1e9 100644 --- a/include/openspace/interaction/actionmanager.h +++ b/include/openspace/interaction/actionmanager.h @@ -35,14 +35,16 @@ namespace openspace::interaction { class ActionManager { public: + BooleanType(ShouldBeSynchronized); + bool hasAction(const std::string& identifier) const; void registerAction(Action action); void removeAction(const std::string& identifier); const Action& action(const std::string& identifier) const; std::vector actions() const; - void triggerAction(const std::string& identifier, - const ghoul::Dictionary& arguments) const; + void triggerAction(const std::string& identifier, const ghoul::Dictionary& arguments, + ShouldBeSynchronized shouldBeSynchronized) const; static scripting::LuaLibrary luaLibrary(); private: diff --git a/include/openspace/rendering/luaconsole.h b/include/openspace/rendering/luaconsole.h index f7a828fb97..cd875a2b4a 100644 --- a/include/openspace/rendering/luaconsole.h +++ b/include/openspace/rendering/luaconsole.h @@ -66,7 +66,8 @@ private: void addToCommand(std::string c); properties::BoolProperty _isVisible; - properties::BoolProperty _remoteScripting; + properties::BoolProperty _shouldBeSynchronized; + properties::BoolProperty _shouldSendToRemote; properties::Vec4Property _backgroundColor; properties::Vec4Property _entryTextColor; diff --git a/include/openspace/scripting/scriptengine.h b/include/openspace/scripting/scriptengine.h index 8221fee70a..65e6703fe9 100644 --- a/include/openspace/scripting/scriptengine.h +++ b/include/openspace/scripting/scriptengine.h @@ -51,11 +51,13 @@ namespace openspace::scripting { class ScriptEngine : public Syncable { public: using ScriptCallback = std::function; - BooleanType(RemoteScripting); + BooleanType(ShouldBeSynchronized); + BooleanType(ShouldSendToRemote); struct QueueItem { std::string script; - RemoteScripting remoteScripting; + ShouldBeSynchronized shouldBeSynchronized; + ShouldSendToRemote shouldSendToRemote; ScriptCallback callback; }; @@ -89,8 +91,8 @@ public: virtual void decode(SyncBuffer* syncBuffer) override; virtual void postSync(bool isMaster) override; - void queueScript(std::string script, RemoteScripting remoteScripting, - ScriptCallback cb = ScriptCallback()); + void queueScript(std::string script, ShouldBeSynchronized shouldBeSynchronized, + ShouldSendToRemote shouldSendToRemote, ScriptCallback cb = ScriptCallback()); std::vector allLuaFunctions() const; diff --git a/modules/debugging/debuggingmodule_lua.inl b/modules/debugging/debuggingmodule_lua.inl index c8951ae0fb..de69a6deb5 100644 --- a/modules/debugging/debuggingmodule_lua.inl +++ b/modules/debugging/debuggingmodule_lua.inl @@ -66,7 +66,8 @@ constexpr glm::vec3 OrientationLineColor = glm::vec3(0.0, 1.0, 1.0); global::scriptEngine->queueScript( addParentScript, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); // Get the poses along the path @@ -98,7 +99,8 @@ constexpr glm::vec3 OrientationLineColor = glm::vec3(0.0, 1.0, 1.0); global::scriptEngine->queueScript( fmt::format("openspace.addSceneGraphNode({})", pointNode), - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); }; @@ -120,7 +122,8 @@ constexpr glm::vec3 OrientationLineColor = glm::vec3(0.0, 1.0, 1.0); global::scriptEngine->queueScript( fmt::format("openspace.addSceneGraphNode({})", lineNode), - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); }; @@ -157,7 +160,8 @@ constexpr glm::vec3 OrientationLineColor = glm::vec3(0.0, 1.0, 1.0); using namespace openspace; global::scriptEngine->queueScript( fmt::format("openspace.removeSceneGraphNode('{}');", RenderedPathIdentifier), - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } @@ -189,7 +193,8 @@ constexpr glm::vec3 OrientationLineColor = glm::vec3(0.0, 1.0, 1.0); global::scriptEngine->queueScript( addParentScript, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); const std::vector points = currentPath->controlPoints(); @@ -226,7 +231,8 @@ constexpr glm::vec3 OrientationLineColor = glm::vec3(0.0, 1.0, 1.0); global::scriptEngine->queueScript( fmt::format("openspace.addSceneGraphNode({})", node), - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } } @@ -236,7 +242,8 @@ constexpr glm::vec3 OrientationLineColor = glm::vec3(0.0, 1.0, 1.0); using namespace openspace; global::scriptEngine->queueScript( fmt::format("openspace.removeSceneGraphNode('{}');", RenderedPointsIdentifier), - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } @@ -291,7 +298,8 @@ constexpr glm::vec3 OrientationLineColor = glm::vec3(0.0, 1.0, 1.0); global::scriptEngine->queueScript( fmt::format("openspace.addSceneGraphNode({});", axes), - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } diff --git a/modules/exoplanets/exoplanetsmodule_lua.inl b/modules/exoplanets/exoplanetsmodule_lua.inl index bdd98a510a..a7aa2d4f15 100644 --- a/modules/exoplanets/exoplanetsmodule_lua.inl +++ b/modules/exoplanets/exoplanetsmodule_lua.inl @@ -211,9 +211,12 @@ void createExoplanetSystem(const std::string& starName, "}" "}"; + // No sync or send because this is already inside a Lua script, therefor it has + // already been synced and sent to the connected nodes and peers global::scriptEngine->queueScript( "openspace.addSceneGraphNode(" + starParent + ");", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); // Planets @@ -327,10 +330,13 @@ void createExoplanetSystem(const std::string& starName, "}" "}"; + // No sync or send because this is already inside a Lua script, therefor it has + // already been synced and sent to the connected nodes and peers global::scriptEngine->queueScript( "openspace.addSceneGraphNode(" + planetTrailNode + ");" "openspace.addSceneGraphNode(" + planetNode + ");", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); bool hasUpperAUncertainty = !std::isnan(planet.aUpper); @@ -377,9 +383,12 @@ void createExoplanetSystem(const std::string& starName, "}" "}"; + // No sync or send because this is already inside a Lua script, therefor it + // has already been synced and sent to the connected nodes and peers global::scriptEngine->queueScript( "openspace.addSceneGraphNode(" + discNode + ");", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } } @@ -422,9 +431,12 @@ void createExoplanetSystem(const std::string& starName, "}" "}"; + // No sync or send because this is already inside a Lua script, therefor it has + // already been synced and sent to the connected nodes and peers global::scriptEngine->queueScript( "openspace.addSceneGraphNode(" + circle + ");", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); // Habitable Zone @@ -477,9 +489,12 @@ void createExoplanetSystem(const std::string& starName, "}" "}"; + // No sync or send because this is already inside a Lua script, therefor it has + // already been synced and sent to the connected nodes and peers global::scriptEngine->queueScript( "openspace.addSceneGraphNode(" + zoneDiscNode + ");", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); // Star glare @@ -518,9 +533,12 @@ void createExoplanetSystem(const std::string& starName, "}" "}"; + // No sync or send because this is already inside a Lua script, therefor it + // has already been synced and sent to the connected nodes and peers global::scriptEngine->queueScript( "openspace.addSceneGraphNode(" + starGlare + ");", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } } @@ -627,9 +645,13 @@ std::vector hostStarsWithSufficientData() { using namespace openspace; using namespace exoplanets; const std::string starIdentifier = makeIdentifier(std::move(starName)); + + // No sync or send because this is already inside a Lua script, therefor it has + // already been synced and sent to the connected nodes and peers global::scriptEngine->queueScript( "openspace.removeSceneGraphNode('" + starIdentifier + "');", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } diff --git a/modules/globebrowsing/src/geojson/geojsoncomponent.cpp b/modules/globebrowsing/src/geojson/geojsoncomponent.cpp index ca3dbf5423..1d876df11b 100644 --- a/modules/globebrowsing/src/geojson/geojsoncomponent.cpp +++ b/modules/globebrowsing/src/geojson/geojsoncomponent.cpp @@ -840,7 +840,8 @@ void GeoJsonComponent::flyToFeature(std::optional index) const { "openspace.globebrowsing.flyToGeo(\"{}\", {}, {}, {})", _globeNode.owner()->identifier(), lat, lon, d ), - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } @@ -850,7 +851,8 @@ void GeoJsonComponent::triggerDeletion() const { "openspace.globebrowsing.deleteGeoJson(\"{}\", \"{}\")", _globeNode.owner()->identifier(), _identifier ), - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } diff --git a/modules/imgui/src/guiactioncomponent.cpp b/modules/imgui/src/guiactioncomponent.cpp index a9bb377201..1c7ea37b7c 100644 --- a/modules/imgui/src/guiactioncomponent.cpp +++ b/modules/imgui/src/guiactioncomponent.cpp @@ -55,7 +55,11 @@ void GuiActionComponent::render() { for (const std::pair& p : binds) { boundActions.insert(p.second); if (ImGui::Button(ghoul::to_string(p.first).c_str())) { - global::actionManager->triggerAction(p.second, ghoul::Dictionary()); + global::actionManager->triggerAction( + p.second, + ghoul::Dictionary(), + interaction::ActionManager::ShouldBeSynchronized::Yes + ); } ImGui::SameLine(); @@ -78,7 +82,11 @@ void GuiActionComponent::render() { } if (ImGui::Button(action.identifier.c_str())) { - global::actionManager->triggerAction(action.command, ghoul::Dictionary()); + global::actionManager->triggerAction( + action.command, + ghoul::Dictionary(), + interaction::ActionManager::ShouldBeSynchronized::Yes + ); } ImGui::SameLine(); diff --git a/modules/imgui/src/guigibscomponent.cpp b/modules/imgui/src/guigibscomponent.cpp index e544e01241..a9c2c71a1c 100644 --- a/modules/imgui/src/guigibscomponent.cpp +++ b/modules/imgui/src/guigibscomponent.cpp @@ -147,7 +147,8 @@ void GuiGIBSComponent::render() { ); global::scriptEngine->queueScript( script, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } diff --git a/modules/imgui/src/guiglobebrowsingcomponent.cpp b/modules/imgui/src/guiglobebrowsingcomponent.cpp index 3e3848a830..af6c52d820 100644 --- a/modules/imgui/src/guiglobebrowsingcomponent.cpp +++ b/modules/imgui/src/guiglobebrowsingcomponent.cpp @@ -344,7 +344,8 @@ void GuiGlobeBrowsingComponent::render() { l.name, l.url ), - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); }; diff --git a/modules/imgui/src/guispacetimecomponent.cpp b/modules/imgui/src/guispacetimecomponent.cpp index 7c00f3d155..0a7bf9dbc7 100644 --- a/modules/imgui/src/guispacetimecomponent.cpp +++ b/modules/imgui/src/guispacetimecomponent.cpp @@ -109,12 +109,14 @@ void GuiSpaceTimeComponent::render() { "openspace.setPropertyValue('" + std::string(AnchorProperty) + "', '" + n->identifier() + "');", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); global::scriptEngine->queueScript( "openspace.setPropertyValue('" + std::string(RetargetAnchorProperty) + "', nil);", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } } @@ -144,12 +146,14 @@ void GuiSpaceTimeComponent::render() { global::scriptEngine->queueScript( "openspace.setPropertyValue('" + std::string(AnchorProperty) + "', '" + nodes[currentPosition]->identifier() + "');", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); global::scriptEngine->queueScript( "openspace.setPropertyValue('" + std::string(RetargetAnchorProperty) + "', nil);", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } @@ -159,7 +163,8 @@ void GuiSpaceTimeComponent::render() { global::scriptEngine->queueScript( "openspace.setPropertyValue('" + std::string(RetargetAnchorProperty) + "', nil);", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } @@ -195,9 +200,13 @@ void GuiSpaceTimeComponent::render() { for (size_t i = 0; i < interestingTimes.size(); ++i) { const Scene::InterestingTime& t = interestingTimes[i]; if (ImGui::Button(t.name.c_str())) { + + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.setTime(\"" + t.time + "\")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } @@ -223,9 +232,12 @@ void GuiSpaceTimeComponent::render() { ImGuiInputTextFlags_EnterReturnsTrue ); if (dateChanged) { + // No sync or send because time settings are always synced and sent to the + // connected nodes and peers global::scriptEngine->queueScript( "openspace.time.setTime(\"" + std::string(Buffer) + "\")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } @@ -255,17 +267,23 @@ void GuiSpaceTimeComponent::render() { j2000 + seconds; if (shift) { - // If any shift key is pressed we want to always jump to the time + // If any shift key is pressed we want to always jump to the time. + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.setTime(" + std::to_string(newTime) + ")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } else { + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.interpolateTime(" + std::to_string(newTime) + ", " + std::to_string(duration) + ")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } }; @@ -302,9 +320,12 @@ void GuiSpaceTimeComponent::render() { // setTime doesn't like the T in it and wants a space instead nowTime[11] = ' '; + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.setTime(\"" + nowTime + "\")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } @@ -382,9 +403,13 @@ void GuiSpaceTimeComponent::render() { // If the value changed, we want to change the delta time to the new value double newDt = convertTime(_deltaTime, _deltaTimeUnit, TimeUnit::Second); + + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.interpolateDeltaTime(" + std::to_string(newDt) + ")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } if (unitChanged) { @@ -430,16 +455,22 @@ void GuiSpaceTimeComponent::render() { TimeUnit::Second ); + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.setDeltaTime(" + std::to_string(newDeltaTime) + ")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } if (!ImGui::IsItemActive() && !ImGui::IsItemClicked()) { if (_slidingDelta != 0.f) { + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.setDeltaTime(" + std::to_string(_oldDeltaTime) + ")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } @@ -464,9 +495,12 @@ void GuiSpaceTimeComponent::render() { TimeUnit::Second ); + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.setDeltaTime(" + std::to_string(newDeltaTime) + ")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } else { @@ -484,7 +518,8 @@ void GuiSpaceTimeComponent::render() { if (pauseChanged) { global::scriptEngine->queueScript( "openspace.time.interpolateTogglePause()", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } ImGui::SameLine(); @@ -493,53 +528,71 @@ void GuiSpaceTimeComponent::render() { { ImGui::GetWindowWidth() / 2 - 7.5f, 0.f } ); if (invert) { + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.interpolateDeltaTime(-1 * openspace.time.deltaTime());", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } const bool minusDs = ImGui::Button("-1d/s"); if (minusDs) { + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.interpolateDeltaTime(" + std::to_string(-24 * 60 * 60) + ")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } ImGui::SameLine(); const bool minusHs = ImGui::Button("-1h/s"); if (minusHs) { + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.interpolateDeltaTime(" + std::to_string(-60 * 60) + ")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } ImGui::SameLine(); const bool minusMs = ImGui::Button("-1min/s"); if (minusMs) { + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.interpolateDeltaTime(" + std::to_string(-60) + ")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } ImGui::SameLine(); const bool minusSs = ImGui::Button("-1s/s"); if (minusSs) { + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.interpolateDeltaTime(" + std::to_string(-1) + ")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } ImGui::SameLine(); const bool zero = ImGui::Button("0"); if (zero) { + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.interpolateDeltaTime(" + std::to_string(0) + ")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } ImGui::SameLine(); @@ -547,36 +600,48 @@ void GuiSpaceTimeComponent::render() { const bool plusSs = ImGui::Button("+1s/s"); if (plusSs) { + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.interpolateDeltaTime(" + std::to_string(1) + ")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } ImGui::SameLine(); const bool plusMs = ImGui::Button("1min/s"); if (plusMs) { + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.interpolateDeltaTime(" + std::to_string(60) + ")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } ImGui::SameLine(); const bool plusHs = ImGui::Button("1h/s"); if (plusHs) { + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.interpolateDeltaTime(" + std::to_string(60 * 60) + ")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } ImGui::SameLine(); const bool plusDs = ImGui::Button("1d/s"); if (plusDs) { + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.interpolateDeltaTime(" + std::to_string(24 * 60 * 60) + ")", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } diff --git a/modules/imgui/src/renderproperties.cpp b/modules/imgui/src/renderproperties.cpp index 2fa228cf55..6e49500b36 100644 --- a/modules/imgui/src/renderproperties.cpp +++ b/modules/imgui/src/renderproperties.cpp @@ -74,7 +74,8 @@ void renderTooltip(Property* prop, double delay) { void executeSetPropertyScript(const std::string& id, const std::string& value) { global::scriptEngine->queueScript( fmt::format("openspace.setPropertyValueSingle('{}', {});", id, value), - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } diff --git a/modules/iswa/rendering/iswacygnet.cpp b/modules/iswa/rendering/iswacygnet.cpp index b8e0f12120..48b935cf20 100644 --- a/modules/iswa/rendering/iswacygnet.cpp +++ b/modules/iswa/rendering/iswacygnet.cpp @@ -139,7 +139,8 @@ void IswaCygnet::initializeGL() { deinitialize(); global::scriptEngine->queueScript( "openspace.removeSceneGraphNode('" + identifier() + "')", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); }); } @@ -306,7 +307,8 @@ void IswaCygnet::initializeGroup() { LDEBUG(identifier() + " Event clearGroup"); global::scriptEngine->queueScript( "openspace.removeSceneGraphNode('" + identifier() + "')", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } ); diff --git a/modules/iswa/rendering/iswakameleongroup.cpp b/modules/iswa/rendering/iswakameleongroup.cpp index 5eb84733fb..3840f5f74b 100644 --- a/modules/iswa/rendering/iswakameleongroup.cpp +++ b/modules/iswa/rendering/iswakameleongroup.cpp @@ -153,7 +153,8 @@ void IswaKameleonGroup::updateFieldlineSeeds() { global::scriptEngine->queueScript( "openspace.removeSceneGraphNode('" + std::get<0>(seedPath.second) + "')", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); std::get<2>(seedPath.second) = false; // if this option was turned on @@ -180,7 +181,8 @@ void IswaKameleonGroup::clearFieldlines() { global::scriptEngine->queueScript( "openspace.removeSceneGraphNode('" + std::get<0>(seedPath.second) + "')", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); std::get<2>(seedPath.second) = false; } diff --git a/modules/iswa/rendering/kameleonplane.cpp b/modules/iswa/rendering/kameleonplane.cpp index 51cbf6286f..5ca5a57c78 100644 --- a/modules/iswa/rendering/kameleonplane.cpp +++ b/modules/iswa/rendering/kameleonplane.cpp @@ -292,7 +292,8 @@ void KameleonPlane::updateFieldlineSeeds() { LDEBUG("Removed fieldlines: " + std::get<0>(seedPath.second)); global::scriptEngine->queueScript( "openspace.removeSceneGraphNode('" + std::get<0>(seedPath.second) + "')", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); std::get<2>(seedPath.second) = false; // if this option was turned on diff --git a/modules/iswa/rendering/screenspacecygnet.cpp b/modules/iswa/rendering/screenspacecygnet.cpp index e0b7dcf613..ae31fc066e 100644 --- a/modules/iswa/rendering/screenspacecygnet.cpp +++ b/modules/iswa/rendering/screenspacecygnet.cpp @@ -55,7 +55,8 @@ ScreenSpaceCygnet::ScreenSpaceCygnet(const ghoul::Dictionary& dictionary) _delete.onChange([this]() { global::scriptEngine->queueScript( "openspace.iswa.removeScreenSpaceCygnet("+std::to_string(_cygnetId)+");", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); }); } diff --git a/modules/iswa/util/iswamanager.cpp b/modules/iswa/util/iswamanager.cpp index d0532ac2f5..09489ed78d 100644 --- a/modules/iswa/util/iswamanager.cpp +++ b/modules/iswa/util/iswamanager.cpp @@ -87,7 +87,8 @@ namespace { std::string idStr = std::to_string(id); openspace::global::scriptEngine->queueScript( "openspace.iswa.addScreenSpaceCygnet({CygnetId =" + idStr + "});", - openspace::scripting::ScriptEngine::RemoteScripting::Yes + openspace::scripting::ScriptEngine::ShouldBeSynchronized::Yes, + openspace::scripting::ScriptEngine::ShouldSendToRemote::Yes ); } } // namespace @@ -546,7 +547,8 @@ void IswaManager::createPlane(MetadataFuture& data) { std::string script = "openspace.addSceneGraphNode(" + luaTable + ");"; global::scriptEngine->queueScript( script, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } } @@ -579,7 +581,8 @@ void IswaManager::createSphere(MetadataFuture& data) { std::string script = "openspace.addSceneGraphNode(" + luaTable + ");"; global::scriptEngine->queueScript( script, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } } @@ -612,7 +615,8 @@ void IswaManager::createKameleonPlane(CdfInfo info, std::string cut) { std::string script = "openspace.addSceneGraphNode(" + luaTable + ");"; global::scriptEngine->queueScript( script, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } } @@ -653,7 +657,8 @@ void IswaManager::createFieldline(std::string name, std::string cdfPath, std::string script = "openspace.addSceneGraphNode(" + luaTable + ");"; global::scriptEngine->queueScript( script, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } } diff --git a/modules/iswa/util/iswamanager_lua.inl b/modules/iswa/util/iswamanager_lua.inl index ddb7e3a20b..ab7d16a935 100644 --- a/modules/iswa/util/iswamanager_lua.inl +++ b/modules/iswa/util/iswamanager_lua.inl @@ -71,7 +71,8 @@ namespace { using namespace openspace; global::scriptEngine->queueScript( "openspace.removeSceneGraphNode('" + name + "')", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } @@ -96,7 +97,8 @@ namespace { global::scriptEngine->queueScript( script, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } diff --git a/modules/server/include/topics/luascripttopic.h b/modules/server/include/topics/luascripttopic.h index 3a8db5f313..b0ed050eeb 100644 --- a/modules/server/include/topics/luascripttopic.h +++ b/modules/server/include/topics/luascripttopic.h @@ -35,7 +35,7 @@ public: bool isDone() const override; private: - void runScript(std::string script, bool returnValue); + void runScript(std::string script, bool returnValue, bool shouldBeSynchronized); bool _waitingForReturnValue = true; }; diff --git a/modules/server/src/topics/flightcontrollertopic.cpp b/modules/server/src/topics/flightcontrollertopic.cpp index 65c9a42922..ec1b172e0e 100644 --- a/modules/server/src/topics/flightcontrollertopic.cpp +++ b/modules/server/src/topics/flightcontrollertopic.cpp @@ -467,7 +467,8 @@ void FlightControllerTopic::processLua(const nlohmann::json &json) { const std::string script = json[LuaScript]; global::scriptEngine->queueScript( script, - openspace::scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } diff --git a/modules/server/src/topics/luascripttopic.cpp b/modules/server/src/topics/luascripttopic.cpp index 26b2957abc..b75d863681 100644 --- a/modules/server/src/topics/luascripttopic.cpp +++ b/modules/server/src/topics/luascripttopic.cpp @@ -37,6 +37,7 @@ namespace { constexpr std::string_view KeyFunction = "function"; constexpr std::string_view KeyArguments = "arguments"; constexpr std::string_view KeyReturn = "return"; + constexpr std::string_view KeyShouldBeSynchronized = "shouldBeSynchronized"; constexpr std::string_view _loggerCat = "LuaScriptTopic"; std::string formatLua(const nlohmann::json::const_iterator& it); @@ -146,7 +147,13 @@ void LuaScriptTopic::handleJson(const nlohmann::json& json) { ret->is_boolean() && ret->get(); - runScript(luaScript, shouldReturn); + nlohmann::json::const_iterator sync = json.find(KeyShouldBeSynchronized); + bool shouldBeSynchronized = true; + if (sync != json.end() && sync->is_boolean()) { + shouldBeSynchronized = sync->get(); + } + + runScript(luaScript, shouldReturn, shouldBeSynchronized); } else if (function != json.end() && function->is_string()) { std::string luaFunction = function->get(); @@ -155,6 +162,12 @@ void LuaScriptTopic::handleJson(const nlohmann::json& json) { ret->is_boolean() && ret->get(); + nlohmann::json::const_iterator sync = json.find(KeyShouldBeSynchronized); + bool shouldBeSynchronized = true; + if (sync != json.end() && sync->is_boolean()) { + shouldBeSynchronized = sync->get(); + } + nlohmann::json::const_iterator args = json.find(KeyArguments); if (!args->is_array()) { return; @@ -167,7 +180,7 @@ void LuaScriptTopic::handleJson(const nlohmann::json& json) { } std::string luaScript = generateScript(luaFunction, formattedArgs); - runScript(luaScript, shouldReturn); + runScript(luaScript, shouldReturn, shouldBeSynchronized); } } catch (const std::out_of_range& e) { @@ -176,7 +189,9 @@ void LuaScriptTopic::handleJson(const nlohmann::json& json) { } } -void LuaScriptTopic::runScript(std::string script, bool shouldReturn) { +void LuaScriptTopic::runScript(std::string script, bool shouldReturn, + bool shouldBeSynchronized) +{ scripting::ScriptEngine::ScriptCallback callback; if (shouldReturn) { callback = [this](ghoul::Dictionary data) { @@ -195,7 +210,8 @@ void LuaScriptTopic::runScript(std::string script, bool shouldReturn) { global::scriptEngine->queueScript( std::move(script), - scripting::ScriptEngine::RemoteScripting::No, + scripting::ScriptEngine::ShouldBeSynchronized(shouldBeSynchronized), + scripting::ScriptEngine::ShouldSendToRemote(shouldBeSynchronized), callback ); } diff --git a/modules/server/src/topics/setpropertytopic.cpp b/modules/server/src/topics/setpropertytopic.cpp index 559adc6b6d..3a6ca50f67 100644 --- a/modules/server/src/topics/setpropertytopic.cpp +++ b/modules/server/src/topics/setpropertytopic.cpp @@ -126,7 +126,8 @@ void SetPropertyTopic::handleJson(const nlohmann::json& json) { fmt::format( "openspace.setPropertyValueSingle(\"{}\", {})", propertyKey, literal ), - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } } diff --git a/modules/server/src/topics/triggerpropertytopic.cpp b/modules/server/src/topics/triggerpropertytopic.cpp index bb5f3ad143..6ba2e78d05 100644 --- a/modules/server/src/topics/triggerpropertytopic.cpp +++ b/modules/server/src/topics/triggerpropertytopic.cpp @@ -44,7 +44,8 @@ void TriggerPropertyTopic::handleJson(const nlohmann::json& json) { fmt::format( "openspace.setPropertyValueSingle(\"{}\", nil)", propertyKey ), - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } catch (const std::out_of_range& e) { diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 837365b6b5..188fec73db 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -356,7 +356,8 @@ void SkyBrowserModule::moveHoverCircle(const std::string& imageUrl, bool useScri ); global::scriptEngine->queueScript( script, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } else { @@ -379,7 +380,8 @@ void SkyBrowserModule::moveHoverCircle(const std::string& imageUrl, bool useScri ); global::scriptEngine->queueScript( script, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } @@ -392,7 +394,8 @@ void SkyBrowserModule::disableHoverCircle(bool useScript) { ); global::scriptEngine->queueScript( script, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } else { diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index a23865c18a..66b1a628e2 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -228,7 +228,7 @@ std::string prunedIdentifier(std::string identifier) { } /** - * Starts the setup process of the sky browers. This function calls the lua function + * Starts the setup process of the sky browers. This function calls the Lua function * 'sendOutIdsToBrowsers' in all nodes in the cluster. */ [[codegen::luawrap]] void startSetup() { @@ -246,17 +246,23 @@ std::string prunedIdentifier(std::string identifier) { "openspace.skybrowser.setBorderColor('{}', {}, {}, {})", id, color.r, color.g, color.b ); + + // No sync or send because this is already inside a Lua script, therefor it + // has already been synced and sent to the connected nodes and peers global::scriptEngine->queueScript( script, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } } // To ensure each node in a cluster calls its own instance of the wwt application - // Do not send this script to the other nodes + // Do not send this script to the other nodes. (Note malej 2023-AUG-23: Due to this + // already being inside a Lua function that have already been synced out) global::scriptEngine->queueScript( "openspace.skybrowser.sendOutIdsToBrowsers()", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } @@ -599,25 +605,31 @@ ghoul::Dictionary wwtImageCollectionUrlDeprecated() "}" "}"; + // No sync or send because this is already inside a Lua script, therefor it has + // already been synced and sent to the connected nodes and peers global::scriptEngine->queueScript( "openspace.addScreenSpaceRenderable(" + browser + ");", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); global::scriptEngine->queueScript( "openspace.addSceneGraphNode(" + target + ");", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); global::scriptEngine->queueScript( "openspace.skybrowser.addPairToSkyBrowserModule('" + idTarget + "','" + idBrowser + "');", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); global::scriptEngine->queueScript( "openspace.skybrowser.setSelectedBrowser('" + idBrowser + "');", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } @@ -635,15 +647,19 @@ ghoul::Dictionary wwtImageCollectionUrlDeprecated() module->removeTargetBrowserPair(identifier); - // Remove from engine + // Remove from engine. + // No sync or send because this is already inside a Lua script, therefor it has + // already been synced and sent to the connected nodes and peers global::scriptEngine->queueScript( "openspace.removeScreenSpaceRenderable('" + browser + "');", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); global::scriptEngine->queueScript( "openspace.removeSceneGraphNode('" + target + "');", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } } diff --git a/modules/skybrowser/src/targetbrowserpair.cpp b/modules/skybrowser/src/targetbrowserpair.cpp index 57e4e86d48..8683264840 100644 --- a/modules/skybrowser/src/targetbrowserpair.cpp +++ b/modules/skybrowser/src/targetbrowserpair.cpp @@ -51,7 +51,8 @@ namespace { ); openspace::global::scriptEngine->queueScript( script, - openspace::scripting::ScriptEngine::RemoteScripting::Yes + openspace::scripting::ScriptEngine::ShouldBeSynchronized::Yes, + openspace::scripting::ScriptEngine::ShouldSendToRemote::Yes ); } } // namespace @@ -327,7 +328,8 @@ void TargetBrowserPair::startFading(float goal, float fadeTime) { global::scriptEngine->queueScript( script, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } diff --git a/modules/statemachine/src/state.cpp b/modules/statemachine/src/state.cpp index 019646f4cc..6a09ee24e7 100644 --- a/modules/statemachine/src/state.cpp +++ b/modules/statemachine/src/state.cpp @@ -62,14 +62,16 @@ State::State(const ghoul::Dictionary& dictionary) { void State::enter() const { global::scriptEngine->queueScript( _enter, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } void State::exit() const { global::scriptEngine->queueScript( _exit, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } diff --git a/modules/statemachine/src/transition.cpp b/modules/statemachine/src/transition.cpp index 247529a6fe..55873a398b 100644 --- a/modules/statemachine/src/transition.cpp +++ b/modules/statemachine/src/transition.cpp @@ -71,7 +71,8 @@ void Transition::performAction() const { } global::scriptEngine->queueScript( _action, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index 894790e077..b6eb9c8103 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -1124,7 +1124,8 @@ void OpenSpaceEngine::preSynchronization() { for (const std::string& script : scheduledScripts) { global::scriptEngine->queueScript( script, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } @@ -1577,7 +1578,8 @@ void OpenSpaceEngine::handleDragDrop(std::filesystem::path file) { std::string script = ghoul::lua::value(s); global::scriptEngine->queueScript( script, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } @@ -1769,7 +1771,8 @@ void setCameraFromProfile(const Profile& p) { geoScript += ")"; global::scriptEngine->queueScript( geoScript, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); }, [&checkNodeExists](const Profile::CameraGoToNode& node) { @@ -1800,7 +1803,8 @@ void setModulesFromProfile(const Profile& p) { if (mod.loadedInstruction.has_value()) { global::scriptEngine->queueScript( mod.loadedInstruction.value(), - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } } @@ -1808,7 +1812,8 @@ void setModulesFromProfile(const Profile& p) { if (mod.notLoadedInstruction.has_value()) { global::scriptEngine->queueScript( mod.notLoadedInstruction.value(), - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } } @@ -1872,7 +1877,8 @@ void setAdditionalScriptsFromProfile(const Profile& p) { for (const std::string& a : p.additionalScripts) { global::scriptEngine->queueScript( a, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } } diff --git a/src/events/eventengine.cpp b/src/events/eventengine.cpp index 01b41f1e52..c777bdfe7a 100644 --- a/src/events/eventengine.cpp +++ b/src/events/eventengine.cpp @@ -164,7 +164,13 @@ void EventEngine::triggerActions() const { if (ai.isEnabled && (!ai.filter.has_value() || params.isSubset(*ai.filter))) { - global::actionManager->triggerAction(ai.action, params); + // No sync because events are always synced and sent to the connected + // nodes and peers + global::actionManager->triggerAction( + ai.action, + params, + interaction::ActionManager::ShouldBeSynchronized::No + ); } } } diff --git a/src/interaction/actionmanager.cpp b/src/interaction/actionmanager.cpp index fb8e4fe904..c52f00f42f 100644 --- a/src/interaction/actionmanager.cpp +++ b/src/interaction/actionmanager.cpp @@ -80,7 +80,8 @@ std::vector ActionManager::actions() const { } void ActionManager::triggerAction(const std::string& identifier, - const ghoul::Dictionary& arguments) const + const ghoul::Dictionary& arguments, + ActionManager::ShouldBeSynchronized shouldBeSynchronized) const { ghoul_assert(!identifier.empty(), "Identifier must not be empty"); @@ -93,18 +94,21 @@ void ActionManager::triggerAction(const std::string& identifier, } const Action& a = action(identifier); - if (arguments.isEmpty()) { - global::scriptEngine->queueScript( - a.command, - scripting::ScriptEngine::RemoteScripting(!a.isLocal) - ); - } - else { - global::scriptEngine->queueScript( - fmt::format("args = {}\n{}", ghoul::formatLua(arguments), a.command), - scripting::ScriptEngine::RemoteScripting(!a.isLocal) - ); + std::string script = + arguments.isEmpty() ? + a.command : + fmt::format("args = {}\n{}", ghoul::formatLua(arguments), a.command); + + using ShouldBeSynchronized = scripting::ScriptEngine::ShouldBeSynchronized; + using ShouldSendToRemote = scripting::ScriptEngine::ShouldSendToRemote; + ShouldBeSynchronized sync = ShouldBeSynchronized::Yes; + ShouldSendToRemote send = ShouldSendToRemote::Yes; + if (!shouldBeSynchronized || a.isLocal) { + sync = ShouldBeSynchronized::No; + send = ShouldSendToRemote::No; } + + global::scriptEngine->queueScript(script, sync, send); } scripting::LuaLibrary ActionManager::luaLibrary() { diff --git a/src/interaction/actionmanager_lua.inl b/src/interaction/actionmanager_lua.inl index 819251d303..1c7bede99e 100644 --- a/src/interaction/actionmanager_lua.inl +++ b/src/interaction/actionmanager_lua.inl @@ -36,7 +36,7 @@ namespace { } /** - * Removes an existing action from the list of possible actions.The action is identifies + * Removes an existing action from the list of possible actions. The action is identifies * either by the passed name, or if it is a table, the value behind the 'Identifier' key * is extract and used instead. */ @@ -192,7 +192,13 @@ struct [[codegen::Dictionary(Action)]] Action { throw ghoul::lua::LuaError(fmt::format("Action '{}' not found", id)); } - global::actionManager->triggerAction(id, arg); + // No sync because this is already inside a Lua script, therefor it has + // already been synced and sent to the connected nodes and peers + global::actionManager->triggerAction( + id, + arg, + interaction::ActionManager::ShouldBeSynchronized::No + ); } #include "actionmanager_lua_codegen.cpp" diff --git a/src/interaction/joystickcamerastates.cpp b/src/interaction/joystickcamerastates.cpp index b53d1c76aa..e5bb3c1be3 100644 --- a/src/interaction/joystickcamerastates.cpp +++ b/src/interaction/joystickcamerastates.cpp @@ -169,7 +169,8 @@ void JoystickCameraStates::updateStateFromInput( global::scriptEngine->queueScript( script, - scripting::ScriptEngine::RemoteScripting(t.isRemote) + scripting::ScriptEngine::ShouldBeSynchronized(t.isRemote), + scripting::ScriptEngine::ShouldSendToRemote(t.isRemote) ); break; } @@ -188,7 +189,10 @@ void JoystickCameraStates::updateStateFromInput( if (active) { global::scriptEngine->queueScript( it->second.command, - scripting::ScriptEngine::RemoteScripting( + scripting::ScriptEngine::ShouldBeSynchronized( + it->second.synchronization + ), + scripting::ScriptEngine::ShouldSendToRemote( it->second.synchronization ) ); diff --git a/src/interaction/keybindingmanager.cpp b/src/interaction/keybindingmanager.cpp index b086e3f524..46d3663a76 100644 --- a/src/interaction/keybindingmanager.cpp +++ b/src/interaction/keybindingmanager.cpp @@ -52,7 +52,11 @@ void KeybindingManager::keyboardCallback(Key key, KeyModifier modifier, KeyActio // bind a key to multiple actions, only one of which could be defined continue; } - global::actionManager->triggerAction(it->second, ghoul::Dictionary()); + global::actionManager->triggerAction( + it->second, + ghoul::Dictionary(), + interaction::ActionManager::ShouldBeSynchronized::Yes + ); } } } diff --git a/src/interaction/sessionrecording.cpp b/src/interaction/sessionrecording.cpp index 6ca8d1d952..f7e6c9f63c 100644 --- a/src/interaction/sessionrecording.cpp +++ b/src/interaction/sessionrecording.cpp @@ -2088,7 +2088,8 @@ bool SessionRecording::processScriptKeyframe() { ); global::scriptEngine->queueScript( nextScript, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } diff --git a/src/navigation/navigationhandler.cpp b/src/navigation/navigationhandler.cpp index 637bdba6cd..5c0de14a84 100644 --- a/src/navigation/navigationhandler.cpp +++ b/src/navigation/navigationhandler.cpp @@ -279,7 +279,13 @@ void NavigationHandler::updateCameraTransitions() { dict.setValue("Node", anchorNode()->identifier()); dict.setValue("Transition", "Exiting"s); for (const std::string& action : anchorNode()->onExitAction()) { - global::actionManager->triggerAction(action, dict); + // No sync because events are always synced and sent to the connected + // nodes and peers + global::actionManager->triggerAction( + action, + dict, + interaction::ActionManager::ShouldBeSynchronized::No + ); } } @@ -299,7 +305,13 @@ void NavigationHandler::updateCameraTransitions() { dict.setValue("Node", anchorNode()->identifier()); dict.setValue("Transition", "Reaching"s); for (const std::string& action : anchorNode()->onReachAction()) { - global::actionManager->triggerAction(action, dict); + // No sync because events are always synced and sent to the connected + // nodes and peers + global::actionManager->triggerAction( + action, + dict, + interaction::ActionManager::ShouldBeSynchronized::No + ); } } @@ -320,7 +332,13 @@ void NavigationHandler::updateCameraTransitions() { dict.setValue("Node", anchorNode()->identifier()); dict.setValue("Transition", "Receding"s); for (const std::string& action : anchorNode()->onRecedeAction()) { - global::actionManager->triggerAction(action, dict); + // No sync because events are always synced and sent to the connected + // nodes and peers + global::actionManager->triggerAction( + action, + dict, + interaction::ActionManager::ShouldBeSynchronized::No + ); } } @@ -341,7 +359,13 @@ void NavigationHandler::updateCameraTransitions() { dict.setValue("Node", anchorNode()->identifier()); dict.setValue("Transition", "Approaching"s); for (const std::string& action : anchorNode()->onApproachAction()) { - global::actionManager->triggerAction(action, dict); + // No sync because events are always synced and sent to the connected + // nodes and peers + global::actionManager->triggerAction( + action, + dict, + interaction::ActionManager::ShouldBeSynchronized::No + ); } } diff --git a/src/navigation/pathnavigator.cpp b/src/navigation/pathnavigator.cpp index f2c5418192..838df0eebb 100644 --- a/src/navigation/pathnavigator.cpp +++ b/src/navigation/pathnavigator.cpp @@ -322,7 +322,8 @@ void PathNavigator::startPath() { if (!global::timeManager->isPaused()) { openspace::global::scriptEngine->queueScript( "openspace.time.setPause(true)", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); _startSimulationTimeOnFinish = true; @@ -437,7 +438,8 @@ void PathNavigator::handlePathEnd() { if (_startSimulationTimeOnFinish) { openspace::global::scriptEngine->queueScript( "openspace.time.setPause(false)", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); _startSimulationTimeOnFinish = false; } @@ -448,7 +450,8 @@ void PathNavigator::handlePathEnd() { "'NavigationHandler.OrbitalNavigator.IdleBehavior.ApplyIdleBehavior'," "true" ");", - openspace::scripting::ScriptEngine::RemoteScripting::Yes + openspace::scripting::ScriptEngine::ShouldBeSynchronized::Yes, + openspace::scripting::ScriptEngine::ShouldSendToRemote::Yes ); } diff --git a/src/network/parallelpeer.cpp b/src/network/parallelpeer.cpp index 28a1f12c0a..5f5e5727ba 100644 --- a/src/network/parallelpeer.cpp +++ b/src/network/parallelpeer.cpp @@ -392,9 +392,12 @@ void ParallelPeer::dataMessageReceived(const std::vector& message) { datamessagestructures::ScriptMessage sm; sm.deserialize(buffer); + // No sync or send because this has already been recived by a peer, + // don't send it back again global::scriptEngine->queueScript( sm._script, - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); break; } diff --git a/src/rendering/luaconsole.cpp b/src/rendering/luaconsole.cpp index d87833ea29..19ff81c7c9 100644 --- a/src/rendering/luaconsole.cpp +++ b/src/rendering/luaconsole.cpp @@ -76,11 +76,21 @@ namespace { openspace::properties::Property::Visibility::AdvancedUser }; - constexpr openspace::properties::Property::PropertyInfo RemoveScriptingInfo = { - "RemoteScripting", - "Remote scripting", + constexpr openspace::properties::Property::PropertyInfo ShouldBeSynchronizedInfo = { + "ShouldBeSynchronized", + "Should Be Synchronized", + "Determines whether the entered commands will only be executed locally (if this " + "is disabled), or whether they will be send to other connected nodes, for " + "example in a cluster environment", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo ShouldSendToRemoteInfo = { + "ShouldSendToRemote", + "Should Send To Remote", "Determines whether the entered commands will only be executed locally (if this " - "is disabled), or whether they will be send to connected remove instances", + "is disabled), or whether they will be send to connected remote instances (other " + "peers through a parallel connection)", openspace::properties::Property::Visibility::AdvancedUser }; @@ -134,7 +144,8 @@ namespace openspace { LuaConsole::LuaConsole() : properties::PropertyOwner({ "LuaConsole", "Lua Console" }) , _isVisible(VisibleInfo, false) - , _remoteScripting(RemoveScriptingInfo, false) + , _shouldSendToRemote(ShouldSendToRemoteInfo, false) + , _shouldBeSynchronized(ShouldBeSynchronizedInfo, true) , _backgroundColor( BackgroundColorInfo, glm::vec4(21.f / 255.f, 23.f / 255.f, 28.f / 255.f, 0.8f), @@ -157,7 +168,8 @@ LuaConsole::LuaConsole() , _autoCompleteInfo({NoAutoComplete, false, ""}) { addProperty(_isVisible); - addProperty(_remoteScripting); + addProperty(_shouldBeSynchronized); + addProperty(_shouldSendToRemote); addProperty(_historyLength); _backgroundColor.setViewOption(properties::Property::ViewOptions::Color); @@ -278,12 +290,25 @@ bool LuaConsole::keyboardCallback(Key key, KeyModifier modifier, KeyAction actio return false; } + const bool modifierShift = (modifier == KeyModifier::Shift); + const bool modifierControl = (modifier == KeyModifier::Control); + + // Button left of 1 and above TAB (default) + // Can be changed to any other key with the setCommandInputButton funciton if (key == _commandInputButton) { - // Button left of 1 and above TAB - // How to deal with different keyboard languages? ---abock if (_isVisible) { - if (_remoteScripting) { - _remoteScripting = false; + if (modifierShift) { + // Toggle ShouldBeSynchronized property for all scripts + _shouldBeSynchronized = !_shouldBeSynchronized; + } + else if (modifierControl) { + // Only allow this toggle if a ParallelConnection exists + if (_shouldSendToRemote) { + _shouldSendToRemote = false; + } + else if (global::parallelPeer->status() == ParallelConnection::Status::Host) { + _shouldSendToRemote = true; + } } else { _isVisible = false; @@ -293,9 +318,6 @@ bool LuaConsole::keyboardCallback(Key key, KeyModifier modifier, KeyAction actio } else { _isVisible = true; - if (global::parallelPeer->status() == ParallelConnection::Status::Host) { - _remoteScripting = true; - } } return true; @@ -310,10 +332,6 @@ bool LuaConsole::keyboardCallback(Key key, KeyModifier modifier, KeyAction actio return true; } - - const bool modifierControl = (modifier == KeyModifier::Control); - const bool modifierShift = (modifier == KeyModifier::Shift); - // Paste from clipboard if (modifierControl && (key == Key::V || key == Key::Y)) { addToCommand(sanitizeInput(ghoul::clipboardText())); @@ -432,8 +450,11 @@ bool LuaConsole::keyboardCallback(Key key, KeyModifier modifier, KeyAction actio if (key == Key::Enter || key == Key::KeypadEnter) { std::string cmd = _commands.at(_activeCommand); if (!cmd.empty()) { - using RemoteScripting = scripting::ScriptEngine::RemoteScripting; - global::scriptEngine->queueScript(cmd, RemoteScripting(_remoteScripting)); + global::scriptEngine->queueScript( + cmd, + scripting::ScriptEngine::ShouldBeSynchronized(_shouldBeSynchronized), + scripting::ScriptEngine::ShouldSendToRemote(_shouldSendToRemote) + ); // Only add the current command to the history if it hasn't been // executed before. We don't want two of the same commands in a row @@ -799,14 +820,22 @@ void LuaConsole::render() { const glm::vec2 loc = glm::vec2( EntryFontSize * dpi / 2.f, - res.y - _currentHeight + EntryFontSize * dpi + res.y - EntryFontSize * dpi ); const glm::vec2 bbox = _font->boundingBox(text); return glm::vec2(loc.x + res.x - bbox.x - 10.f, loc.y); }; - if (_remoteScripting) { + if (!_shouldBeSynchronized) { + const glm::vec4 Yellow(1.0f, 1.0f, 0.f, 1.f); + + const std::string masterOnlyExecutionText = + "Master only script execution (Nodes and Peers will not recieve scripts)"; + const glm::vec2 loc = locationForRightJustifiedText(masterOnlyExecutionText); + RenderFont(*_font, loc, masterOnlyExecutionText, Yellow); + } + else if (_shouldSendToRemote) { const glm::vec4 Red(1.f, 0.f, 0.f, 1.f); ParallelConnection::Status status = global::parallelPeer->status(); @@ -826,7 +855,8 @@ void LuaConsole::render() { else if (global::parallelPeer->isHost()) { const glm::vec4 LightBlue(0.4f, 0.4f, 1.f, 1.f); - const std::string localExecutionText = "Local script execution"; + const std::string localExecutionText = + "Local script execution (Peers will not recieve scripts)"; const glm::vec2 loc = locationForRightJustifiedText(localExecutionText); RenderFont(*_font, loc, localExecutionText, LightBlue); } @@ -847,7 +877,7 @@ void LuaConsole::addToCommand(std::string c) { } void LuaConsole::parallelConnectionChanged(const ParallelConnection::Status& status) { - _remoteScripting = (status == ParallelConnection::Status::Host); + _shouldSendToRemote = (status == ParallelConnection::Status::Host); } } // namespace openspace diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 7adc3ddbc4..e8d3ecbade 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -776,7 +776,8 @@ bool RenderEngine::mouseActivationCallback(const glm::dvec2& mousePosition) cons global::scriptEngine->queueScript( ToggleRotationFrictionScript, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); return true; } @@ -788,7 +789,8 @@ bool RenderEngine::mouseActivationCallback(const glm::dvec2& mousePosition) cons global::scriptEngine->queueScript( ToggleZoomFrictionScript, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); return true; } @@ -800,7 +802,8 @@ bool RenderEngine::mouseActivationCallback(const glm::dvec2& mousePosition) cons global::scriptEngine->queueScript( ToggleRollFrictionScript, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); return true; } diff --git a/src/rendering/screenspacerenderable.cpp b/src/rendering/screenspacerenderable.cpp index f3535aec34..2ddfcacca8 100644 --- a/src/rendering/screenspacerenderable.cpp +++ b/src/rendering/screenspacerenderable.cpp @@ -420,9 +420,13 @@ ScreenSpaceRenderable::ScreenSpaceRenderable(const ghoul::Dictionary& dictionary _delete.onChange([this](){ std::string script = "openspace.removeScreenSpaceRenderable('" + identifier() + "');"; + // No sync or send because this is already inside a Lua script that was triggered + // when this triggerProperty was pressed in the gui, therefor it has already been + // synced and sent to the connected nodes and peers global::scriptEngine->queueScript( script, - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); }); addProperty(_delete); diff --git a/src/scene/scene.cpp b/src/scene/scene.cpp index cbd7203a50..1fd7efcdc6 100644 --- a/src/scene/scene.cpp +++ b/src/scene/scene.cpp @@ -548,9 +548,13 @@ void Scene::updateInterpolations() { if (i.isExpired) { if (!i.postScript.empty()) { + // No sync or send because this is already inside a Lua script that was triggered + // when the interpolation of the property was triggered, therefor it has already been + // synced and sent to the connected nodes and peers global::scriptEngine->queueScript( std::move(i.postScript), - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } diff --git a/src/scripting/scriptengine.cpp b/src/scripting/scriptengine.cpp index c3f6eeb81a..1663b3b133 100644 --- a/src/scripting/scriptengine.cpp +++ b/src/scripting/scriptengine.cpp @@ -533,18 +533,24 @@ void ScriptEngine::preSync(bool isMaster) { QueueItem item = std::move(_incomingScripts.front()); _incomingScripts.pop(); - _scriptsToSync.push_back(item.script); - const bool remoteScripting = item.remoteScripting; - // Not really a received script but the master also needs to run the script... _masterScriptQueue.push(item); - if (global::parallelPeer->isHost() && remoteScripting) { - global::parallelPeer->sendScript(item.script); - } if (global::sessionRecording->isRecording()) { global::sessionRecording->saveScriptKeyframeToTimeline(item.script); } + + // Sync out to other nodes (cluster) + if (!item.shouldBeSynchronized) { + continue; + } + _scriptsToSync.push_back(item.script); + + // Send to other peers (parallel connection) + const bool shouldSendToRemote = item.shouldSendToRemote; + if (global::parallelPeer->isHost() && shouldSendToRemote) { + global::parallelPeer->sendScript(item.script); + } } } else { @@ -613,7 +619,8 @@ void ScriptEngine::postSync(bool isMaster) { } void ScriptEngine::queueScript(std::string script, - ScriptEngine::RemoteScripting remoteScripting, + ScriptEngine::ShouldBeSynchronized shouldBeSynchronized, + ScriptEngine::ShouldSendToRemote shouldSendToRemote, ScriptCallback callback) { ZoneScoped; @@ -621,7 +628,12 @@ void ScriptEngine::queueScript(std::string script, if (script.empty()) { return; } - _incomingScripts.push({ std::move(script), remoteScripting, std::move(callback) }); + _incomingScripts.push({ + std::move(script), + shouldBeSynchronized, + shouldSendToRemote, + std::move(callback) + }); } diff --git a/src/scripting/scriptscheduler.cpp b/src/scripting/scriptscheduler.cpp index bbc5cdd451..3a1d8244e4 100644 --- a/src/scripting/scriptscheduler.cpp +++ b/src/scripting/scriptscheduler.cpp @@ -262,7 +262,8 @@ void ScriptScheduler::setCurrentTime(double time) { for (const std::string& script : scheduledScripts) { global::scriptEngine->queueScript( script, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } } From aad8beb60c81f27123b16f5f19ac38de335cd923 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 7 Sep 2023 19:00:26 +0200 Subject: [PATCH 123/701] Remove warnings --- ext/ghoul | 2 +- include/openspace/documentation/documentation.h | 3 ++- include/openspace/scene/profile.h | 6 +++--- src/documentation/documentation.cpp | 2 ++ src/properties/property.cpp | 6 +++--- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/ext/ghoul b/ext/ghoul index 24486b7c56..c50518fb79 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit 24486b7c5645f41a3b13f39dbe9ae58a98abbdc9 +Subproject commit c50518fb79edd741b41130f04143605232579495 diff --git a/include/openspace/documentation/documentation.h b/include/openspace/documentation/documentation.h index b369faa06c..15ec83ce52 100644 --- a/include/openspace/documentation/documentation.h +++ b/include/openspace/documentation/documentation.h @@ -56,6 +56,7 @@ struct TestResult { * The Reason for the offense */ enum class Reason { + Unknown, ///< Unknown reason MissingKey, ///< The offending key that was requested was not found WrongType, ///< The key's value was not of the expected type Verification, ///< The value did not pass a necessary non-type verifier @@ -65,7 +66,7 @@ struct TestResult { /// this value will be the fully qualified name of the key std::string offender; /// The Reason that caused this offense - Reason reason; + Reason reason = Reason::Unknown; /// An optional explanation for when a verification fails std::string explanation; }; diff --git a/include/openspace/scene/profile.h b/include/openspace/scene/profile.h index db3e13d848..c1dbdeca07 100644 --- a/include/openspace/scene/profile.h +++ b/include/openspace/scene/profile.h @@ -101,7 +101,7 @@ public: Relative }; - Type type; + Type type = Type::Relative; std::string value; bool startPaused = false; }; @@ -129,8 +129,8 @@ public: static constexpr std::string_view Type = "goToGeo"; std::string anchor; - double latitude; - double longitude; + double latitude = 0.0; + double longitude = 0.0; std::optional altitude; }; diff --git a/src/documentation/documentation.cpp b/src/documentation/documentation.cpp index 3b66777c4c..794d00ddfb 100644 --- a/src/documentation/documentation.cpp +++ b/src/documentation/documentation.cpp @@ -105,6 +105,8 @@ template <> std::string to_string(const openspace::documentation::TestResult::Offense::Reason& value) { switch (value) { + case openspace::documentation::TestResult::Offense::Reason::Unknown: + return "Unknown"; case openspace::documentation::TestResult::Offense::Reason::MissingKey: return "Missing key"; case openspace::documentation::TestResult::Offense::Reason::UnknownIdentifier: diff --git a/src/properties/property.cpp b/src/properties/property.cpp index 93d429018b..b60276e0d9 100644 --- a/src/properties/property.cpp +++ b/src/properties/property.cpp @@ -54,9 +54,9 @@ uint64_t Property::Identifier = 0; #endif Property::Property(PropertyInfo info) - : _identifier(std::move(info.identifier)) - , _guiName(std::move(info.guiName)) - , _description(std::move(info.description)) + : _identifier(info.identifier) + , _guiName(info.guiName) + , _description(info.description) #ifdef _DEBUG , _id(Identifier++) #endif From 7bfedbdf12fe0b0a1edbea5e2a1491999fa18ce5 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Mon, 11 Sep 2023 10:44:12 +0200 Subject: [PATCH 124/701] Feature - OrbitalNavigator Setting - Orbit Around Up (#2874) * Hack to try to get desired behavior (for testing) * Add properties to control axes of rotation and whether rotation aorund up should be enabled * Generalze orbit function to just use an angle instead of speed and deltatime * Move speed scale computation to a separate function * Refactor horizontal translation code a bit * Refactor speed computation for idel behavior * Refactor/clean up orbit code * Add property docs * Add some safety checks * Apply suggestions from code review Co-authored-by: Alexander Bock * More updates based on code review --------- Co-authored-by: Alexander Bock --- .../openspace/navigation/orbitalnavigator.h | 39 ++- src/navigation/orbitalnavigator.cpp | 244 ++++++++++++------ 2 files changed, 193 insertions(+), 90 deletions(-) diff --git a/include/openspace/navigation/orbitalnavigator.h b/include/openspace/navigation/orbitalnavigator.h index cd88bfaa46..99896908c0 100644 --- a/include/openspace/navigation/orbitalnavigator.h +++ b/include/openspace/navigation/orbitalnavigator.h @@ -233,6 +233,15 @@ private: properties::BoolProperty _invertMouseButtons; + properties::BoolProperty _shouldRotateAroundUp; + + enum class UpDirectionChoice { + XAxis = 0, + YAxis, + ZAxis + }; + properties::OptionProperty _upToUseForRotation; + MouseCameraStates _mouseStates; JoystickCameraStates _joystickStates; WebsocketCameraStates _websocketStates; @@ -322,6 +331,15 @@ private: double interpolateCameraToSurfaceDistance(double deltaTime, double currentDistance, double targetDistance); + /** + * Modify the camera position and global rotation to rotate around the up vector + * of the current anchor based on x-wise input + * + * The up-vector to rotate around is determined by the "_upToUseForRotation" property + */ + void rotateAroundAnchorUp(double deltaTime, double speedScale, + glm::dvec3& cameraPosition, glm::dquat& globalCameraRotation); + /** * Translates the horizontal direction. If far from the anchor object, this will * result in an orbital rotation around the object. This function does not affect the @@ -329,8 +347,9 @@ private: * * \return a position vector adjusted in the horizontal direction. */ - glm::dvec3 translateHorizontally(double deltaTime, const glm::dvec3& cameraPosition, - const glm::dvec3& objectPosition, const glm::dquat& globalCameraRotation, + glm::dvec3 translateHorizontally(double deltaTime, double speedScale, + const glm::dvec3& cameraPosition, const glm::dvec3& objectPosition, + const glm::dquat& globalCameraRotation, const SurfacePositionHandle& positionHandle) const; /* @@ -410,13 +429,11 @@ private: * * Used for IdleBehavior::Behavior::Orbit * - * \param deltaTime The time step to use for the motion. Controls the rotation angle + * \param angle The rotation angle to use for the motion * \param position The position of the camera. Will be changed by the function * \param globalRotation The camera's global rotation. Will be changed by the function - * \param speedScale A speed scale that controls the speed of the motion */ - void orbitAnchor(double deltaTime, glm::dvec3& position, - glm::dquat& globalRotation, double speedScale); + void orbitAnchor(double angle, glm::dvec3& position, glm::dquat& globalRotation); /** * Orbit the current anchor node, by adding a rotation around the given axis. For @@ -429,13 +446,15 @@ private: * IdleBehavior::Behavior::OrbitAroundUp (axis = up = y-axis) * * \param axis The axis to arbit around, given in model coordinates of the anchor - * \param deltaTime The time step to use for the motion. Controls the rotation angle + * \param angle The rotation angle to use for the motion * \param position The position of the camera. Will be changed by the function * \param globalRotation The camera's global rotation. Will be changed by the function - * \param speedScale A speed scale that controls the speed of the motion */ - void orbitAroundAxis(const glm::dvec3 axis, double deltaTime, glm::dvec3& position, - glm::dquat& globalRotation, double speedScale); + void orbitAroundAxis(const glm::dvec3 axis, double angle, glm::dvec3& position, + glm::dquat& globalRotation); + + double rotationSpeedScaleFromCameraHeight(const glm::dvec3& cameraPosition, + const SurfacePositionHandle& positionHandle) const; }; } // namespace openspace::interaction diff --git a/src/navigation/orbitalnavigator.cpp b/src/navigation/orbitalnavigator.cpp index 3cc92030e2..cb194b3047 100644 --- a/src/navigation/orbitalnavigator.cpp +++ b/src/navigation/orbitalnavigator.cpp @@ -393,6 +393,24 @@ namespace { openspace::properties::Property::Visibility::AdvancedUser }; + constexpr openspace::properties::Property::PropertyInfo ShouldRotateAroundUpInfo = { + "ShouldRotateAroundUp", + "Should Rotate Around Up", + "When set to true, global rotation interactions in the X-direction will lead to " + "a rotation around the specified up vector instead of just around the object. " + "The up vector is the local coordinate axis, and can be set to either the X-, Y- " + "or Z-axis through the 'UpToUseForRotation' property", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo UpToUseForRotationInfo = { + "UpToUseForRotation", + "Up To Use For Rotation", + "Specifies the local coordinate axis of the anchor node to use as up direction " + "when the camera is set to orbit around up. In general, the Z-axis is a good " + "choice for globes, and the Y-axis is a good choice for models", + openspace::properties::Property::Visibility::AdvancedUser + }; } // namespace namespace openspace::interaction { @@ -498,6 +516,8 @@ OrbitalNavigator::OrbitalNavigator() , _websocketStates(_websocketSensitivity, 1 / (_friction.friction + 0.0000001)) , _disableZoom(DisableZoomInfo, false) , _disableRoll(DisableRollInfo, false) + , _shouldRotateAroundUp(ShouldRotateAroundUpInfo, false) + , _upToUseForRotation(UpToUseForRotationInfo) { _anchor.onChange([this]() { if (_anchor.value().empty()) { @@ -698,6 +718,15 @@ OrbitalNavigator::OrbitalNavigator() LINFO("Camera roll has been enabled"); } }); + + addProperty(_shouldRotateAroundUp); + _upToUseForRotation.addOptions({ + { static_cast(UpDirectionChoice::XAxis), "Local X" }, + { static_cast(UpDirectionChoice::YAxis), "Local Y" }, + { static_cast(UpDirectionChoice::ZAxis), "Local Z" } + }); + _upToUseForRotation = static_cast(UpDirectionChoice::ZAxis); + addProperty(_upToUseForRotation); } glm::dvec3 OrbitalNavigator::anchorNodeToCameraVector() const { @@ -864,9 +893,25 @@ void OrbitalNavigator::updateCameraStateFromStates(double deltaTime) { camRot.localRotation = interpolateLocalRotation(deltaTime, camRot.localRotation); camRot.localRotation = rotateLocally(deltaTime, camRot.localRotation); + double horizontalTranslationSpeedScale = + rotationSpeedScaleFromCameraHeight(pose.position, posHandle); + + // Rotation around target object's up vector based on user input + // (one kind of horizontal translation) + // Affects the position and global rotation + if (_shouldRotateAroundUp) { + rotateAroundAnchorUp( + deltaTime, + horizontalTranslationSpeedScale, + pose.position, + camRot.globalRotation + ); + } + // Horizontal translation based on user input pose.position = translateHorizontally( deltaTime, + horizontalTranslationSpeedScale, pose.position, anchorPos, camRot.globalRotation, @@ -1583,72 +1628,68 @@ double OrbitalNavigator::interpolateCameraToSurfaceDistance(double deltaTime, return result; } -glm::dvec3 OrbitalNavigator::translateHorizontally(double deltaTime, +void OrbitalNavigator::rotateAroundAnchorUp(double deltaTime, double speedScale, + glm::dvec3& cameraPosition, + glm::dquat& globalCameraRotation) +{ + const glm::dvec3 axis = [](UpDirectionChoice upAxis) { + switch (upAxis) { + case UpDirectionChoice::XAxis: + return glm::dvec3(1.0, 0.0, 0.0); + case UpDirectionChoice::YAxis: + return glm::dvec3(0.0, 1.0, 0.0); + case UpDirectionChoice::ZAxis: + return glm::dvec3(0.0, 0.0, 1.0); + default: + throw ghoul::MissingCaseException(); + } + }(UpDirectionChoice(_upToUseForRotation.value())); + + double combinedXInput = _mouseStates.globalRotationVelocity().x + + _joystickStates.globalRotationVelocity().x + + _websocketStates.globalRotationVelocity().x + + _scriptStates.globalRotationVelocity().x; + + double angle = combinedXInput * deltaTime * speedScale; + orbitAroundAxis(axis, angle, cameraPosition, globalCameraRotation); +} + +glm::dvec3 OrbitalNavigator::translateHorizontally(double deltaTime, double speedScale, const glm::dvec3& cameraPosition, const glm::dvec3& objectPosition, const glm::dquat& globalCameraRotation, const SurfacePositionHandle& positionHandle) const { - const glm::dmat4 modelTransform = _anchorNode->modelTransform(); + // If we are orbiting around an up vector, we only want to allow verical + // movement and not use the x velocity + bool useX = !_shouldRotateAroundUp; - const glm::dvec3 outDirection = glm::normalize(glm::dmat3(modelTransform) * - positionHandle.referenceSurfaceOutDirection); - - // Vector logic - const glm::dvec3 posDiff = cameraPosition - objectPosition; - const glm::dvec3 centerToActualSurfaceModelSpace = - positionHandle.centerToReferenceSurface + - positionHandle.referenceSurfaceOutDirection * positionHandle.heightToSurface; - - const glm::dvec3 centerToActualSurface = - glm::dmat3(modelTransform) * centerToActualSurfaceModelSpace; - - const glm::dvec3 actualSurfaceToCamera = posDiff - centerToActualSurface; - - const double distFromSurfaceToCamera = [&]() { - if (_constantVelocityFlight) { - const glm::dvec3 centerToRefSurface = - glm::dmat3(modelTransform) * positionHandle.centerToReferenceSurface; - const glm::dvec3 refSurfaceToCamera = posDiff - centerToRefSurface; - return glm::length(refSurfaceToCamera); - } - else { - return glm::length(actualSurfaceToCamera); - } - }(); - - // Final values to be used - const double distFromCenterToSurface = glm::length(centerToActualSurface); - const double distFromCenterToCamera = glm::length(posDiff); - - double speedScale = - distFromCenterToSurface > 0.0 ? - glm::clamp(distFromSurfaceToCamera / distFromCenterToSurface, 0.0, 1.0) : - 1.0; + double angleScale = deltaTime * speedScale; // Get rotation in camera space const glm::dquat mouseRotationDiffCamSpace = glm::dquat(glm::dvec3( - -_mouseStates.globalRotationVelocity().y * deltaTime, - -_mouseStates.globalRotationVelocity().x * deltaTime, - 0.0) * speedScale); + -_mouseStates.globalRotationVelocity().y, + useX ? -_mouseStates.globalRotationVelocity().x : 0.0, + 0.0 + ) * angleScale); const glm::dquat joystickRotationDiffCamSpace = glm::dquat(glm::dvec3( - -_joystickStates.globalRotationVelocity().y * deltaTime, - -_joystickStates.globalRotationVelocity().x * deltaTime, - 0.0) * speedScale - ); + -_joystickStates.globalRotationVelocity().y, + useX ? -_joystickStates.globalRotationVelocity().x : 0.0, + 0.0 + ) * angleScale); const glm::dquat scriptRotationDiffCamSpace = glm::dquat(glm::dvec3( - -_scriptStates.globalRotationVelocity().y * deltaTime, - -_scriptStates.globalRotationVelocity().x * deltaTime, - 0.0) * speedScale - ); + -_scriptStates.globalRotationVelocity().y, + useX ? -_scriptStates.globalRotationVelocity().x : 0.0, + 0.0 + ) * angleScale); const glm::dquat websocketRotationDiffCamSpace = glm::dquat(glm::dvec3( - -_websocketStates.globalRotationVelocity().y * deltaTime, - -_websocketStates.globalRotationVelocity().x * deltaTime, - 0.0) * speedScale - ); + -_websocketStates.globalRotationVelocity().y, + useX ? -_websocketStates.globalRotationVelocity().x : 0.0, + 0.0 + ) * angleScale); // Transform to world space const glm::dquat rotationDiffWorldSpace = globalCameraRotation * @@ -1656,10 +1697,18 @@ glm::dvec3 OrbitalNavigator::translateHorizontally(double deltaTime, websocketRotationDiffCamSpace * scriptRotationDiffCamSpace * glm::inverse(globalCameraRotation); + const glm::dmat4 modelTransform = _anchorNode->modelTransform(); + const glm::dvec3 outDirection = glm::normalize( + glm::dmat3(modelTransform) * + positionHandle.referenceSurfaceOutDirection + ); + + // Compute the vector to rotate to find the new position + const double distFromCenterToCamera = glm::length(cameraPosition - objectPosition); + const glm::dvec3 outVector = distFromCenterToCamera * outDirection; + // Rotate and find the difference vector - const glm::dvec3 rotationDiffVec3 = - (distFromCenterToCamera * outDirection) * rotationDiffWorldSpace - - (distFromCenterToCamera * outDirection); + const glm::dvec3 rotationDiffVec3 = outVector * rotationDiffWorldSpace - outVector; // Add difference to position return cameraPosition + rotationDiffVec3; @@ -1908,22 +1957,8 @@ void OrbitalNavigator::applyIdleBehavior(double deltaTime, glm::dvec3& position, SurfacePositionHandle posHandle = calculateSurfacePositionHandle(*_anchorNode, position); - const glm::dvec3 centerToActualSurfaceModelSpace = - posHandle.centerToReferenceSurface + - posHandle.referenceSurfaceOutDirection * posHandle.heightToSurface; - - const glm::dvec3 centerToActualSurface = glm::dmat3(_anchorNode->modelTransform()) * - centerToActualSurfaceModelSpace; - const glm::dvec3 centerToCamera = position - _anchorNode->worldPosition(); - const glm::dvec3 actualSurfaceToCamera = centerToCamera - centerToActualSurface; - - const double distFromSurfaceToCamera = glm::length(actualSurfaceToCamera); - const double distFromCenterToSurface = glm::length(centerToActualSurface); - - double speedScale = - distFromCenterToSurface > 0.0 ? - glm::clamp(distFromSurfaceToCamera / distFromCenterToSurface, 0.0, 1.0) : - 1.0; // same as horizontal translation + // Same speed scale as horizontal translation + double speedScale = rotationSpeedScaleFromCameraHeight(position, posHandle); speedScale *= _idleBehavior.speedScaleFactor; speedScale *= 0.05; // without this scaling, the motion is way too fast @@ -1936,6 +1971,8 @@ void OrbitalNavigator::applyIdleBehavior(double deltaTime, glm::dvec3& position, double s = _idleBehaviorDampenInterpolator.value(); speedScale *= _invertIdleBehaviorInterpolation ? (1.0 - s) : s; + double angle = deltaTime * speedScale; + // Apply the chosen behavior const IdleBehavior::Behavior choice = _idleBehavior.chosenBehavior.value_or( static_cast(_idleBehavior.defaultBehavior.value()) @@ -1943,7 +1980,7 @@ void OrbitalNavigator::applyIdleBehavior(double deltaTime, glm::dvec3& position, switch (choice) { case IdleBehavior::Behavior::Orbit: - orbitAnchor(deltaTime, position, globalRotation, speedScale); + orbitAnchor(angle, position, globalRotation); break; case IdleBehavior::Behavior::OrbitAtConstantLat: { // Assume that "north" coincides with the local z-direction @@ -1951,13 +1988,13 @@ void OrbitalNavigator::applyIdleBehavior(double deltaTime, glm::dvec3& position, // north/up, so that we can query this information rather than assuming it. // The we could also combine this idle behavior with the next const glm::dvec3 north = glm::dvec3(0.0, 0.0, 1.0); - orbitAroundAxis(north, deltaTime, position, globalRotation, speedScale); + orbitAroundAxis(north, angle, position, globalRotation); break; } case IdleBehavior::Behavior::OrbitAroundUp: { // Assume that "up" coincides with the local y-direction const glm::dvec3 up = glm::dvec3(0.0, 1.0, 0.0); - orbitAroundAxis(up, deltaTime, position, globalRotation, speedScale); + orbitAroundAxis(up, angle, position, globalRotation); break; } default: @@ -1965,15 +2002,15 @@ void OrbitalNavigator::applyIdleBehavior(double deltaTime, glm::dvec3& position, } } -void OrbitalNavigator::orbitAnchor(double deltaTime, glm::dvec3& position, - glm::dquat& globalRotation, double speedScale) +void OrbitalNavigator::orbitAnchor(double angle, glm::dvec3& position, + glm::dquat& globalRotation) { ghoul_assert(_anchorNode != nullptr, "Node to orbit must be set"); // Apply a rotation to the right, in camera space // (Maybe we should also let the user decide which direction to rotate? // Or provide a few different orbit options) - const glm::dvec3 eulerAngles = glm::dvec3(0.0, -1.0, 0.0) * deltaTime * speedScale; + const glm::dvec3 eulerAngles = glm::dvec3(0.0, -1.0, 0.0) * angle; const glm::dquat rotationDiffCameraSpace = glm::dquat(eulerAngles); const glm::dquat rotationDiffWorldSpace = globalRotation * @@ -1988,18 +2025,20 @@ void OrbitalNavigator::orbitAnchor(double deltaTime, glm::dvec3& position, position += rotationDiffVec3; } -void OrbitalNavigator::orbitAroundAxis(const glm::dvec3 axis, double deltaTime, - glm::dvec3& position, glm::dquat& globalRotation, - double speedScale) +void OrbitalNavigator::orbitAroundAxis(const glm::dvec3 axis, double angle, + glm::dvec3& position, glm::dquat& globalRotation) { ghoul_assert(_anchorNode != nullptr, "Node to orbit must be set"); + if (glm::abs(angle) < AngleEpsilon) { + return; + } + const glm::dmat4 modelTransform = _anchorNode->modelTransform(); const glm::dvec3 axisInWorldSpace = glm::normalize(glm::dmat3(modelTransform) * glm::normalize(axis)); // Compute rotation to be applied around the axis - double angle = deltaTime * speedScale; const glm::dquat spinRotation = glm::angleAxis(angle, axisInWorldSpace); // Rotate the position vector from the center to camera and update position @@ -2007,6 +2046,10 @@ void OrbitalNavigator::orbitAroundAxis(const glm::dvec3 axis, double deltaTime, const glm::dvec3 rotationDiffVec3 = spinRotation * anchorCenterToCamera - anchorCenterToCamera; + if (glm::length(rotationDiffVec3) == 0.0) { + return; + } + position += rotationDiffVec3; // Also apply the rotation to the global rotation, so the camera up vector is @@ -2014,6 +2057,47 @@ void OrbitalNavigator::orbitAroundAxis(const glm::dvec3 axis, double deltaTime, globalRotation = spinRotation * globalRotation; } +double OrbitalNavigator::rotationSpeedScaleFromCameraHeight( + const glm::dvec3& cameraPosition, + const SurfacePositionHandle& positionHandle) const +{ + const glm::dmat4 modelTransform = _anchorNode->modelTransform(); + const glm::dvec3 anchorPos = _anchorNode->worldPosition(); + + const glm::dvec3 outDirection = glm::normalize( + glm::dmat3(modelTransform) * + positionHandle.referenceSurfaceOutDirection + ); + + const glm::dvec3 posDiff = cameraPosition - anchorPos; + const glm::dvec3 centerToActualSurfaceModelSpace = + positionHandle.centerToReferenceSurface + + positionHandle.referenceSurfaceOutDirection * positionHandle.heightToSurface; + + const glm::dvec3 centerToActualSurface = + glm::dmat3(modelTransform) * centerToActualSurfaceModelSpace; + + const glm::dvec3 actualSurfaceToCamera = posDiff - centerToActualSurface; + + const double distFromSurfaceToCamera = [&]() { + if (_constantVelocityFlight) { + const glm::dvec3 centerToRefSurface = + glm::dmat3(modelTransform) * positionHandle.centerToReferenceSurface; + const glm::dvec3 refSurfaceToCamera = posDiff - centerToRefSurface; + return glm::length(refSurfaceToCamera); + } + else { + return glm::length(actualSurfaceToCamera); + } + }(); + + const double distFromCenterToSurface = glm::length(centerToActualSurface); + + return distFromCenterToSurface > 0.0 ? + glm::clamp(distFromSurfaceToCamera / distFromCenterToSurface, 0.0, 1.0) : + 1.0; +} + scripting::LuaLibrary OrbitalNavigator::luaLibrary() { return { "orbitalnavigation", From d77836d910d309587ad1346d6dae8c99fc0aabbb Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Mon, 11 Sep 2023 11:04:46 +0200 Subject: [PATCH 125/701] Feature/arrow renderable (#2219) * Create a RenderableNodeLine example asset * First version of node direction hint renderable (arrow) * Add possibility to set length as a multiplier of the bounding sphere * Draw arrow cylinder using index array * Update exponents and min max values for lengths * Draw arrow head * Only update arrow geometry when positions change * Add some properties to control visuals of arrow * Implement invert option * Add normals and shading * Set arrow head size by length percentage instead of angle * Add bottom circle to cone * Cleanup and update examples * Remove non-existing property from example asset * Fix vertices not updating if anchor node was changed And some missing updates on property change * Start cleaning up some shape rendering helper functions * Cleanup code and move cylinder function to helper class * Refactor cylinder creation code (fewer loops over same vector) * Update transformations to correctly scale and place arrow * Add the cone to make the arrowhead * Update faulty triangle normals * Add property visibilities * Rename NodeDirectionHint to NodeArrow * Apply suggestions from code review Co-authored-by: Alexander Bock --------- Co-authored-by: Alexander Bock --- data/assets/examples/nodearrow.asset | 77 +++ data/assets/examples/nodeline.asset | 43 ++ include/openspace/rendering/helper.h | 32 +- modules/base/CMakeLists.txt | 4 + modules/base/basemodule.cpp | 3 + .../base/rendering/renderablenodearrow.cpp | 515 ++++++++++++++++++ modules/base/rendering/renderablenodearrow.h | 103 ++++ modules/base/rendering/renderableprism.cpp | 48 +- modules/base/shaders/arrow_fs.glsl | 75 +++ modules/base/shaders/arrow_vs.glsl | 47 ++ src/rendering/helper.cpp | 287 +++++++++- 11 files changed, 1176 insertions(+), 58 deletions(-) create mode 100644 data/assets/examples/nodearrow.asset create mode 100644 data/assets/examples/nodeline.asset create mode 100644 modules/base/rendering/renderablenodearrow.cpp create mode 100644 modules/base/rendering/renderablenodearrow.h create mode 100644 modules/base/shaders/arrow_fs.glsl create mode 100644 modules/base/shaders/arrow_vs.glsl diff --git a/data/assets/examples/nodearrow.asset b/data/assets/examples/nodearrow.asset new file mode 100644 index 0000000000..ef851baa48 --- /dev/null +++ b/data/assets/examples/nodearrow.asset @@ -0,0 +1,77 @@ +local earth = asset.require("scene/solarsystem/planets/earth/earth") +local moon = asset.require("scene/solarsystem/planets/earth/moon/moon") +local mars = asset.require("scene/solarsystem/planets/mars/mars") + + + +local EarthRadius = 6371000.0 + +local ArrowExample = { + Identifier = "RenderableNodeArrowExample", + Parent = earth.Earth.Identifier, + Renderable = { + Type = "RenderableNodeArrow", + StartNode = earth.Earth.Identifier, + EndNode = mars.Mars.Identifier, + Color = { 0.8, 1.0, 0.8 }, + Offset = 2 * EarthRadius, + Length = 5 * EarthRadius, + Width = 900000.0 + }, + GUI = { + Name = "Node Arrow Example", + Path = "/Example", + Description = [[Example node direction arrow, using absolute sizes]] + } +} + +-- Relative values: Multiplied with bounding sphere +local ArrowExample_RelativeUnits = { + Identifier = "RenderableNodeArrowExample_Relative", + Parent = earth.Earth.Identifier, + Renderable = { + Type = "RenderableNodeArrow", + StartNode = earth.Earth.Identifier, + EndNode = moon.Moon.Identifier, + Color = { 0.78, 0.0, 1.0 }, + UseRelativeOffset = true, + UseRelativeLength = true, + Offset = 2.0, + Length = 5.0, + Width = 900000.0, + Invert = true -- Point to start node instead of end node + }, + GUI = { + Name = "Node Arrow Example (relative units)", + Path = "/Example", + Description = [[Example node direction arrow, using relative sizes]] + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(ArrowExample) + openspace.addSceneGraphNode(ArrowExample_RelativeUnits) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(ArrowExample_RelativeUnits) + openspace.removeSceneGraphNode(ArrowExample) +end) + +asset.export(ArrowExample) +asset.export(ArrowExample_RelativeUnits) + + + +asset.meta = { + Name = "RenderableNodeArrow Example asset", + Version = "1.0", + Description = [[Examples of the RenderableNodeArrow renderable, that can be used to draw + an arrow pointing from one scene graph node in the direction of another. Note that + the arrows are generated as objects in 3D space and need to have a size that is + suitable for their 3D context.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/examples/nodeline.asset b/data/assets/examples/nodeline.asset new file mode 100644 index 0000000000..7f0edb27cb --- /dev/null +++ b/data/assets/examples/nodeline.asset @@ -0,0 +1,43 @@ +local earth = asset.require("scene/solarsystem/planets/earth/earth") +local mars = asset.require("scene/solarsystem/planets/mars/mars") + + + +local RenderableNodeLineExample = { + Identifier = "RenderableNodeLineExample", + Renderable = { + Type = "RenderableNodeLine", + StartNode = earth.Earth.Identifier, + EndNode = mars.Mars.Identifier, + Color = { 0.5, 0.5, 0.5 }, + LineWidth = 2 + }, + GUI = { + Name = "RenderableNodeLine Example", + Path = "/Example", + Description = [[Draws a line between two nodes in the scene.]] + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(RenderableNodeLineExample) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(RenderableNodeLineExample) +end) + +asset.export(RenderableNodeLineExample) + + + +asset.meta = { + Name = "RenderableNodeLine Example asset", + Version = "1.0", + Description = [[Example of a RenderableNodeLine, that can be used to draw an line + between two scene graph nodes.]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/include/openspace/rendering/helper.h b/include/openspace/rendering/helper.h index 0770617383..ddff046cd4 100644 --- a/include/openspace/rendering/helper.h +++ b/include/openspace/rendering/helper.h @@ -89,6 +89,22 @@ struct VertexObjects { int nElements = 64; } sphere; + struct { + GLuint vao = 0; + GLuint vbo = 0; + GLuint ibo = 0; + + int nElements = 64; + } cylinder; + + struct { + GLuint vao = 0; + GLuint vbo = 0; + GLuint ibo = 0; + + int nElements = 64; + } cone; + struct { GLuint vao = 0; } empty; @@ -119,6 +135,12 @@ struct VertexXYZNormal { GLfloat normal[3]; }; +template +struct VertexIndexListCombo { + std::vector vertices; + std::vector indices; +}; + VertexXYZ convertToXYZ(const Vertex& v); std::vector convert(std::vector v); @@ -126,9 +148,17 @@ std::vector convert(std::vector v); std::vector createRing(int nSegments, float radius, glm::vec4 colors = glm::vec4(1.f)); -std::pair, std::vector> +std::vector createRingXYZ(int nSegments, float radius); + +VertexIndexListCombo createSphere(int nSegments, glm::vec3 radii, glm::vec4 colors = glm::vec4(1.f)); +VertexIndexListCombo createCylinder(unsigned int nSegments, + float radius, float height); + +VertexIndexListCombo createCone(unsigned int nSegments, float radius, + float height); + /** * Data structure that can be used for rendering using multiple light directions */ diff --git a/modules/base/CMakeLists.txt b/modules/base/CMakeLists.txt index a0a14901f6..6559ad54b3 100644 --- a/modules/base/CMakeLists.txt +++ b/modules/base/CMakeLists.txt @@ -48,6 +48,7 @@ set(HEADER_FILES rendering/renderabledisc.h rendering/renderablelabel.h rendering/renderablemodel.h + rendering/renderablenodearrow.h rendering/renderablenodeline.h rendering/renderableplane.h rendering/renderableplaneimagelocal.h @@ -106,6 +107,7 @@ set(SOURCE_FILES rendering/renderabledisc.cpp rendering/renderablelabel.cpp rendering/renderablemodel.cpp + rendering/renderablenodearrow.cpp rendering/renderablenodeline.cpp rendering/renderableplane.cpp rendering/renderableplaneimagelocal.cpp @@ -142,6 +144,8 @@ set(SOURCE_FILES source_group("Source Files" FILES ${SOURCE_FILES}) set(SHADER_FILES + shaders/arrow_fs.glsl + shaders/arrow_vs.glsl shaders/axes_fs.glsl shaders/axes_vs.glsl shaders/disc_fs.glsl diff --git a/modules/base/basemodule.cpp b/modules/base/basemodule.cpp index 8b8bbf2bc5..9939cea058 100644 --- a/modules/base/basemodule.cpp +++ b/modules/base/basemodule.cpp @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -136,6 +137,7 @@ void BaseModule::internalInitialize(const ghoul::Dictionary&) { fRenderable->registerClass("RenderableGrid"); fRenderable->registerClass("RenderableLabel"); fRenderable->registerClass("RenderableModel"); + fRenderable->registerClass("RenderableNodeArrow"); fRenderable->registerClass("RenderableNodeLine"); fRenderable->registerClass("RenderablePlaneImageLocal"); fRenderable->registerClass("RenderablePlaneImageOnline"); @@ -222,6 +224,7 @@ std::vector BaseModule::documentations() const { RenderableGrid::Documentation(), RenderableLabel::Documentation(), RenderableModel::Documentation(), + RenderableNodeArrow::Documentation(), RenderableNodeLine::Documentation(), RenderablePlane::Documentation(), RenderablePlaneImageLocal::Documentation(), diff --git a/modules/base/rendering/renderablenodearrow.cpp b/modules/base/rendering/renderablenodearrow.cpp new file mode 100644 index 0000000000..1a6983874d --- /dev/null +++ b/modules/base/rendering/renderablenodearrow.cpp @@ -0,0 +1,515 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2023 * + * * + * 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 +#include +#include +#include + +namespace { + constexpr std::string_view _loggerCat = "RenderableNodeArrow"; + + constexpr openspace::properties::Property::PropertyInfo StartNodeInfo = { + "StartNode", + "Start Node", + "The identifier of the node the arrow starts from", + openspace::properties::Property::Visibility::NoviceUser + }; + + constexpr openspace::properties::Property::PropertyInfo EndNodeInfo = { + "EndNode", + "End Node", + "The identifier of the node the arrow should point towards", + openspace::properties::Property::Visibility::NoviceUser + }; + + constexpr openspace::properties::Property::PropertyInfo ColorInfo = { + "Color", + "Color", + "This value determines the RGB color for the arrow", + openspace::properties::Property::Visibility::NoviceUser + }; + + constexpr openspace::properties::Property::PropertyInfo SegmentsInfo = { + "Segments", + "Number of Segments", + "This value specifies the number of segments that the shapes for the arrow are " + "separated in. A higher number leads to a higher resolution", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo InvertInfo = { + "Invert", + "Invert Direction", + "If set to true, the arrow direction is inverted so that it points to the " + "start node instead of the end node", + openspace::properties::Property::Visibility::NoviceUser + }; + + constexpr openspace::properties::Property::PropertyInfo ArrowHeadSizeInfo = { + "ArrowHeadSize", + "Arrow Head Size", + "This size of the arrow head, given in relative value of the entire length of " + "the arrow. For example, 0.1 makes the arrow head length be 10% of the full " + "arrow length", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo ArrowHeadWidthInfo = { + "ArrowHeadWidthFactor", + "Arrow Head Width Factor", + "A factor that is multiplied with the width, or the arrow itself, to determine " + "the width of the base of the arrow head", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo OffsetDistanceInfo = { + "Offset", + "Offset Distance", + "The distance from the center of the start node where the arrow starts. " + "If 'UseRelativeOffset' is true, the value should be given as a factor to " + "multiply with the bounding sphere of the node. Otherwise, the value is " + "specified in meters", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo RelativeOffsetInfo = { + "UseRelativeOffset", + "Use Relative Offset Distance", + "Decide whether to use relative distances (in units of start node bounding " + "sphere) for the offset distance. If false, meters is used", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo LengthInfo = { + "Length", + "Length", + "The length of the arrow, given either in meters or as a factor to be " + "multiplied with the bounding sphere of the start node (if " + "'UseRelativeLength' is true)", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo RelativeLengthInfo = { + "UseRelativeLength", + "Use Relative Length", + "Decide whether to use relative size (in units of start node bounding " + "sphere) for the length of the arrow. If false, meters is used", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo WidthInfo = { + "Width", + "Width", + "This value specifies the width of the arrow shape", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo AmbientIntensityInfo = { + "AmbientIntensity", + "Ambient Intensity", + "A multiplier for ambient lighting for the shading of the arrow", + openspace::properties::Property::Visibility::User + }; + + constexpr openspace::properties::Property::PropertyInfo DiffuseIntensityInfo = { + "DiffuseIntensity", + "Diffuse Intensity", + "A multiplier for diffuse lighting for the shading of the arrow", + openspace::properties::Property::Visibility::User + }; + + constexpr openspace::properties::Property::PropertyInfo SpecularIntensityInfo = { + "SpecularIntensity", + "Specular Intensity", + "A multiplier for specular lighting for the shading of the arrow", + openspace::properties::Property::Visibility::User + }; + + constexpr openspace::properties::Property::PropertyInfo ShadingEnabledInfo = { + "PerformShading", + "Perform Shading", + "This value determines whether shading should be applied to the arrow model", + openspace::properties::Property::Visibility::User + }; + + struct [[codegen::Dictionary(RenderableNodeArrow)]] Parameters { + // [[codegen::verbatim(StartNodeInfo.description)]] + std::string startNode [[codegen::notempty]]; + + // [[codegen::verbatim(EndNodeInfo.description)]] + std::string endNode [[codegen::notempty]]; + + // [[codegen::verbatim(ColorInfo.description)]] + std::optional color [[codegen::color()]]; + + // [[codegen::verbatim(SegmentsInfo.description)]] + std::optional segments [[codegen::greaterequal(3)]]; + + // [[codegen::verbatim(InvertInfo.description)]] + std::optional invert; + + // [[codegen::verbatim(ArrowHeadSizeInfo.description)]] + std::optional arrowHeadSize [[codegen::greaterequal(0.f)]]; + + // [[codegen::verbatim(ArrowHeadWidthInfo.description)]] + std::optional arrowHeadWidthFactor [[codegen::greaterequal(0.f)]]; + + // [[codegen::verbatim(OffsetDistanceInfo.description)]] + std::optional offset; + + // [[codegen::verbatim(RelativeOffsetInfo.description)]] + std::optional useRelativeOffset; + + // [[codegen::verbatim(LengthInfo.description)]] + std::optional length [[codegen::greaterequal(0.f)]]; + + // [[codegen::verbatim(RelativeLengthInfo.description)]] + std::optional useRelativeLength; + + // [[codegen::verbatim(WidthInfo.description)]] + std::optional width [[codegen::greaterequal(0.f)]]; + + // [[codegen::verbatim(ShadingEnabledInfo.description)]] + std::optional performShading; + + // [[codegen::verbatim(AmbientIntensityInfo.description)]] + std::optional ambientIntensity [[codegen::greaterequal(0.f)]]; + + // [[codegen::verbatim(DiffuseIntensityInfo.description)]] + std::optional diffuseIntensity [[codegen::greaterequal(0.f)]]; + + // [[codegen::verbatim(SpecularIntensityInfo.description)]] + std::optional specularIntensity [[codegen::greaterequal(0.f)]]; + }; +#include "renderablenodearrow_codegen.cpp" + + void updateDistanceBasedOnRelativeValues(const std::string& nodeName, + bool useRelative, + openspace::properties::FloatProperty& prop) + { + using namespace::openspace; + + SceneGraphNode* startNode = sceneGraphNode(nodeName); + if (!startNode) { + LERROR(fmt::format("Could not find start node '{}'", nodeName)); + return; + } + const double boundingSphere = startNode->boundingSphere(); + + if (!useRelative) { + // Recompute distance (previous value was relative) + prop = static_cast(prop * boundingSphere); + prop.setExponent(11.f); + prop.setMaxValue(1e20f); + } + else { + // Recompute distance (previous value was in meters) + if (boundingSphere < std::numeric_limits::epsilon()) { + LERROR(fmt::format( + "Start node '{}' has invalid bounding sphere", nodeName + )); + return; + } + prop = static_cast(prop / boundingSphere); + prop.setExponent(3.f); + prop.setMaxValue(1000.f); + } + // @TODO (emmbr, 2022-08-22): make GUI update when min/max value is updated + }; +} // namespace + +namespace openspace { + +documentation::Documentation RenderableNodeArrow::Documentation() { + return codegen::doc("base_renderable_renderablenodearrow"); +} + +RenderableNodeArrow::Shading::Shading() + : properties::PropertyOwner({ "Shading" }) + , enabled(ShadingEnabledInfo, true) + , ambientIntensity(AmbientIntensityInfo, 0.2f, 0.f, 1.f) + , diffuseIntensity(DiffuseIntensityInfo, 0.7f, 0.f, 1.f) + , specularIntensity(SpecularIntensityInfo, 0.f, 0.f, 1.f) +{ + addProperty(enabled); + addProperty(ambientIntensity); + addProperty(diffuseIntensity); + addProperty(specularIntensity); +} + +RenderableNodeArrow::RenderableNodeArrow(const ghoul::Dictionary& dictionary) + : Renderable(dictionary) + , _start(StartNodeInfo) + , _end(EndNodeInfo) + , _color(ColorInfo, glm::vec3(1.f), glm::vec3(0.f), glm::vec3(1.f)) + , _segments(SegmentsInfo, 10, 3, 100) + , _invertArrowDirection(InvertInfo, false) + , _arrowHeadSize(ArrowHeadSizeInfo, 0.1f, 0.f, 1.f) + , _arrowHeadWidthFactor(ArrowHeadWidthInfo, 2.f, 1.f, 100.f) + , _offsetDistance(OffsetDistanceInfo, 0.f, 0.f, 1e20f) + , _useRelativeOffset(RelativeOffsetInfo, false) + , _length(LengthInfo, 100.f, 0.f, 1e20f) + , _useRelativeLength(RelativeLengthInfo, false) + , _width(WidthInfo, 10.f, 0.f, 1e11f) +{ + const Parameters p = codegen::bake(dictionary); + + _shading.enabled = p.performShading.value_or(_shading.enabled); + _shading.ambientIntensity = p.ambientIntensity.value_or(_shading.ambientIntensity); + _shading.diffuseIntensity = p.diffuseIntensity.value_or(_shading.diffuseIntensity); + _shading.specularIntensity = p.specularIntensity.value_or(_shading.specularIntensity); + addPropertySubOwner(_shading); + + addProperty(Fadeable::_opacity); + + _color = p.color.value_or(_color); + _color.setViewOption(properties::Property::ViewOptions::Color); + addProperty(_color); + + _start = p.startNode; + addProperty(_start); + + _end = p.endNode; + addProperty(_end); + + _segments = p.segments.value_or(_segments); + addProperty(_segments); + + _invertArrowDirection = p.invert.value_or(_invertArrowDirection); + addProperty(_invertArrowDirection); + + _arrowHeadSize = p.arrowHeadSize.value_or(_arrowHeadSize); + addProperty(_arrowHeadSize); + + _arrowHeadWidthFactor = p.arrowHeadWidthFactor.value_or(_arrowHeadWidthFactor); + addProperty(_arrowHeadWidthFactor); + + _width = p.width.value_or(_width); + _width.setExponent(10.f); + addProperty(_width); + + _useRelativeLength.onChange([this]() { + updateDistanceBasedOnRelativeValues(_start, _useRelativeLength, _length); + }); + _useRelativeLength = p.useRelativeLength.value_or(_useRelativeLength); + + _length = p.length.value_or(_length); + if (!_useRelativeLength) { + _length.setExponent(11.f); + } + addProperty(_length); + + _useRelativeOffset.onChange([this]() { + updateDistanceBasedOnRelativeValues(_start, _useRelativeOffset, _offsetDistance); + }); + _useRelativeOffset = p.useRelativeOffset.value_or(_useRelativeOffset); + + _offsetDistance = p.offset.value_or(_offsetDistance); + if (!_useRelativeOffset) { + _offsetDistance.setExponent(11.f); + } + addProperty(_offsetDistance); + + addProperty(_useRelativeLength); + addProperty(_useRelativeOffset); +} + +void RenderableNodeArrow::initializeGL() { + _shaderProgram = BaseModule::ProgramObjectManager.request( + "NodeDirectionLineProgram", + []() -> std::unique_ptr { + return global::renderEngine->buildRenderProgram( + "NodeDirectionLineProgram", + absPath("${MODULE_BASE}/shaders/arrow_vs.glsl"), + absPath("${MODULE_BASE}/shaders/arrow_fs.glsl") + ); + } + ); +} + +void RenderableNodeArrow::deinitializeGL() { + BaseModule::ProgramObjectManager.release( + "NodeDirectionLineProgram", + [](ghoul::opengl::ProgramObject* p) { + global::renderEngine->removeRenderProgram(p); + } + ); + _shaderProgram = nullptr; +} + +bool RenderableNodeArrow::isReady() const { + return _shaderProgram; +} + +void RenderableNodeArrow::updateShapeTransforms(const RenderData& data) { + SceneGraphNode* startNode = sceneGraphNode(_start); + SceneGraphNode* endNode = sceneGraphNode(_end); + + if (!startNode) { + LERROR(fmt::format("Could not find start node '{}'", _start.value())); + return; + } + + if (!endNode) { + LERROR(fmt::format("Could not find end node '{}'", _end.value())); + return; + } + + const double boundingSphere = startNode->boundingSphere(); + bool hasNoBoundingSphere = boundingSphere < std::numeric_limits::epsilon(); + + if (hasNoBoundingSphere && (_useRelativeLength || _useRelativeOffset)) { + LERROR(fmt::format( + "Node '{}' has no valid bounding sphere. Can not use relative values", + _end.value() + )); + return; + } + + double offset = static_cast(_offsetDistance); + if (_useRelativeOffset) { + offset *= boundingSphere; + } + + double length = static_cast(_length); + if (_useRelativeLength) { + length *= boundingSphere; + } + + // Take additional transformation scale into account + const glm::dmat4 s = glm::scale( + glm::dmat4(1.0), + glm::dvec3(data.modelTransform.scale) + ); + + // Update the position based on the arrowDirection of the nodes + glm::dvec3 startNodePos = startNode->worldPosition(); + glm::dvec3 endNodePos = endNode->worldPosition(); + + glm::dvec3 arrowDirection = glm::normalize(endNodePos - startNodePos); + glm::dvec3 startPos = glm::dvec3(startNodePos + offset * arrowDirection); + glm::dvec3 endPos = glm::dvec3(startPos + length * arrowDirection); + + if (_invertArrowDirection) { + std::swap(startPos, endPos); + arrowDirection *= -1.0; + } + + double coneLength = _arrowHeadSize * length; + double cylinderLength = length - coneLength; + double arrowHeadWidth = _width * _arrowHeadWidthFactor; + + // Create transformation matrices to reshape to size and position + _cylinderTranslation = glm::translate(glm::dmat4(1.0), startPos); + glm::dvec3 cylinderScale = glm::dvec3(s * glm::dvec4(_width, _width, cylinderLength, 0.0)); + _cylinderScale = glm::scale(glm::dmat4(1.0), cylinderScale); + + // Adapt arrow head start to scaled size + glm::dvec3 arrowHeadStartPos = startPos + cylinderScale.z * arrowDirection; + + _coneTranslation = glm::translate(glm::dmat4(1.0), arrowHeadStartPos); + glm::dvec3 coneScale = glm::dvec3(arrowHeadWidth, arrowHeadWidth, coneLength); + _coneScale = s * glm::scale(glm::dmat4(1.0), coneScale); + + // Rotation to point at the end node + glm::quat rotQuat = glm::rotation(glm::dvec3(0.0, 0.0, 1.0), arrowDirection); + _pointDirectionRotation = glm::dmat4(glm::toMat4(rotQuat)); +} + +void RenderableNodeArrow::render(const RenderData& data, RendererTasks&) { + updateShapeTransforms(data); + + // Cylinder transforms + glm::dmat4 modelTransform = + _cylinderTranslation * _pointDirectionRotation * _cylinderScale; + glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * modelTransform; + glm::dmat4 normalTransform = glm::transpose(glm::inverse(modelViewTransform)); + + _shaderProgram->activate(); + + _shaderProgram->setUniform("modelViewTransform", glm::mat4(modelViewTransform)); + _shaderProgram->setUniform("projectionTransform", data.camera.projectionMatrix()); + _shaderProgram->setUniform("normalTransform", glm::mat3(normalTransform)); + + _shaderProgram->setUniform("color", _color); + _shaderProgram->setUniform("opacity", opacity()); + + _shaderProgram->setUniform("ambientIntensity", _shading.ambientIntensity); + _shaderProgram->setUniform("diffuseIntensity", _shading.diffuseIntensity); + _shaderProgram->setUniform("specularIntensity", _shading.specularIntensity); + _shaderProgram->setUniform("performShading", _shading.enabled); + + // Change GL state: + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnablei(GL_BLEND, 0); + + // Draw cylinder + glBindVertexArray(rendering::helper::vertexObjects.cylinder.vao); + glDrawElements( + GL_TRIANGLES, + rendering::helper::vertexObjects.cylinder.nElements, + GL_UNSIGNED_SHORT, + nullptr + ); + + // Update transforms and render cone + modelTransform = _coneTranslation * _pointDirectionRotation * _coneScale; + modelViewTransform = data.camera.combinedViewMatrix() * modelTransform; + normalTransform = glm::transpose(glm::inverse(modelViewTransform)); + + _shaderProgram->setUniform("modelViewTransform", glm::mat4(modelViewTransform)); + _shaderProgram->setUniform("normalTransform", glm::mat3(normalTransform)); + + glBindVertexArray(rendering::helper::vertexObjects.cone.vao); + glDrawElements( + GL_TRIANGLES, + rendering::helper::vertexObjects.cone.nElements, + GL_UNSIGNED_SHORT, + nullptr + ); + + // Restore GL State + glBindVertexArray(0); + global::renderEngine->openglStateCache().resetBlendState(); + + _shaderProgram->deactivate(); +} + +} // namespace openspace diff --git a/modules/base/rendering/renderablenodearrow.h b/modules/base/rendering/renderablenodearrow.h new file mode 100644 index 0000000000..f51bafbc28 --- /dev/null +++ b/modules/base/rendering/renderablenodearrow.h @@ -0,0 +1,103 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2023 * + * * + * 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_BASE___RENDERABLENODEARROW___H__ +#define __OPENSPACE_MODULE_BASE___RENDERABLENODEARROW___H__ + +#include + +#include +#include +#include +#include +#include +#include + +namespace ghoul::opengl { class ProgramObject; } + +namespace openspace { + +namespace documentation { struct Documentation; } +class Translation; + +/** + * Generates an arrow shape that points from the start node to the + * end node + */ +class RenderableNodeArrow : public Renderable { +public: + RenderableNodeArrow(const ghoul::Dictionary& dictionary); + ~RenderableNodeArrow() override = default; + + void initializeGL() override; + void deinitializeGL() override; + + bool isReady() const override; + void render(const RenderData& data, RendererTasks& rendererTask) override; + + static documentation::Documentation Documentation(); + +private: + struct Shading : properties::PropertyOwner { + Shading(); + properties::BoolProperty enabled; + properties::FloatProperty ambientIntensity; + properties::FloatProperty diffuseIntensity; + properties::FloatProperty specularIntensity; + }; + + void updateShapeTransforms(const RenderData& data); + + Shading _shading; + + ghoul::opengl::ProgramObject* _shaderProgram; + + properties::StringProperty _start; + properties::StringProperty _end; + properties::Vec3Property _color; + + properties::UIntProperty _segments; + properties::BoolProperty _invertArrowDirection; + + properties::FloatProperty _arrowHeadSize; + properties::FloatProperty _arrowHeadWidthFactor; + + properties::FloatProperty _offsetDistance; + properties::BoolProperty _useRelativeOffset; + properties::FloatProperty _length; + properties::BoolProperty _useRelativeLength; + properties::FloatProperty _width; + + glm::dmat4 _cylinderTranslation = glm::dmat4(1.0); + glm::dmat4 _cylinderScale = glm::dmat4(1.0); + + glm::dmat4 _coneTranslation = glm::dmat4(1.0); + glm::dmat4 _coneScale = glm::dmat4(1.0); + + glm::dmat4 _pointDirectionRotation = glm::dmat4(1.0); +}; + +} // namespace openspace + +#endif // __OPENSPACE_MODULE_BASE___RENDERABLENODEARROW___H__ diff --git a/modules/base/rendering/renderableprism.cpp b/modules/base/rendering/renderableprism.cpp index 308391b9c3..04fe0a22ad 100644 --- a/modules/base/rendering/renderableprism.cpp +++ b/modules/base/rendering/renderableprism.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -98,20 +99,6 @@ namespace { openspace::properties::Property::Visibility::User }; - // Generate vertices around the unit circle on the XY-plane - std::vector unitCircleVertices(int sectorCount) { - std::vector vertices; - vertices.reserve(2 * sectorCount); - float sectorStep = glm::two_pi() / sectorCount; - - for (int i = 0; i < sectorCount; ++i) { - float sectorAngle = i * sectorStep; - vertices.push_back(cos(sectorAngle)); // x - vertices.push_back(sin(sectorAngle)); // y - } - return vertices; - } - struct [[codegen::Dictionary(RenderablePrism)]] Parameters { // [[codegen::verbatim(SegmentsInfo.description)]] int segments; @@ -236,17 +223,16 @@ void RenderablePrism::updateVertexData() { _vertexArray.clear(); _indexArray.clear(); + using namespace rendering::helper; + // Get unit circle vertices on the XY-plane - std::vector unitVertices = unitCircleVertices(_nShapeSegments); - std::vector unitVerticesLines = unitCircleVertices(_nLines); + std::vector unitVertices = createRingXYZ(_nShapeSegments.value(), 1.f); + std::vector unitVerticesLines = createRingXYZ(_nLines.value(), 1.f); // Put base vertices into array - for (int j = 0, k = 0; - j < _nShapeSegments && k < static_cast(unitVertices.size()); - ++j, k += 2) - { - float ux = unitVertices[k]; - float uy = unitVertices[k + 1]; + for (int j = 0; j < _nShapeSegments; ++j) { + float ux = unitVertices[j].xyz[0]; + float uy = unitVertices[j].xyz[1]; _vertexArray.push_back(ux * _baseRadius); // x _vertexArray.push_back(uy * _baseRadius); // y @@ -254,12 +240,9 @@ void RenderablePrism::updateVertexData() { } // Put top shape vertices into array - for (int j = 0, k = 0; - j < _nShapeSegments && k < static_cast(unitVertices.size()); - ++j, k += 2) - { - float ux = unitVertices[k]; - float uy = unitVertices[k + 1]; + for (int j = 0; j < _nShapeSegments; ++j) { + float ux = unitVertices[j].xyz[0]; + float uy = unitVertices[j].xyz[1]; _vertexArray.push_back(ux * _radius); // x _vertexArray.push_back(uy * _radius); // y @@ -280,12 +263,9 @@ void RenderablePrism::updateVertexData() { _vertexArray.push_back(_length); } else { - for (int j = 0, k = 0; - j < _nLines && k < static_cast(unitVerticesLines.size()); - ++j, k += 2) - { - float ux = unitVerticesLines[k]; - float uy = unitVerticesLines[k + 1]; + for (int j = 0; j < _nLines; ++j) { + float ux = unitVerticesLines[j].xyz[0]; + float uy = unitVerticesLines[j].xyz[1]; // Base _vertexArray.push_back(ux * _baseRadius); // x diff --git a/modules/base/shaders/arrow_fs.glsl b/modules/base/shaders/arrow_fs.glsl new file mode 100644 index 0000000000..036e67ed18 --- /dev/null +++ b/modules/base/shaders/arrow_fs.glsl @@ -0,0 +1,75 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2023 * + * * + * 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 "fragment.glsl" + +in float vs_depth; +in vec3 vs_normal; +in vec4 vs_positionViewSpace; + +uniform vec3 color; +uniform float opacity; +uniform float ambientIntensity = 0.2; +uniform float diffuseIntensity = 1.0; +uniform float specularIntensity = 1.0; +uniform bool performShading = true; + +const vec3 LightColor = vec3(1.0); + +Fragment getFragment() { + Fragment frag; + + frag.color = vec4(color, opacity); + + // Simple phong shading (same color for diffuse and ambient. White specular) + if (performShading) { + const vec3 lightDirectionViewSpace = vec3(0.0, 0.0, 1.0); + const float lightIntensity = 1.0; + const float specularPower = 100.0; + + // Ambient color + vec3 shadedColor = ambientIntensity * color; + + // Diffuse + vec3 n = normalize(vs_normal); + vec3 l = lightDirectionViewSpace; + shadedColor += diffuseIntensity * max(dot(n,l), 0.0) * color; + + // Specular + vec3 viewDir = normalize(vs_positionViewSpace.xyz); + vec3 reflectDir = reflect(l, n); + shadedColor += + specularIntensity * pow(max(dot(viewDir,reflectDir), 0), specularPower) * color; + + // Light contribution (one light soruce) + shadedColor *= lightIntensity * LightColor; + + frag.color.xyz = shadedColor; + } + + frag.depth = vs_depth; + frag.gPosition = vs_positionViewSpace; + frag.gNormal = vec4(0.0, 0.0, 0.0, 1.0); + return frag; +} diff --git a/modules/base/shaders/arrow_vs.glsl b/modules/base/shaders/arrow_vs.glsl new file mode 100644 index 0000000000..919e838d2d --- /dev/null +++ b/modules/base/shaders/arrow_vs.glsl @@ -0,0 +1,47 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2023 * + * * + * 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. * + ****************************************************************************************/ + +#version __CONTEXT__ + +layout(location = 0) in vec3 in_position; +layout(location = 1) in vec3 in_normal; + +out float vs_depth; +out vec3 vs_normal; +out vec4 vs_positionViewSpace; + +uniform mat4 modelViewTransform; +uniform mat4 projectionTransform; +uniform mat3 normalTransform; + +void main() { + vs_positionViewSpace = vec4(modelViewTransform * dvec4(in_position, 1)); + vec4 positionScreenSpace = projectionTransform * vs_positionViewSpace; + vs_depth = positionScreenSpace.w; + vs_normal = normalize(normalTransform * in_normal); + gl_Position = positionScreenSpace; + + // Set z to 0 to disable near and far plane, unique handling for perspective in space + gl_Position.z = 0.f; +} diff --git a/src/rendering/helper.cpp b/src/rendering/helper.cpp index 8184c7b605..28d9080b50 100644 --- a/src/rendering/helper.cpp +++ b/src/rendering/helper.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -246,10 +247,11 @@ void initialize() { reinterpret_cast(offsetof(VertexXYUVRGBA, rgba))); glBindVertexArray(0); + // // Sphere vertex array object // - std::pair, std::vector> sphereData = createSphere( + VertexIndexListCombo sphereData = createSphere( 64, glm::vec3(1.f, 1.f, 1.f), glm::vec4(1.f, 1.f, 1.f, 1.f) ); @@ -261,16 +263,16 @@ void initialize() { glBindBuffer(GL_ARRAY_BUFFER, vertexObjects.sphere.vbo); glBufferData( GL_ARRAY_BUFFER, - sphereData.first.size() * sizeof(Vertex), - sphereData.first.data(), + sphereData.vertices.size() * sizeof(Vertex), + sphereData.vertices.data(), GL_STATIC_DRAW ); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vertexObjects.sphere.ibo); glBufferData( GL_ELEMENT_ARRAY_BUFFER, - sphereData.second.size() * sizeof(GLushort), - sphereData.second.data(), + sphereData.indices.size() * sizeof(GLushort), + sphereData.indices.data(), GL_STATIC_DRAW ); glEnableVertexAttribArray(0); @@ -282,7 +284,75 @@ void initialize() { glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast(offsetof(Vertex, rgba))); glBindVertexArray(0); - vertexObjects.sphere.nElements = static_cast(sphereData.second.size()); + vertexObjects.sphere.nElements = static_cast(sphereData.indices.size()); + + + // + // Cylinder vertex array object + // + VertexIndexListCombo cylinderData = createCylinder(64, 1.f, 1.f); + + glGenVertexArrays(1, &vertexObjects.cylinder.vao); + glGenBuffers(1, &vertexObjects.cylinder.vbo); + glGenBuffers(1, &vertexObjects.cylinder.ibo); + + glBindVertexArray(vertexObjects.cylinder.vao); + glBindBuffer(GL_ARRAY_BUFFER, vertexObjects.cylinder.vbo); + glBufferData( + GL_ARRAY_BUFFER, + cylinderData.vertices.size() * sizeof(VertexXYZNormal), + cylinderData.vertices.data(), + GL_STATIC_DRAW + ); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vertexObjects.cylinder.ibo); + glBufferData( + GL_ELEMENT_ARRAY_BUFFER, + cylinderData.indices.size() * sizeof(GLushort), + cylinderData.indices.data(), + GL_STATIC_DRAW + ); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexXYZNormal), nullptr); + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(VertexXYZNormal), + reinterpret_cast(offsetof(VertexXYZNormal, normal))); + glBindVertexArray(0); + vertexObjects.cylinder.nElements = static_cast(cylinderData.indices.size()); + + + // + // Cone vertex array object + // + VertexIndexListCombo coneData = createCone(64, 1.f, 1.f); + + glGenVertexArrays(1, &vertexObjects.cone.vao); + glGenBuffers(1, &vertexObjects.cone.vbo); + glGenBuffers(1, &vertexObjects.cone.ibo); + + glBindVertexArray(vertexObjects.cone.vao); + glBindBuffer(GL_ARRAY_BUFFER, vertexObjects.cone.vbo); + glBufferData( + GL_ARRAY_BUFFER, + coneData.vertices.size() * sizeof(VertexXYZNormal), + coneData.vertices.data(), + GL_STATIC_DRAW + ); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vertexObjects.cone.ibo); + glBufferData( + GL_ELEMENT_ARRAY_BUFFER, + coneData.indices.size() * sizeof(GLushort), + coneData.indices.data(), + GL_STATIC_DRAW + ); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexXYZNormal), nullptr); + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(VertexXYZNormal), + reinterpret_cast(offsetof(VertexXYZNormal, normal))); + glBindVertexArray(0); + vertexObjects.cone.nElements = static_cast(coneData.indices.size()); // @@ -320,6 +390,14 @@ void deinitialize() { glDeleteBuffers(1, &vertexObjects.sphere.vbo); glDeleteBuffers(1, &vertexObjects.sphere.ibo); + glDeleteVertexArrays(1, &vertexObjects.cylinder.vao); + glDeleteBuffers(1, &vertexObjects.cylinder.vbo); + glDeleteBuffers(1, &vertexObjects.cylinder.ibo); + + glDeleteVertexArrays(1, &vertexObjects.cone.vao); + glDeleteBuffers(1, &vertexObjects.cone.vbo); + glDeleteBuffers(1, &vertexObjects.cone.ibo); + glDeleteVertexArrays(1, &vertexObjects.empty.vao); isInitialized = false; @@ -423,32 +501,48 @@ std::vector convert(std::vector v) { return result; } +Vertex computeCircleVertex(int i, int nSegments, float radius, + glm::vec4 color = glm::vec4(1.f)) +{ + const float fsegments = static_cast(nSegments); + + const float fi = static_cast(i); + + const float theta = fi * glm::two_pi() / fsegments; // 0 -> 2*PI + + const float x = radius * std::cos(theta); + const float y = radius * std::sin(theta); + const float z = 0.f; + + const float u = std::cos(theta); + const float v = std::sin(theta); + + return { x, y, z, u, v, color.r, color.g, color.b, color.a }; +} + std::vector createRing(int nSegments, float radius, glm::vec4 colors) { const int nVertices = nSegments + 1; std::vector vertices(nVertices); - const float fsegments = static_cast(nSegments); - for (int i = 0; i <= nSegments; ++i) { - const float fi = static_cast(i); - - const float theta = fi * glm::pi() * 2.f / fsegments; // 0 -> 2*PI - - const float x = radius * std::cos(theta); - const float y = radius * std::sin(theta); - const float z = 0.f; - - const float u = std::cos(theta); - const float v = std::sin(theta); - - vertices[i] = { x, y, z, u, v, colors.r, colors.g, colors.b, colors.a }; + vertices[i] = computeCircleVertex(i, nSegments, radius, colors); } return vertices; } -std::pair, std::vector> createSphere(int nSegments, - glm::vec3 radii, - glm::vec4 colors) +std::vector createRingXYZ(int nSegments, float radius) { + const int nVertices = nSegments + 1; + std::vector vertices(nVertices); + + for (int i = 0; i <= nSegments; ++i) { + Vertex fullVertex = computeCircleVertex(i, nSegments, radius); + vertices[i] = { fullVertex.xyz[0], fullVertex.xyz[1], fullVertex.xyz[2] }; + } + return vertices; +} + +VertexIndexListCombo createSphere(int nSegments, glm::vec3 radii, + glm::vec4 colors) { std::vector vertices; vertices.reserve(nSegments * nSegments); @@ -505,6 +599,153 @@ std::pair, std::vector> createSphere(int nSegments return { vertices, indices }; } +VertexIndexListCombo createConicalCylinder(unsigned int nSegments, + float bottomRadius, + float topRadius, + float height) +{ + // Create a ring for the top and bottom vertices (XY plane) + std::vector bottomVertices = createRingXYZ(nSegments, bottomRadius); + std::vector topVertices = createRingXYZ(nSegments, topRadius); + + // Build the 4 rings of vertices (with different normals), that will make up the + // shape for the cylinder + std::vector vertices; + vertices.reserve(4 * bottomVertices.size() + 2); + + // Center bottom vertex + vertices.push_back({ + .xyz = { 0.f, 0.f, 0.f }, + .normal = { 0.f, 0.f, -1.f } + }); + + std::vector verts0; + verts0.reserve(bottomVertices.size()); + std::vector verts1; + verts1.reserve(bottomVertices.size()); + std::vector verts2; + verts2.reserve(bottomVertices.size()); + std::vector verts3; + verts3.reserve(bottomVertices.size()); + + for (size_t i = 0; i < bottomVertices.size(); i++) { + const VertexXYZ& vBot = bottomVertices[i]; + VertexXYZ& vTop = topVertices[i]; + vTop.xyz[2] += height; + + glm::vec3 sideNormal; + if (std::abs(bottomRadius - topRadius) < std::numeric_limits::epsilon()) { + sideNormal = glm::normalize( + glm::vec3(vBot.xyz[0], vBot.xyz[1], vBot.xyz[2]) + ); + } + else { + glm::vec3 p = glm::closestPointOnLine( + glm::vec3(0.f), + glm::vec3(vBot.xyz[0], vBot.xyz[1], vBot.xyz[2]), + glm::vec3(vTop.xyz[0], vTop.xyz[1], vTop.xyz[2]) + ); + sideNormal = glm::normalize(p); + } + + // Ring 0 - vertices of bottom circle, with normals pointing down + verts0.push_back({ + .xyz = { vBot.xyz[0], vBot.xyz[1], vBot.xyz[2] }, + .normal = { 0.f, 0.f, -1.f } + }); + + // Ring 1 - bottom vertices of cylider sides with normals pointing outwards + verts1.push_back({ + .xyz = { vBot.xyz[0], vBot.xyz[1], vBot.xyz[2] }, + .normal = { sideNormal.x, sideNormal.y, sideNormal.z } + }); + + // Ring 2 - top vertices of cylinder side, normals pointing outwards + // Note that only difference between top and bottom is the height added to Z + verts2.push_back({ + .xyz = { vTop.xyz[0], vTop.xyz[1], vTop.xyz[2] }, + .normal = { sideNormal.x, sideNormal.y, sideNormal.z } + }); + + // Ring 3 - vertices of top circle, normals pointing up + verts3.push_back({ + .xyz = { vTop.xyz[0], vTop.xyz[1], vTop.xyz[2] }, + .normal = { 0.f, 0.f, 1.f } + }); + } + + vertices.insert(vertices.end(), verts0.begin(), verts0.end()); + vertices.insert(vertices.end(), verts1.begin(), verts1.end()); + vertices.insert(vertices.end(), verts2.begin(), verts2.end()); + vertices.insert(vertices.end(), verts3.begin(), verts3.end()); + + // Center top vertex + vertices.push_back({ + .xyz = { 0.f, 0.f, height }, + .normal = { 0.f, 0.f, 1.f } + }); + + // Contruct the index list, based on the above vertex rings + std::vector indexArray; + indexArray.reserve(4 * 3 * nSegments); + + auto ringVerticeIndex = [&nSegments](unsigned int ringIndex, unsigned int i) { + return static_cast(1 + ringIndex * (nSegments + 1) + i); + }; + + GLushort botCenterIndex = 0; + GLushort topCenterIndex = static_cast(vertices.size()) - 1; + + for (unsigned int i = 0; i < nSegments; ++i) { + bool isLast = (i == nSegments - 1); + GLushort v0, v1, v2, v3; + + // Bottom triangle + v0 = ringVerticeIndex(0, i); + v1 = ringVerticeIndex(0, isLast ? 0 : i + 1); + indexArray.push_back(botCenterIndex); + indexArray.push_back(v1); + indexArray.push_back(v0); + + // Side of cylinder + + // Bottom ring + v0 = ringVerticeIndex(1, i); + v1 = ringVerticeIndex(1, isLast ? 0 : i + 1); + // Top ring + v2 = ringVerticeIndex(2, i); + v3 = ringVerticeIndex(2, isLast ? 0 : i + 1); + indexArray.push_back(v0); + indexArray.push_back(v1); + indexArray.push_back(v2); + + indexArray.push_back(v1); + indexArray.push_back(v3); + indexArray.push_back(v2); + + // Top triangle + v0 = ringVerticeIndex(3, i); + v1 = ringVerticeIndex(3, isLast ? 0 : i + 1); + indexArray.push_back(topCenterIndex); + indexArray.push_back(v0); + indexArray.push_back(v1); + } + + return { vertices, indexArray }; +} + +VertexIndexListCombo createCylinder(unsigned int nSegments, + float radius, float height) +{ + return createConicalCylinder(nSegments, radius, radius, height); +} + +VertexIndexListCombo createCone(unsigned int nSegments, float radius, + float height) +{ + return createConicalCylinder(nSegments, radius, 0.f, height); +} + void LightSourceRenderData::updateBasedOnLightSources(const RenderData& renderData, const std::vector>& sources) { From 247f48058f79cc2afb0e52d448788811062e56d8 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Mon, 11 Sep 2023 15:47:05 +0200 Subject: [PATCH 126/701] Update GUI hash (to get double actions update for PR #2872) --- data/assets/util/webgui.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/util/webgui.asset b/data/assets/util/webgui.asset index 998debfe36..19902055cd 100644 --- a/data/assets/util/webgui.asset +++ b/data/assets/util/webgui.asset @@ -4,7 +4,7 @@ local guiCustomization = asset.require("customization/gui") -- Select which commit hashes to use for the frontend and backend -local frontendHash = "7ed2de3b136b4712454c944a3838c2171c26605a" +local frontendHash = "c4fccbef3051522c7b8bcd96aeb20b8126ac2286" local frontend = asset.syncedResource({ Identifier = "WebGuiFrontend", From 80ecc7d7e464b83a65b0e00cfbaced74cedf2578 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Mon, 11 Sep 2023 16:14:41 +0200 Subject: [PATCH 127/701] Fix misspelled IsLocal in actions assets --- .../solarsystem/missions/apollo/actions.asset | 6 ++-- .../missions/insight/actions.asset | 4 +-- .../missions/newhorizons/actions.asset | 32 +++++++++---------- .../missions/osirisrex/actions.asset | 18 +++++------ .../missions/perseverance/actions.asset | 2 +- .../solarsystem/missions/rosetta/67p.asset | 6 ++-- .../missions/rosetta/actions.asset | 2 +- .../missions/rosetta/rosetta.asset | 8 ++--- .../missions/voyager/actions.asset | 10 +++--- .../missions/voyager/voyager1.asset | 2 +- .../missions/voyager/voyager2.asset | 2 +- .../solarsystem/planets/earth/earth.asset | 4 +-- .../solarsystem/planets/earth/moon/moon.asset | 4 +-- .../planets/earth/satellites/misc/iss.asset | 2 +- .../solarsystem/telescopes/jwst/actions.asset | 18 +++++------ 15 files changed, 60 insertions(+), 60 deletions(-) diff --git a/data/assets/scene/solarsystem/missions/apollo/actions.asset b/data/assets/scene/solarsystem/missions/apollo/actions.asset index fdd6fd0c53..99e3a6830d 100644 --- a/data/assets/scene/solarsystem/missions/apollo/actions.asset +++ b/data/assets/scene/solarsystem/missions/apollo/actions.asset @@ -9,7 +9,7 @@ local ToggleMoonShading = { ]], Documentation = "Toggles the shading of the Moon", GuiPath = "/Missions/Apollo", - isLocal = false + IsLocal = false } local FocusMoon = { @@ -22,7 +22,7 @@ local FocusMoon = { ]], Documentation = "Set camera focus on the Moon", GuiPath = "/Missions/Apollo", - isLocal = false + IsLocal = false } local FocusEarth = { @@ -35,7 +35,7 @@ local FocusEarth = { ]], Documentation = "Set camera focus on the Earth", GuiPath = "/Missions/Apollo", - isLocal = false + IsLocal = false } diff --git a/data/assets/scene/solarsystem/missions/insight/actions.asset b/data/assets/scene/solarsystem/missions/insight/actions.asset index a863a3c8ef..ebb9df1798 100644 --- a/data/assets/scene/solarsystem/missions/insight/actions.asset +++ b/data/assets/scene/solarsystem/missions/insight/actions.asset @@ -20,7 +20,7 @@ local Setup = { ]], Documentation = "Set and goto Insight Landing", GuiPath = "/Missions/Insight", - isLocal = false + IsLocal = false } local DisableLayers = { @@ -34,7 +34,7 @@ local DisableLayers = { ]], Documentation = "Disable Mars layer settings used for insight EDL", GuiPath = "/Missions/Insight", - isLocal = false + IsLocal = false } diff --git a/data/assets/scene/solarsystem/missions/newhorizons/actions.asset b/data/assets/scene/solarsystem/missions/newhorizons/actions.asset index af6d36c9e4..4b2caea883 100644 --- a/data/assets/scene/solarsystem/missions/newhorizons/actions.asset +++ b/data/assets/scene/solarsystem/missions/newhorizons/actions.asset @@ -8,7 +8,7 @@ local FocusNewHorizons = { ]], Documentation = "Sets the focus of the camera on 'NewHorizons'", GuiPath = "/Missions/New Horizons", - isLocal = false + IsLocal = false } local AimPluto = { @@ -21,7 +21,7 @@ local AimPluto = { ]], Documentation = "Anchor at New Horizons, Aim at Pluto", GuiPath = "/Missions/New Horizons", - isLocal = false + IsLocal = false } local FocusPluto = { @@ -34,7 +34,7 @@ local FocusPluto = { ]], Documentation = "Sets the focus of the camera on 'Pluto'", GuiPath = "/Missions/New Horizons", - isLocal = false + IsLocal = false } local FocusCharon = { @@ -47,7 +47,7 @@ local FocusCharon = { ]], Documentation = "Sets the focus of the camera on 'Charon'", GuiPath = "/Missions/New Horizons", - isLocal = false + IsLocal = false } local ToggleImageProjection = { @@ -60,7 +60,7 @@ local ToggleImageProjection = { ]], Documentation = "Toggles New Horizons image projection", GuiPath = "/Missions/New Horizons", - isLocal = false + IsLocal = false } local ClearImageProjections = { @@ -72,7 +72,7 @@ local ClearImageProjections = { ]], Documentation = "Removes all image projections from Pluto and Charon", GuiPath = "/Missions/New Horizons", - isLocal = false + IsLocal = false } local Approach = { @@ -85,7 +85,7 @@ local Approach = { ]], Documentation = "Jumps to the 14th of July 2015 at 0900 UTC and clears all projections", GuiPath = "/Missions/New Horizons", - isLocal = false + IsLocal = false } local IncreaseHeightmapPluto = { @@ -99,7 +99,7 @@ local IncreaseHeightmapPluto = { ]], Documentation = "Increases the height map exaggeration on Pluto", GuiPath = "/Missions/New Horizons", - isLocal = false + IsLocal = false } local DecreaseHeightmapPluto = { @@ -113,7 +113,7 @@ local DecreaseHeightmapPluto = { ]], Documentation = "Decreases the height map exaggeration on Pluto", GuiPath = "/Missions/New Horizons", - isLocal = false + IsLocal = false } local IncreaseHeightmapCharon = { @@ -127,7 +127,7 @@ local IncreaseHeightmapCharon = { ]], Documentation = "Increases the height map exaggeration on Charon", GuiPath = "/Missions/New Horizons", - isLocal = false + IsLocal = false } local DecreaseHeightmapCharon = { @@ -141,7 +141,7 @@ local DecreaseHeightmapCharon = { ]], Documentation = "Decreases the height map exaggeration on Charon", GuiPath = "/Missions/New Horizons", - isLocal = false + IsLocal = false } local TogglePlutoTrail = { @@ -155,7 +155,7 @@ local TogglePlutoTrail = { ]], Documentation = "Toggles the visibility of the trail behind Pluto", GuiPath = "/Missions/New Horizons", - isLocal = false + IsLocal = false } local TogglePlutoLabels = { @@ -189,7 +189,7 @@ local TogglePlutoLabels = { ]], Documentation = "Toggles the visibility of the text labels of Pluto, Charon, Hydra, Nix, Kerberos, and Styx", GuiPath = "/Missions/New Horizons", - isLocal = false + IsLocal = false } local ToggleNewHorizonsLabels = { @@ -205,7 +205,7 @@ local ToggleNewHorizonsLabels = { ]], Documentation = "Toggles the visibility of the labels for the New Horizons instruments", GuiPath = "/Missions/New Horizons", - isLocal = false + IsLocal = false } local ToggleShadows = { @@ -223,7 +223,7 @@ local ToggleShadows = { ]], Documentation = "Toggles the visibility of the shadow visualization of Pluto and Charon", GuiPath = "/Missions/New Horizons", - isLocal = false + IsLocal = false } local ToggleNewHorizonsTrail = { @@ -237,7 +237,7 @@ local ToggleNewHorizonsTrail = { ]], Documentation = "Toggles the trail of New Horizons", GuiPath = "/Missions/New Horizons", - isLocal = false + IsLocal = false } diff --git a/data/assets/scene/solarsystem/missions/osirisrex/actions.asset b/data/assets/scene/solarsystem/missions/osirisrex/actions.asset index dc1889a966..4f03d03e42 100644 --- a/data/assets/scene/solarsystem/missions/osirisrex/actions.asset +++ b/data/assets/scene/solarsystem/missions/osirisrex/actions.asset @@ -8,7 +8,7 @@ local FocusOsirisRex = { ]], Documentation = "Sets the focus of the camera on 'OsirisRex'", GuiPath = "/Missions/Osiris Rex", - isLocal = false + IsLocal = false } local FocusBennu = { @@ -21,7 +21,7 @@ local FocusBennu = { ]], Documentation = "Sets the focus of the camera on 'Bennu'", GuiPath = "/Missions/Osiris Rex", - isLocal = false + IsLocal = false } local SetupBennuApproach = { @@ -33,7 +33,7 @@ local SetupBennuApproach = { ]], Documentation = "Sets the time to the approach at Bennu", GuiPath = "/Missions/Osiris Rex", - isLocal = false + IsLocal = false } local SetupBennuSurvey = { @@ -45,7 +45,7 @@ local SetupBennuSurvey = { ]], Documentation = "Sets the time to the preliminary survey of Bennu", GuiPath = "/Missions/Osiris Rex", - isLocal = false + IsLocal = false } local SetupBennuEventB = { @@ -57,7 +57,7 @@ local SetupBennuEventB = { ]], Documentation = "Sets the time to the orbital B event", GuiPath = "/Missions/Osiris Rex", - isLocal = false + IsLocal = false } local SetupBennuReconEvent = { @@ -69,7 +69,7 @@ local SetupBennuReconEvent = { ]], Documentation = "Sets the time to the recon event", GuiPath = "/Missions/Osiris Rex", - isLocal = false + IsLocal = false } local ToggleSunMarker = { @@ -83,7 +83,7 @@ local ToggleSunMarker = { ]], Documentation = "Toggles the visibility of the text marking the location of the Sun", GuiPath = "/Missions/Osiris Rex", - isLocal = false + IsLocal = false } local AimAtBennu = { @@ -119,7 +119,7 @@ local SetLaunchTime = { ]], Documentation = "Look at the launch of OSIRIS-REx", GuiPath = "/Missions/Osiris Rex", - isLocal = false + IsLocal = false } local LookImageCapture = { @@ -133,7 +133,7 @@ local LookImageCapture = { ]], Documentation = "Look at the image capture of OSIRIS-REx", GuiPath = "/Missions/Osiris Rex", - isLocal = false + IsLocal = false } asset.onInitialize(function() diff --git a/data/assets/scene/solarsystem/missions/perseverance/actions.asset b/data/assets/scene/solarsystem/missions/perseverance/actions.asset index 63ecd648f1..e0b4ec4398 100644 --- a/data/assets/scene/solarsystem/missions/perseverance/actions.asset +++ b/data/assets/scene/solarsystem/missions/perseverance/actions.asset @@ -20,7 +20,7 @@ local Setup = { ]], Documentation = "Sets time and layers for Perseverance landing", GuiPath = "/Missions/Perseverance", - isLocal = false + IsLocal = false } diff --git a/data/assets/scene/solarsystem/missions/rosetta/67p.asset b/data/assets/scene/solarsystem/missions/rosetta/67p.asset index 42377f4cfe..131fc2e01b 100644 --- a/data/assets/scene/solarsystem/missions/rosetta/67p.asset +++ b/data/assets/scene/solarsystem/missions/rosetta/67p.asset @@ -141,7 +141,7 @@ local Focus67p = { ]], Documentation = "Sets the focus of the camera on 67P", GuiPath = "/Missions/Rosetta", - isLocal = false + IsLocal = false } local ClearImageProjections = { @@ -152,7 +152,7 @@ local ClearImageProjections = { ]], Documentation = "Removes all image projections from 67P", GuiPath = "/Missions/Rosetta", - isLocal = false + IsLocal = false } local Toggle67pProjection = { @@ -166,7 +166,7 @@ local Toggle67pProjection = { ]], Documentation = "Enables or disables the image projection on 67P", GuiPath = "/Missions/Rosetta", - isLocal = false + IsLocal = false } diff --git a/data/assets/scene/solarsystem/missions/rosetta/actions.asset b/data/assets/scene/solarsystem/missions/rosetta/actions.asset index 48c096def2..62f788b009 100644 --- a/data/assets/scene/solarsystem/missions/rosetta/actions.asset +++ b/data/assets/scene/solarsystem/missions/rosetta/actions.asset @@ -9,7 +9,7 @@ local ToggleOuterPlanetaryTrails = { ]], Documentation = "Toggles the visibility of all trails further from the Sun than 67P", GuiPath = "/Missions/Rosetta", - isLocal = false + IsLocal = false } diff --git a/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset b/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset index 1d794f3130..4db204dae8 100644 --- a/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset +++ b/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset @@ -278,7 +278,7 @@ local FocusRosetta = { ]], Documentation = "Sets the focus of the camera on Rosetta", GuiPath = "/Missions/Rosetta", - isLocal = false + IsLocal = false } local SetupLanderRelease = { @@ -289,7 +289,7 @@ local SetupLanderRelease = { ]], Documentation = "Jumps to the time when the Philae lander is released", GuiPath = "/Missions/Rosetta", - isLocal = false + IsLocal = false } local ToggleImagePlane = { @@ -303,7 +303,7 @@ local ToggleImagePlane = { ]], Documentation = "Toggles the visibility of the free floating image plane", GuiPath = "/Missions/Rosetta", - isLocal = false + IsLocal = false } local TogglePhilaeTrail = { @@ -317,7 +317,7 @@ local TogglePhilaeTrail = { ]], Documentation = "Toggles the visibility of Philae's trail", GuiPath = "/Missions/Rosetta", - isLocal = false + IsLocal = false } diff --git a/data/assets/scene/solarsystem/missions/voyager/actions.asset b/data/assets/scene/solarsystem/missions/voyager/actions.asset index d8e1a39f4f..7b5b73f8de 100644 --- a/data/assets/scene/solarsystem/missions/voyager/actions.asset +++ b/data/assets/scene/solarsystem/missions/voyager/actions.asset @@ -6,7 +6,7 @@ local SetupJupiterApproach = { ]], Documentation = "Sets the time for Voyager's approach to Jupiter", GuiPath = "/Missions/Voyager", - isLocal = false + IsLocal = false } local SetupSaturnApproach = { @@ -17,7 +17,7 @@ local SetupSaturnApproach = { ]], Documentation = "Sets the time for Voyager's approach to Saturn", GuiPath = "/Missions/Voyager", - isLocal = false + IsLocal = false } local JupiterFocus = { @@ -30,7 +30,7 @@ local JupiterFocus = { ]], Documentation = "Set the camera focus to Jupiter", GuiPath = "/Missions/Voyager", - isLocal = false + IsLocal = false } local SaturnFocus = { @@ -43,7 +43,7 @@ local SaturnFocus = { ]], Documentation = "Sets the camera focus on Saturn", GuiPath = "/Missions/Voyager", - isLocal = false + IsLocal = false } local ToggleMinorMoonTrails = { @@ -57,7 +57,7 @@ local ToggleMinorMoonTrails = { ]], Documentation = "Toggles the trails of the minor moons", GuiPath = "/Trails", - isLocal = false + IsLocal = false } diff --git a/data/assets/scene/solarsystem/missions/voyager/voyager1.asset b/data/assets/scene/solarsystem/missions/voyager/voyager1.asset index 275c15430d..a028e015e8 100644 --- a/data/assets/scene/solarsystem/missions/voyager/voyager1.asset +++ b/data/assets/scene/solarsystem/missions/voyager/voyager1.asset @@ -250,7 +250,7 @@ local FocusVoyager1 = { ]], Documentation = "Set camera focus to Voyager 1", GuiPath = "/Missions/Voyager", - isLocal = false + IsLocal = false } diff --git a/data/assets/scene/solarsystem/missions/voyager/voyager2.asset b/data/assets/scene/solarsystem/missions/voyager/voyager2.asset index 448776f05f..0655d269fa 100644 --- a/data/assets/scene/solarsystem/missions/voyager/voyager2.asset +++ b/data/assets/scene/solarsystem/missions/voyager/voyager2.asset @@ -353,7 +353,7 @@ local FocusVoyager2 = { ]], Documentation = "Set camera focus to Voyager 2", GuiPath = "/Missions/Voyager", - isLocal = false + IsLocal = false } diff --git a/data/assets/scene/solarsystem/planets/earth/earth.asset b/data/assets/scene/solarsystem/planets/earth/earth.asset index 2c65e6484d..103382bf2a 100644 --- a/data/assets/scene/solarsystem/planets/earth/earth.asset +++ b/data/assets/scene/solarsystem/planets/earth/earth.asset @@ -86,7 +86,7 @@ local FocusEarth = { ]], Documentation = "Set camera focus on the Earth", GuiPath = "/Solar System/Earth", - isLocal = false + IsLocal = false } local ToggleSatelliteTrails = { @@ -100,7 +100,7 @@ local ToggleSatelliteTrails = { ]], Documentation = "Toggle trails on or off for satellites around Earth", GuiPath = "/Solar System/Earth", - isLocal = false + IsLocal = false } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/moon.asset b/data/assets/scene/solarsystem/planets/earth/moon/moon.asset index 6d2e79612b..145d109c29 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/moon.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/moon.asset @@ -94,7 +94,7 @@ local FocusMoon = { ]], Documentation = "Set camera focus on the Moon", GuiPath = "/Solar System/Earth/Moon", - isLocal = false + IsLocal = false } local ToggleMoonShading = { @@ -108,7 +108,7 @@ local ToggleMoonShading = { ]], Documentation = "Toggles the shading of the Moon", GuiPath = "/Solar System/Earth/Moon", - isLocal = false + IsLocal = 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 a775c89188..e113c31ed8 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset @@ -130,7 +130,7 @@ local FocusIss = { ]], Documentation = "Refocuses the camera on the ISS", GuiPath = "/Solar System/Earth", - isLocal = false + IsLocal = false } diff --git a/data/assets/scene/solarsystem/telescopes/jwst/actions.asset b/data/assets/scene/solarsystem/telescopes/jwst/actions.asset index d14c028896..5cbec1b0c3 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/actions.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/actions.asset @@ -9,7 +9,7 @@ local ToggleLagrangianPoints = { ]], Documentation = "Toggle points and labels for the Lagrangian points for Earth Sun system", GuiPath = "/JWST", - isLocal = false + IsLocal = false } local ToggleHudf = { @@ -23,7 +23,7 @@ local ToggleHudf = { ]], Documentation = "Toggle Hubble Ultra Deep Field image and line towards its coordinate", GuiPath = "/JWST", - isLocal = false + IsLocal = false } local ToggleL2 = { @@ -37,7 +37,7 @@ local ToggleL2 = { ]], Documentation = "Toggle L2 label, point and line", GuiPath = "/JWST", - isLocal = false + IsLocal = false } local ToggleFov = { @@ -51,7 +51,7 @@ local ToggleFov = { ]], Documentation = "Toggle James Webb Space Telecope field of view and view band", GuiPath = "/JWST", - isLocal = false + IsLocal = false } local SetupLaunch = { @@ -63,7 +63,7 @@ local SetupLaunch = { ]], Documentation = "Set the time to the launch time of JWST", GuiPath = "/JWST", - isLocal = false + IsLocal = false } local SetupDetach = { @@ -75,7 +75,7 @@ local SetupDetach = { ]], Documentation = "Set the time to the detach time of JWST", GuiPath = "/JWST", - isLocal = false + IsLocal = false } local ToggleSunTrail = { @@ -87,7 +87,7 @@ local ToggleSunTrail = { ]], Documentation = "Toggle JWST trail relative to the Sun", GuiPath = "/JWST", - isLocal = false + IsLocal = false } local ToggleTrailsExceptMoon = { @@ -106,7 +106,7 @@ local ToggleTrailsExceptMoon = { ]], Documentation = "Toggle all planet and moon trails, except the Moon", GuiPath = "/JWST", - isLocal = false + IsLocal = false } local ToggleJwstTrails = { @@ -124,7 +124,7 @@ local ToggleJwstTrails = { ]], Documentation = "Toggle JWST launch, cruise and L2 co-revolving orbit trails, not the Sun trail", GuiPath = "/JWST", - isLocal = false + IsLocal = false } From e763aeeba95afcc9efb63b1003f48c536b72d174 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 11 Sep 2023 20:09:37 +0200 Subject: [PATCH 128/701] Global pass over all actions to make most of them not local --- data/assets/actions/planets/mars_layers.asset | 12 ++++++------ .../actions/planets/scale_planets_and_moons.asset | 4 ++-- data/assets/actions/system/undo_event_fades.asset | 4 ++-- .../actions/trails/on_off_all_minor_moons.asset | 4 ++-- .../trails/toggle_all_dwarf_planet_trails.asset | 2 +- .../trails/toggle_all_minor_moon_trails.asset | 2 +- data/assets/actions/trails/toggle_all_trails.asset | 6 +++--- data/assets/actions/trails/toggle_trail.asset | 6 +++--- .../actions/trails/toggle_trails_planets_moons.asset | 6 +++--- data/assets/actions/trails/trail_appearance.asset | 10 +++++----- data/assets/default_keybindings.asset | 6 +++--- .../solarsystem/missions/apollo/insignias_map.asset | 4 ++-- .../solarsystem/missions/artemis/toggle_trail.asset | 2 +- .../solarsystem/planets/jupiter/major_moons.asset | 4 ++-- .../solarsystem/planets/jupiter/minor_moons.asset | 4 ++-- .../solarsystem/planets/neptune/major_moons.asset | 4 ++-- .../solarsystem/planets/neptune/minor_moons.asset | 4 ++-- .../solarsystem/planets/saturn/major_moons.asset | 4 ++-- .../solarsystem/planets/saturn/minor_moons.asset | 4 ++-- .../solarsystem/planets/uranus/major_moons.asset | 4 ++-- .../solarsystem/planets/uranus/minor_moons.asset | 4 ++-- .../solarsystem/telescopes/jwst/point_jwst.asset | 2 +- .../solarsystem/telescopes/jwst/toggle_trail.asset | 2 +- 23 files changed, 52 insertions(+), 52 deletions(-) diff --git a/data/assets/actions/planets/mars_layers.asset b/data/assets/actions/planets/mars_layers.asset index 554de5adee..303cf927ec 100644 --- a/data/assets/actions/planets/mars_layers.asset +++ b/data/assets/actions/planets/mars_layers.asset @@ -7,7 +7,7 @@ openspace.setPropertyValueSingle("Scene.Mars.Renderable.Layers.ColorLayers.CTX_b openspace.setPropertyValueSingle("Scene.Mars.Renderable.Layers.ColorLayers.CTX_blended_01.Settings.Opacity", 1.0, 2.0)]], Documentation = "Enables and fades in CTX layer for Mars", GuiPath = "/Solar System/Mars", - IsLocal = true + IsLocal = false } local CTXFadeOut = { @@ -16,7 +16,7 @@ local CTXFadeOut = { Command = [[openspace.setPropertyValueSingle("Scene.Mars.Renderable.Layers.ColorLayers.CTX_blended_01.Settings.Opacity", 0.0, 2.0)]], Documentation = "Fade out CTX", GuiPath = "/Solar System/Mars", - IsLocal = true + IsLocal = false } local HiriseFadeIn = { @@ -28,7 +28,7 @@ openspace.setPropertyValueSingle("Scene.Mars.Renderable.Layers.ColorLayers.HiRIS openspace.setPropertyValueSingle("Scene.Mars.Renderable.Layers.ColorLayers.HiRISE-PSP.Settings.Opacity", 1.0, 2.0)]], Documentation = "Enables and fades in HiRise layer for Mars", GuiPath = "/Solar System/Mars", - IsLocal = true + IsLocal = false } local HiriseFadeOut = { @@ -37,7 +37,7 @@ local HiriseFadeOut = { Command = [[openspace.setPropertyValueSingle("Scene.Mars.Renderable.Layers.ColorLayers.HiRISE-PSP.Settings.Opacity", 0.0, 2.0)]], Documentation = "Fade out HiRISE layer for Mars", GuiPath = "/Solar System/Mars", - IsLocal = true + IsLocal = false } local LocalSetHiriseFadeIn = { @@ -50,7 +50,7 @@ openspace.setPropertyValueSingle("Scene.Mars.Renderable.Layers.ColorLayers.HiRIS openspace.setPropertyValueSingle("Scene.Mars.Renderable.Layers.ColorLayers.HiRISE-LS.Settings.Opacity", 1.0, 2.0)]], Documentation = "Enables and fades in HiRise local set layers for Mars (including height)", GuiPath = "/Solar System/Mars", - IsLocal = true + IsLocal = false } local LocalSetHiriseFadeOut = { @@ -62,7 +62,7 @@ openspace.setPropertyValueSingle("Scene.Mars.Renderable.Layers.HeightLayers.HiRI ]], Documentation = "Fade out HiRISE local set layer for Mars", GuiPath = "/Solar System/Mars", - IsLocal = true + IsLocal = false } diff --git a/data/assets/actions/planets/scale_planets_and_moons.asset b/data/assets/actions/planets/scale_planets_and_moons.asset index 7db5f9c182..e5f5ac9ccd 100644 --- a/data/assets/actions/planets/scale_planets_and_moons.asset +++ b/data/assets/actions/planets/scale_planets_and_moons.asset @@ -20,7 +20,7 @@ local function scaleAction(identifier, scale, name, speed) Command = scaleCommand(identifier, scale, speed), Documentation = "Scales " .. name .. " to " .. scale .. "x", GuiPath = "/Solar System/Scale", - IsLocal = true + IsLocal = false } end @@ -45,7 +45,7 @@ end ]], GuiPath = "/Solar System/Scale", Documentation = "Toggle the scale of " .. name, - IsLocal = true + IsLocal = false } end diff --git a/data/assets/actions/system/undo_event_fades.asset b/data/assets/actions/system/undo_event_fades.asset index 12ee3bb00e..4ce4ca7dbe 100644 --- a/data/assets/actions/system/undo_event_fades.asset +++ b/data/assets/actions/system/undo_event_fades.asset @@ -4,10 +4,10 @@ local UndoEventFade = { Command = [[ openspace.setPropertyValue("Scene.*.Renderable.Fade", 1.0, 0.5) ]], - Documentation = [[Sets the 'Fade' value of all renderables to 1. This internval values + Documentation = [[Sets the 'Fade' value of all renderables to 1. This internal values is managed by events]], GuiPath = "/System/Rendering", - IsLocal = true + IsLocal = false } diff --git a/data/assets/actions/trails/on_off_all_minor_moons.asset b/data/assets/actions/trails/on_off_all_minor_moons.asset index e0441c6ac4..6fa79297e3 100644 --- a/data/assets/actions/trails/on_off_all_minor_moons.asset +++ b/data/assets/actions/trails/on_off_all_minor_moons.asset @@ -20,7 +20,7 @@ local MinorMoonsOn = { ]], Documentation = "Turn ON minor moons and their trails for all planets in the solar system", GuiPath = "/Solar System/Minor Moons", - IsLocal = true + IsLocal = false } local MinorMoonsOff = { @@ -55,7 +55,7 @@ local MinorMoonsOff = { ]], Documentation = "Turn OFF minor moons and their trails for all planets in the solar system", GuiPath = "/Solar System/Minor Moons", - IsLocal = true + IsLocal = false } diff --git a/data/assets/actions/trails/toggle_all_dwarf_planet_trails.asset b/data/assets/actions/trails/toggle_all_dwarf_planet_trails.asset index d57b55886c..7813bc2adb 100644 --- a/data/assets/actions/trails/toggle_all_dwarf_planet_trails.asset +++ b/data/assets/actions/trails/toggle_all_dwarf_planet_trails.asset @@ -9,7 +9,7 @@ local ToggleDwarfPlanetTrails = { ]], Documentation = "Toggle on/off trails for all dwarf planets in the solar system", GuiPath = "/Trails", - IsLocal = true + IsLocal = false } diff --git a/data/assets/actions/trails/toggle_all_minor_moon_trails.asset b/data/assets/actions/trails/toggle_all_minor_moon_trails.asset index d86ff3c470..f587747417 100644 --- a/data/assets/actions/trails/toggle_all_minor_moon_trails.asset +++ b/data/assets/actions/trails/toggle_all_minor_moon_trails.asset @@ -9,7 +9,7 @@ local ToggleMinorMoonTrails = { ]], Documentation = "Toggle on/off minor moon trails for all planets in the solar system", GuiPath = "/Trails", - IsLocal = true + IsLocal = false } diff --git a/data/assets/actions/trails/toggle_all_trails.asset b/data/assets/actions/trails/toggle_all_trails.asset index 22bc7fdb68..9e129e055a 100644 --- a/data/assets/actions/trails/toggle_all_trails.asset +++ b/data/assets/actions/trails/toggle_all_trails.asset @@ -13,7 +13,7 @@ local FadeUpTrails = { ]], Documentation = "Fade up all enabled trails in the Scene", GuiPath = "/Trails", - IsLocal = true + IsLocal = false } local FadeDownTrails = { @@ -31,7 +31,7 @@ local FadeDownTrails = { ]], Documentation = "Fade down all enabled trails in the Scene", GuiPath = "/Trails", - IsLocal = true + IsLocal = false } local ToggleTrails = { @@ -60,7 +60,7 @@ local ToggleTrails = { ]], Documentation = "Toggle fade for all trails in the Scene", GuiPath = "/Trails", - IsLocal = true + IsLocal = false } diff --git a/data/assets/actions/trails/toggle_trail.asset b/data/assets/actions/trails/toggle_trail.asset index 1acd99a14c..270520cac4 100644 --- a/data/assets/actions/trails/toggle_trail.asset +++ b/data/assets/actions/trails/toggle_trail.asset @@ -42,7 +42,7 @@ local ToggleTrail = { This action takes optional arguments to 1) determine which trail to hide (as the 'Node') and 2) the transition direction (as 'After' and 'Before')]], GuiPath = "/Trails", - IsLocal = true + IsLocal = false } local HideTrail = { @@ -66,7 +66,7 @@ local HideTrail = { optional argument to determine whose trail to hide. If no argument is provided, the current focus node is used instead]], GuiPath = "/Trails", - IsLocal = true + IsLocal = false } local ShowTrail = { @@ -90,7 +90,7 @@ local ShowTrail = { optional argument to determine whose trail to hide. If no argument is provided, the current focus node is used instead]], GuiPath = "/Trails", - IsLocal = true + IsLocal = false } diff --git a/data/assets/actions/trails/toggle_trails_planets_moons.asset b/data/assets/actions/trails/toggle_trails_planets_moons.asset index 7792fdbeb4..0a65d1618c 100644 --- a/data/assets/actions/trails/toggle_trails_planets_moons.asset +++ b/data/assets/actions/trails/toggle_trails_planets_moons.asset @@ -7,7 +7,7 @@ local FadeUpTrails = { ]], Documentation = "Fade up all planet and moon trails in the Scene", GuiPath = "/Trails", - IsLocal = true + IsLocal = false } local FadeDownTrails = { @@ -19,7 +19,7 @@ local FadeDownTrails = { ]], Documentation = "Fade down all planet and moon trails in the Scene", GuiPath = "/Trails", - IsLocal = true + IsLocal = false } local ToggleTrails = { @@ -48,7 +48,7 @@ local ToggleTrails = { ]], Documentation = "Toggle fade for planet and moon trails in the Scene", GuiPath = "/Trails", - IsLocal = true + IsLocal = false } diff --git a/data/assets/actions/trails/trail_appearance.asset b/data/assets/actions/trails/trail_appearance.asset index 4c7cf6fabe..e28538be30 100644 --- a/data/assets/actions/trails/trail_appearance.asset +++ b/data/assets/actions/trails/trail_appearance.asset @@ -20,7 +20,7 @@ local function highlightAction(identifierString, value, nameString) Command = highlightCommand(identifierString, value), Documentation = "Animates the trail fade of " .. nameString .. "'s Trail", GuiPath = "/Trails/Appearance", - IsLocal = true + IsLocal = false } end @@ -43,7 +43,7 @@ else end]], Documentation = "Animates the trail fade of " .. nameString .. "'s trail", GuiPath = "/Trails/Appearance", - IsLocal = true + IsLocal = false } end @@ -57,7 +57,7 @@ local EnableTrailFading = { ]], Documentation = "Set orbits to fade out towards the end", GuiPath = "/Trails/Appearance", - IsLocal = true + IsLocal = false } local DisableTrailFading = { @@ -69,7 +69,7 @@ local DisableTrailFading = { ]], Documentation = "Sets trails not to fade out torwards end", GuiPath = "/Trails/Appearance", - IsLocal = true + IsLocal = false } local ToggleTrailFading = { @@ -95,7 +95,7 @@ local ToggleTrailFading = { ]], Documentation = "Toggle trails to fade out towards the end for all trails in the Scene", GuiPath = "/Trails/Appearance", - IsLocal = true + IsLocal = false } local HighlightEarthTrail = highlightAction("Scene.EarthTrail", 10, "Earth") diff --git a/data/assets/default_keybindings.asset b/data/assets/default_keybindings.asset index 06883e32b3..2b207fa0c1 100644 --- a/data/assets/default_keybindings.asset +++ b/data/assets/default_keybindings.asset @@ -53,7 +53,7 @@ local ToggleRotationFriction = { Command = propertyHelper.invert("NavigationHandler.OrbitalNavigator.Friction.RotationalFriction"), Documentation = "Toggles the rotational friction of the camera. If it is disabled, the camera rotates around the focus object indefinitely", GuiPath = "/Navigation", - IsLocal = false + IsLocal = true } local ToggleZoomFriction = { @@ -62,7 +62,7 @@ local ToggleZoomFriction = { Command = propertyHelper.invert("NavigationHandler.OrbitalNavigator.Friction.ZoomFriction"), Documentation = "Toggles the zoom friction of the camera. If it is disabled, the camera rises up from or closes in towards the focus object indefinitely", GuiPath = "/Navigation", - IsLocal = false + IsLocal = true } local ToggleRollFriction = { @@ -71,7 +71,7 @@ local ToggleRollFriction = { Command = propertyHelper.invert("NavigationHandler.OrbitalNavigator.Friction.RollFriction"), Documentation = "Toggles the roll friction of the camera. If it is disabled, the camera rolls around its own axis indefinitely", GuiPath = "/Navigation", - IsLocal = false + IsLocal = true } local FadeToBlack = { diff --git a/data/assets/scene/solarsystem/missions/apollo/insignias_map.asset b/data/assets/scene/solarsystem/missions/apollo/insignias_map.asset index e00120ffa5..0a3c9d7eb3 100644 --- a/data/assets/scene/solarsystem/missions/apollo/insignias_map.asset +++ b/data/assets/scene/solarsystem/missions/apollo/insignias_map.asset @@ -182,7 +182,7 @@ local ShowInsignias = { Command = [[openspace.setPropertyValue("Scene.Apollo*Insignia.Renderable.Opacity", 1, 0.5)]], Documentation = "Show patches of the Apollo missions on their respective landing sites", GuiPath = "/Missions/Apollo", - IsLocal = true + IsLocal = false } local HideInsignias = { @@ -191,7 +191,7 @@ local HideInsignias = { Command = [[openspace.setPropertyValue("Scene.Apollo*Insignia.Renderable.Opacity", 0, 0.5)]], Documentation = "Hide patches of the Apollo missions on their respective landing sites", GuiPath = "/Missions/Apollo", - IsLocal = true + IsLocal = false } asset.onInitialize(function() diff --git a/data/assets/scene/solarsystem/missions/artemis/toggle_trail.asset b/data/assets/scene/solarsystem/missions/artemis/toggle_trail.asset index b8f15cf8cc..bcb6a13ad7 100644 --- a/data/assets/scene/solarsystem/missions/artemis/toggle_trail.asset +++ b/data/assets/scene/solarsystem/missions/artemis/toggle_trail.asset @@ -46,7 +46,7 @@ local ToggleTrail = { node is currently in focus and only hide Artemis trails if it is in focus (as the 'Node') and 2) the transition direction (as 'Approaching' or 'Exiting')]], GuiPath = "/Artemis/Events", - IsLocal = true + IsLocal = false } diff --git a/data/assets/scene/solarsystem/planets/jupiter/major_moons.asset b/data/assets/scene/solarsystem/planets/jupiter/major_moons.asset index e0eb196004..98dccf15d3 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/major_moons.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/major_moons.asset @@ -27,7 +27,7 @@ local JupiterMajorMoonsOn = { ]], Documentation = "Turn ON Jupiter's major moons and their trails", GuiPath = "/Solar System/Jupiter", - IsLocal = true + IsLocal = false } local JupiterMajorMoonsOff = { @@ -62,7 +62,7 @@ local JupiterMajorMoonsOff = { ]], Documentation = "Turn OFF Jupiter's major moons and their trails", GuiPath = "/Solar System/Jupiter", - IsLocal = true + IsLocal = false } diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor_moons.asset b/data/assets/scene/solarsystem/planets/jupiter/minor_moons.asset index 67292c4586..c071959616 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor_moons.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor_moons.asset @@ -31,7 +31,7 @@ local JupiterMinorMoonsOn = { ]], Documentation = "Turn ON Jupiter's minor moons and their trails", GuiPath = "/Solar System/Jupiter", - IsLocal = true + IsLocal = false } local JupiterMinorMoonsOff = { @@ -66,7 +66,7 @@ local JupiterMinorMoonsOff = { ]], Documentation = "Turn OFF Jupiter's minor moons and their trails", GuiPath = "/Solar System/Jupiter", - IsLocal = true + IsLocal = false } diff --git a/data/assets/scene/solarsystem/planets/neptune/major_moons.asset b/data/assets/scene/solarsystem/planets/neptune/major_moons.asset index d8040bb25b..190dd64267 100644 --- a/data/assets/scene/solarsystem/planets/neptune/major_moons.asset +++ b/data/assets/scene/solarsystem/planets/neptune/major_moons.asset @@ -26,7 +26,7 @@ local NeptuneMajorMoonsOn = { ]], Documentation = "Turn ON Neptune's major moons and their trails", GuiPath = "/Solar System/Neptune", - IsLocal = true + IsLocal = false } local NeptuneMajorMoonsOff = { @@ -61,7 +61,7 @@ local NeptuneMajorMoonsOff = { ]], Documentation = "Turn OFF Neptune's major moons and their trails", GuiPath = "/Solar System/Neptune", - IsLocal = true + IsLocal = false } diff --git a/data/assets/scene/solarsystem/planets/neptune/minor_moons.asset b/data/assets/scene/solarsystem/planets/neptune/minor_moons.asset index e30c04a6a1..c4c1511261 100644 --- a/data/assets/scene/solarsystem/planets/neptune/minor_moons.asset +++ b/data/assets/scene/solarsystem/planets/neptune/minor_moons.asset @@ -25,7 +25,7 @@ local NeptuneMinorMoonsOn = { ]], Documentation = "Turn ON Neptune's minor moons and their trails", GuiPath = "/Solar System/Neptune", - IsLocal = true + IsLocal = false } local NeptuneMinorMoonsOff = { @@ -60,7 +60,7 @@ local NeptuneMinorMoonsOff = { ]], Documentation = "Turn OFF Neptune's minor moons and their trails", GuiPath = "/Solar System/Neptune", - IsLocal = true + IsLocal = false } diff --git a/data/assets/scene/solarsystem/planets/saturn/major_moons.asset b/data/assets/scene/solarsystem/planets/saturn/major_moons.asset index 8f7aa38c72..5f7e9524ab 100644 --- a/data/assets/scene/solarsystem/planets/saturn/major_moons.asset +++ b/data/assets/scene/solarsystem/planets/saturn/major_moons.asset @@ -32,7 +32,7 @@ local SaturnMajorMoonsOn = { ]], Documentation = "Turn ON Saturn's major moons and their trails", GuiPath = "/Solar System/Saturn", - IsLocal = true + IsLocal = false } local SaturnMajorMoonsOff = { @@ -67,7 +67,7 @@ local SaturnMajorMoonsOff = { ]], Documentation = "Turn OFF Saturn's major moons and their trails", GuiPath = "/Solar System/Saturn", - IsLocal = true + IsLocal = false } diff --git a/data/assets/scene/solarsystem/planets/saturn/minor_moons.asset b/data/assets/scene/solarsystem/planets/saturn/minor_moons.asset index f2db6cfe5f..b1ba22ded4 100644 --- a/data/assets/scene/solarsystem/planets/saturn/minor_moons.asset +++ b/data/assets/scene/solarsystem/planets/saturn/minor_moons.asset @@ -28,7 +28,7 @@ local SaturnMinorMoonsOn = { ]], Documentation = "Turn ON Saturn's minor moons and their trails", GuiPath = "/Solar System/Saturn", - IsLocal = true + IsLocal = false } local SaturnMinorMoonsOff = { @@ -63,7 +63,7 @@ local SaturnMinorMoonsOff = { ]], Documentation = "Turn OFF Saturn's minor moons and their trails", GuiPath = "/Solar System/Saturn", - IsLocal = true + IsLocal = false } diff --git a/data/assets/scene/solarsystem/planets/uranus/major_moons.asset b/data/assets/scene/solarsystem/planets/uranus/major_moons.asset index 8b8d1c527b..53550d4f6c 100644 --- a/data/assets/scene/solarsystem/planets/uranus/major_moons.asset +++ b/data/assets/scene/solarsystem/planets/uranus/major_moons.asset @@ -371,7 +371,7 @@ local UranusMajorMoonsOn = { ]], Documentation = "Turn ON Uranus's major moons and their trails", GuiPath = "/Solar System/Uranus", - IsLocal = true + IsLocal = false } local UranusMajorMoonsOff = { @@ -406,7 +406,7 @@ local UranusMajorMoonsOff = { ]], Documentation = "Turn OFF Uranus's major moons and their trails", GuiPath = "/Solar System/Uranus", - IsLocal = true + IsLocal = false } diff --git a/data/assets/scene/solarsystem/planets/uranus/minor_moons.asset b/data/assets/scene/solarsystem/planets/uranus/minor_moons.asset index 02e89109a3..ec8b985f20 100644 --- a/data/assets/scene/solarsystem/planets/uranus/minor_moons.asset +++ b/data/assets/scene/solarsystem/planets/uranus/minor_moons.asset @@ -26,7 +26,7 @@ local UranusMinorMoonsOn = { ]], Documentation = "Turn ON Uranus's minor moons and their trails", GuiPath = "/Solar System/Uranus", - IsLocal = true + IsLocal = false } local UranusMinorMoonsOff = { @@ -61,7 +61,7 @@ local UranusMinorMoonsOff = { ]], Documentation = "Turn OFF Uranus's minor moons and their trails", GuiPath = "/Solar System/Uranus", - IsLocal = true + IsLocal = false } diff --git a/data/assets/scene/solarsystem/telescopes/jwst/point_jwst.asset b/data/assets/scene/solarsystem/telescopes/jwst/point_jwst.asset index ebe2b56876..bc2bd95d60 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/point_jwst.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/point_jwst.asset @@ -136,7 +136,7 @@ local PointJwst = { sky coordinate as arguments. ]], GuiPath = "/JWST/Events", - IsLocal = true + IsLocal = false } diff --git a/data/assets/scene/solarsystem/telescopes/jwst/toggle_trail.asset b/data/assets/scene/solarsystem/telescopes/jwst/toggle_trail.asset index 63c9afc1e0..36c89c61cc 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/toggle_trail.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/toggle_trail.asset @@ -53,7 +53,7 @@ local ToggleTrail = { node is currently in focus and only hide JWST trail if it is in focus (as the 'Node') and 2) the transition direction (as 'Approaching' or 'Exiting')]], GuiPath = "/JWST/Events", - IsLocal = true + IsLocal = false } From a2004e7bade7d927e9f90f4d0c1a6996c5c14b3d Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Tue, 12 Sep 2023 13:18:11 +0200 Subject: [PATCH 129/701] Fix issue with example video for the globe --- data/assets/examples/video/videoglobe.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/examples/video/videoglobe.asset b/data/assets/examples/video/videoglobe.asset index 657ed5e04e..83f9bcf7b6 100644 --- a/data/assets/examples/video/videoglobe.asset +++ b/data/assets/examples/video/videoglobe.asset @@ -9,7 +9,7 @@ local Layer = { Name = "Globe Video Loop Example", Identifier = "GlobeVideoLoopExample", Enabled = true, - Type = "VideoTileLayer", + Type = "VideoTileProvider", Video = asset.localResource("examplevideo.mp4"), } From 8c327576d5abc207073ff042830ae6f1cd54430c Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Tue, 12 Sep 2023 13:18:25 +0200 Subject: [PATCH 130/701] Update editorconfig file --- .editorconfig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.editorconfig b/.editorconfig index ea67455ec4..5a1c0f0d3c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -9,3 +9,7 @@ charset = utf-8 indent_style = space indent_size = 4 insert_final_newline = true +trim_trailing_whitespace = true + +[data/**.asset] +indent_size = 2 From a2d8e40fb5f02f9532e0ff77134b6d61f23855c8 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 13 Sep 2023 09:44:46 +0200 Subject: [PATCH 131/701] Create SECURITY.md --- .github/SECURITY.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .github/SECURITY.md diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 0000000000..f1f4116f2f --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,3 @@ +If you find any security issues with OpenSpace of any of its components, please __do not report the issue here on GitHub__. Instead send an email to support@openspaceproject.com, preferrably with the prefix "Vulnerability: " as these are processed immediately. Alternatively, you can also report it @Alex Bock or @Megan Villa on the public Slack for which you can sign up [here](https://join.slack.com/t/openspacesupport/shared_invite/zt-37niq6y9-T0JaCIk4UoFLI4VF5U9Vsw). Please do not report it in the general channel, but as a private message instead. + +Thank you! From a4af241cadc0f603c4c020d950514d30f87f5e23 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 13 Sep 2023 09:50:09 +0200 Subject: [PATCH 132/701] Add assets for eclipse profile (#2878) * Add assets for eclipse profile * Include the eclipse shadow in the eclipse profile * Fix issue with the eclipse extended in both directions. Disable the Earth and Moon grids by default in the profile --- .../eclipses/corona/corona20170821.asset | 73 + .../planets/earth/eclipses/eclipses.asset | 5 + .../grid/earth_ecliptic_radial_grid.asset | 59 + .../eclipses/grid/moon_radial_grid.asset | 49 + .../earth/eclipses/paths/annular.asset | 20 + .../eclipses/paths/annular/2003-05-31.asset | 35 + .../eclipses/paths/annular/2005-10-03.asset | 35 + .../eclipses/paths/annular/2006-09-22.asset | 35 + .../eclipses/paths/annular/2008-02-07.asset | 35 + .../eclipses/paths/annular/2009-01-26.asset | 35 + .../eclipses/paths/annular/2010-01-15.asset | 35 + .../eclipses/paths/annular/2012-05-20.asset | 35 + .../eclipses/paths/annular/2013-05-10.asset | 35 + .../eclipses/paths/annular/2014-04-29.asset | 35 + .../eclipses/paths/annular/2016-09-01.asset | 35 + .../eclipses/paths/annular/2017-02-26.asset | 35 + .../eclipses/paths/annular/2019-12-26.asset | 35 + .../eclipses/paths/annular/2020-06-21.asset | 35 + .../eclipses/paths/annular/2021-06-10.asset | 36 + .../eclipses/paths/annular/2023-10-14.asset | 35 + .../eclipses/paths/annular/2024-10-02.asset | 35 + .../eclipses/paths/annular/2026-02-17.asset | 35 + .../eclipses/paths/annular/2027-02-06.asset | 35 + .../eclipses/paths/annular/2028-01-26.asset | 35 + .../eclipses/paths/annular/2030-06-01.asset | 35 + .../earth/eclipses/paths/annular_data.asset | 8 + .../planets/earth/eclipses/paths/hybrid.asset | 4 + .../eclipses/paths/hybrid/2005-04-08.asset | 35 + .../eclipses/paths/hybrid/2013-11-03.asset | 35 + .../eclipses/paths/hybrid/2023-04-20.asset | 35 + .../eclipses/paths/hybrid/2031-11-14.asset | 35 + .../earth/eclipses/paths/hybrid_data.asset | 8 + .../planets/earth/eclipses/paths/paths.asset | 3 + .../planets/earth/eclipses/paths/total.asset | 29 + .../eclipses/paths/total/2003-11-23.asset | 35 + .../eclipses/paths/total/2006-03-29.asset | 35 + .../eclipses/paths/total/2008-08-01.asset | 35 + .../eclipses/paths/total/2009-07-22.asset | 35 + .../eclipses/paths/total/2010-07-11.asset | 35 + .../eclipses/paths/total/2012-11-13.asset | 35 + .../eclipses/paths/total/2015-03-20.asset | 35 + .../eclipses/paths/total/2016-03-09.asset | 35 + .../eclipses/paths/total/2017-08-21.asset | 35 + .../eclipses/paths/total/2019-07-02.asset | 35 + .../eclipses/paths/total/2020-12-14.asset | 35 + .../eclipses/paths/total/2021-12-04.asset | 35 + .../eclipses/paths/total/2024-04-08.asset | 35 + .../eclipses/paths/total/2026-08-12.asset | 35 + .../eclipses/paths/total/2027-08-02.asset | 35 + .../eclipses/paths/total/2028-07-22.asset | 37 + .../eclipses/paths/total/2030-11-25.asset | 35 + .../eclipses/paths/total/2033-03-30.asset | 37 + .../eclipses/paths/total/2034-03-20.asset | 37 + .../eclipses/paths/total/2035-09-02.asset | 35 + .../eclipses/paths/total/2037-07-13.asset | 35 + .../eclipses/paths/total/2038-12-26.asset | 35 + .../eclipses/paths/total/2039-12-15.asset | 35 + .../eclipses/paths/total/2041-04-30.asset | 35 + .../eclipses/paths/total/2042-04-20.asset | 37 + .../eclipses/paths/total/2043-04-09.asset | 35 + .../earth/eclipses/paths/total_data.asset | 8 + .../planets/earth/eclipses/timeline.asset | 2290 +++++++++++++++++ data/profiles/eclipse.profile | 74 + .../space/rendering/renderableeclipsecone.cpp | 2 +- 64 files changed, 4390 insertions(+), 1 deletion(-) create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/corona/corona20170821.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/eclipses.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/grid/earth_ecliptic_radial_grid.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/grid/moon_radial_grid.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2003-05-31.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2005-10-03.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2006-09-22.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2008-02-07.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2009-01-26.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2010-01-15.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2012-05-20.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2013-05-10.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2014-04-29.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2016-09-01.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2017-02-26.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2019-12-26.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2020-06-21.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2021-06-10.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2023-10-14.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2024-10-02.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2026-02-17.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2027-02-06.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2028-01-26.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2030-06-01.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular_data.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid/2005-04-08.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid/2013-11-03.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid/2023-04-20.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid/2031-11-14.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid_data.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/paths.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2003-11-23.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2006-03-29.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2008-08-01.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2009-07-22.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2010-07-11.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2012-11-13.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2015-03-20.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2016-03-09.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2017-08-21.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2019-07-02.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2020-12-14.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2021-12-04.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2024-04-08.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2026-08-12.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2027-08-02.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2028-07-22.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2030-11-25.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2033-03-30.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2034-03-20.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2035-09-02.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2037-07-13.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2038-12-26.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2039-12-15.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2041-04-30.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2042-04-20.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2043-04-09.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/paths/total_data.asset create mode 100644 data/assets/scene/solarsystem/planets/earth/eclipses/timeline.asset create mode 100644 data/profiles/eclipse.profile diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/corona/corona20170821.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/corona/corona20170821.asset new file mode 100644 index 0000000000..ca47bbc223 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/corona/corona20170821.asset @@ -0,0 +1,73 @@ +local transforms = asset.require("scene/solarsystem/sun/transforms") + + + +local videos = asset.syncedResource({ + Name = "Eclipse Corona Video", + Type = "HttpSynchronization", + Identifier = "earth-eclipse-corona", + Version = 1 +}) + + +local Plane = { + Identifier = "CoronaVideoPlane", + Parent = transforms.SunIAU.Identifier, + Transform = { + Rotation = { + Type = "StaticRotation", + Rotation = { 1.57, 0.0, 0.45 } + }, + Scale = { + Type = "StaticScale", + Scale = 30.3 + } + }, + Renderable = { + Type = "RenderableVideoPlane", + Enabled = false, + MirrorBackside = true, + Size = 30000000, + Video = videos .. "corona20170821_0171.mp4", + PlaybackMode = "MapToSimulationTime", + StartTime = "2017 08 21 00:00:00", + EndTime = "2017 08 21 23:59:59", + }, + GUI = { + Name = "Sun Corona", + Path = "/Solar System/Sun" + }, +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(Plane) + + openspace.scriptScheduler.loadScheduledScript( + "2017 AUG 21 00:00:00", + [[openspace.setPropertyValueSingle("Scene.CoronaVideoPlane.Renderable.Enabled", true)]], + [[openspace.setPropertyValueSingle("Scene.CoronaVideoPlane.Renderable.Enabled", false)]] + ) + openspace.scriptScheduler.loadScheduledScript( + "2017 AUG 21 23:59:59", + [[openspace.setPropertyValueSingle("Scene.CoronaVideoPlane.Renderable.Enabled", false)]], + [[openspace.setPropertyValueSingle("Scene.CoronaVideoPlane.Renderable.Enabled", true)]] + ) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(Plane) +end) + +asset.export(Plane) + + + +asset.meta = { + Name = "Corona 2017-08-21", + Version = "1.0", + Description = "An SDO video of the Sun for the day 2017-08-21", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/eclipses.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/eclipses.asset new file mode 100644 index 0000000000..08edb1d99d --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/eclipses.asset @@ -0,0 +1,5 @@ +asset.require("./timeline") +asset.require("./corona/corona20170821") +asset.require("./grid/earth_ecliptic_radial_grid") +asset.require("./grid/moon_radial_grid") +asset.require("./paths/paths") diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/grid/earth_ecliptic_radial_grid.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/grid/earth_ecliptic_radial_grid.asset new file mode 100644 index 0000000000..7cec21c1a9 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/grid/earth_ecliptic_radial_grid.asset @@ -0,0 +1,59 @@ +local transforms = asset.require("scene/solarsystem/planets/earth/transforms") + + + +local EclipticRotationMatrix = { + -0.05487554, 0.4941095, -0.8676661, + -0.9938214, -0.1109906, -0.0003515167, + -0.09647644, 0.8622859, 0.4971472 +} + + +local eclipticGrid = { + Identifier = "EarthEclipticRadialGrid", + Parent = transforms.EarthCenter.Identifier, + Transform = { + Rotation = { + Type = "StaticRotation", + Rotation = EclipticRotationMatrix + }, + Scale = { + Type = "StaticScale", + Scale = 430000000 + }, + }, + Renderable = { + Type = "RenderableRadialGrid", + Color = { 0.086, 0.106, 0.431 }, + LineWidth = 2.0, + GridSegments = { 8, 8 }, + CircleSegments = 64, + Radii = { 0.0, 1.0 } + }, + GUI = { + Name = "Earth Ecliptic Grid", + Path = "/Solar System/Planets/Earth", + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(eclipticGrid) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(eclipticGrid) +end) + +asset.export(eclipticGrid) + + + +asset.meta = { + Name = "Earth Ecliptic Grid", + Version = "1.0", + Description = "A grid that shows the ecliptic of the Earth a radial grid", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/grid/moon_radial_grid.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/grid/moon_radial_grid.asset new file mode 100644 index 0000000000..ecb3d6e613 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/grid/moon_radial_grid.asset @@ -0,0 +1,49 @@ +local moon = asset.require("scene/solarsystem/planets/earth/moon/moon") + + + +local orbitalPlaneGrid = { + Identifier = "MoonOrbitalPlaneRadialGrid", + Parent = "Moon", + Transform = { + Scale = { + Type = "StaticScale", + Scale = 430000000 + }, + }, + Renderable = { + Type = "RenderableRadialGrid", + Color = { 0.502, 0.502, 0.502 }, + LineWidth = 2.0, + GridSegments = { 8, 8 }, + CircleSegments = 64, + Radii = { 0.0, 1.0 } + }, + GUI = { + Name = "Moon Ecliptic Grid", + Path = "/Solar System/Planets/Earth/Moon", + } +} + + + +asset.onInitialize(function() + openspace.addSceneGraphNode(orbitalPlaneGrid) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(orbitalPlaneGrid) +end) + +asset.export(orbitalPlaneGrid) + + + +asset.meta = { + Name = "Moon Orbital Plane", + Version = "1.0", + Description = "A grid that shows the orbital plane of the Moon", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular.asset new file mode 100644 index 0000000000..39df373484 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular.asset @@ -0,0 +1,20 @@ +asset.require("./annular/2003-05-31") +asset.require("./annular/2005-10-03") +asset.require("./annular/2006-09-22") +asset.require("./annular/2008-02-07") +asset.require("./annular/2009-01-26") +asset.require("./annular/2010-01-15") +asset.require("./annular/2012-05-20") +asset.require("./annular/2013-05-10") +asset.require("./annular/2014-04-29") +asset.require("./annular/2016-09-01") +asset.require("./annular/2017-02-26") +asset.require("./annular/2019-12-26") +asset.require("./annular/2020-06-21") +asset.require("./annular/2021-06-10") +asset.require("./annular/2023-10-14") +asset.require("./annular/2024-10-02") +asset.require("./annular/2026-02-17") +asset.require("./annular/2027-02-06") +asset.require("./annular/2028-01-26") +asset.require("./annular/2030-06-01") diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2003-05-31.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2003-05-31.asset new file mode 100644 index 0000000000..e34c8017b3 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2003-05-31.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2003-05-31", + Enabled = false, + File = data.path .. "2003-05-31.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2003-05-31", + Version = "1.0", + Description = "Annular eclipse map for 2003-05-31", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2005-10-03.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2005-10-03.asset new file mode 100644 index 0000000000..7166488752 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2005-10-03.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2005-10-03", + Enabled = false, + File = data.path .. "2005-10-03.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2005-10-03", + Version = "1.0", + Description = "Annular eclipse map for 2005-10-03", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2006-09-22.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2006-09-22.asset new file mode 100644 index 0000000000..b5c981dc97 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2006-09-22.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2006-09-22", + Enabled = false, + File = data.path .. "2006-09-22.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2006-09-22", + Version = "1.0", + Description = "Annular eclipse map for 2006-09-22", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2008-02-07.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2008-02-07.asset new file mode 100644 index 0000000000..178dc65054 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2008-02-07.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2008-02-07", + Enabled = false, + File = data.path .. "2008-02-07.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2008-02-07", + Version = "1.0", + Description = "Annular eclipse map for 2008-02-07", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2009-01-26.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2009-01-26.asset new file mode 100644 index 0000000000..327ebe3704 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2009-01-26.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2009-01-26", + Enabled = false, + File = data.path .. "2009-01-26.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2009-01-26", + Version = "1.0", + Description = "Annular eclipse map for 2009-01-26", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2010-01-15.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2010-01-15.asset new file mode 100644 index 0000000000..19f8f72b25 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2010-01-15.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2010-01-15", + Enabled = false, + File = data.path .. "2010-01-15.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2010-01-15", + Version = "1.0", + Description = "Annular eclipse map for 2010-01-15", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2012-05-20.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2012-05-20.asset new file mode 100644 index 0000000000..02b08d1105 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2012-05-20.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2012-05-20", + Enabled = false, + File = data.path .. "2012-05-20.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2012-05-20", + Version = "1.0", + Description = "Annular eclipse map for 2012-05-20", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2013-05-10.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2013-05-10.asset new file mode 100644 index 0000000000..36b1a91dc0 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2013-05-10.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2013-05-10", + Enabled = false, + File = data.path .. "2013-05-10.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2013-05-10", + Version = "1.0", + Description = "Annular eclipse map for 2013-05-10", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2014-04-29.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2014-04-29.asset new file mode 100644 index 0000000000..453eb7c081 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2014-04-29.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2014-04-29", + Enabled = false, + File = data.path .. "2014-04-29.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2014-04-29", + Version = "1.0", + Description = "Annular eclipse map for 2014-04-29", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2016-09-01.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2016-09-01.asset new file mode 100644 index 0000000000..5a4ce9bb14 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2016-09-01.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2016-09-01", + Enabled = false, + File = data.path .. "2016-09-01.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2016-09-01", + Version = "1.0", + Description = "Annular eclipse map for 2016-09-01", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2017-02-26.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2017-02-26.asset new file mode 100644 index 0000000000..12567c9071 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2017-02-26.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2017-02-26", + Enabled = false, + File = data.path .. "2017-02-26.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2017-02-26", + Version = "1.0", + Description = "Annular eclipse map for 2017-02-26", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2019-12-26.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2019-12-26.asset new file mode 100644 index 0000000000..47a13fc598 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2019-12-26.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2019-12-26", + Enabled = false, + File = data.path .. "2019-12-26.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2019-12-26", + Version = "1.0", + Description = "Annular eclipse map for 2019-12-26", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2020-06-21.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2020-06-21.asset new file mode 100644 index 0000000000..9686af3657 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2020-06-21.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2020-06-21", + Enabled = false, + File = data.path .. "2020-06-21.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2020-06-21", + Version = "1.0", + Description = "Annular eclipse map for 2020-06-21", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2021-06-10.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2021-06-10.asset new file mode 100644 index 0000000000..144334625b --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2021-06-10.asset @@ -0,0 +1,36 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2021-06-10", + Enabled = false, + File = data.path .. "2021-06-10.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + -- @TODO: The file contains a non-simple geometry which is currently not supported + -- openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + -- openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2021-06-10", + Version = "1.0", + Description = "Annular eclipse map for 2021-06-10", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2023-10-14.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2023-10-14.asset new file mode 100644 index 0000000000..9ed1bbc35c --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2023-10-14.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2023-10-14", + Enabled = false, + File = data.path .. "2023-10-14.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2023-10-14", + Version = "1.0", + Description = "Annular eclipse map for 2023-10-14", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2024-10-02.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2024-10-02.asset new file mode 100644 index 0000000000..ffdd14f68f --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2024-10-02.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2024-10-02", + Enabled = false, + File = data.path .. "2024-10-02.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2024-10-02", + Version = "1.0", + Description = "Annular eclipse map for 2024-10-02", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2026-02-17.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2026-02-17.asset new file mode 100644 index 0000000000..f9b7e5158a --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2026-02-17.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2026-02-17", + Enabled = false, + File = data.path .. "2026-02-17.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2026-02-17", + Version = "1.0", + Description = "Annular eclipse map for 2026-02-17", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2027-02-06.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2027-02-06.asset new file mode 100644 index 0000000000..788110b461 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2027-02-06.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2027-02-06", + Enabled = false, + File = data.path .. "2027-02-06.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2027-02-06", + Version = "1.0", + Description = "Annular eclipse map for 2027-02-06", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2028-01-26.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2028-01-26.asset new file mode 100644 index 0000000000..1376c23149 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2028-01-26.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2028-01-26", + Enabled = false, + File = data.path .. "2028-01-26.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2028-01-26", + Version = "1.0", + Description = "Annular eclipse map for 2028-01-26", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2030-06-01.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2030-06-01.asset new file mode 100644 index 0000000000..02a48e3f28 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular/2030-06-01.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../annular_data') + + + +local Layer = { + Identifier = "Annular-2030-06-01", + Enabled = false, + File = data.path .. "2030-06-01.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Annular 2030-06-01", + Version = "1.0", + Description = "Annular eclipse map for 2030-06-01", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular_data.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular_data.asset new file mode 100644 index 0000000000..e834107191 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular_data.asset @@ -0,0 +1,8 @@ +local data = asset.syncedResource({ + Name = "Annular Eclipse Paths", + Type = "HttpSynchronization", + Identifier = "earth-eclipse-path-annular", + Version = 1 +}) + +asset.export("path", data) diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid.asset new file mode 100644 index 0000000000..d42ee8ec41 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid.asset @@ -0,0 +1,4 @@ +asset.require("./hybrid/2005-04-08") +asset.require("./hybrid/2013-11-03") +asset.require("./hybrid/2023-04-20") +asset.require("./hybrid/2031-11-14") diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid/2005-04-08.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid/2005-04-08.asset new file mode 100644 index 0000000000..232028e33e --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid/2005-04-08.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../hybrid_data') + + + +local Layer = { + Identifier = "Hybrid-2005-04-08", + Enabled = false, + File = data.path .. "2005-04-08.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Hybrid 2005-04-08", + Version = "1.0", + Description = "Hybrid eclipse map for 2005-04-08", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid/2013-11-03.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid/2013-11-03.asset new file mode 100644 index 0000000000..c199f77c5e --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid/2013-11-03.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../hybrid_data') + + + +local Layer = { + Identifier = "Hybrid-2013-11-03", + Enabled = false, + File = data.path .. "2013-11-03.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Hybrid 2013-11-03", + Version = "1.0", + Description = "Hybrid eclipse map for 2013-11-03", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid/2023-04-20.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid/2023-04-20.asset new file mode 100644 index 0000000000..0ef81475a5 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid/2023-04-20.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../hybrid_data') + + + +local Layer = { + Identifier = "Hybrid-2023-04-20", + Enabled = false, + File = data.path .. "2023-04-20.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Hybrid 2023-04-20", + Version = "1.0", + Description = "Hybrid eclipse map for 2023-04-20", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid/2031-11-14.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid/2031-11-14.asset new file mode 100644 index 0000000000..086ff2fefc --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid/2031-11-14.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../hybrid_data') + + + +local Layer = { + Identifier = "Hybrid-2031-11-14", + Enabled = false, + File = data.path .. "2031-11-14.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Hybrid 2031-11-14", + Version = "1.0", + Description = "Hybrid eclipse map for 2031-11-14", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid_data.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid_data.asset new file mode 100644 index 0000000000..e2ef0f9ffd --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid_data.asset @@ -0,0 +1,8 @@ +local data = asset.syncedResource({ + Name = "Hybrid Eclipse Paths", + Type = "HttpSynchronization", + Identifier = "earth-eclipse-path-hybrid", + Version = 1 +}) + +asset.export("path", data) diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/paths.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/paths.asset new file mode 100644 index 0000000000..28e34ec5e9 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/paths.asset @@ -0,0 +1,3 @@ +asset.require("./annular") +asset.require("./hybrid") +asset.require("./total") diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total.asset new file mode 100644 index 0000000000..230c73e921 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total.asset @@ -0,0 +1,29 @@ +-- The assets that are commented out in this file currently produce a warning as they +-- contain geometry that cannot be displayed by OpenSpace correctly + +asset.require("./total/2003-11-23") +asset.require("./total/2006-03-29") +asset.require("./total/2008-08-01") +asset.require("./total/2009-07-22") +asset.require("./total/2010-07-11") +asset.require("./total/2012-11-13") +asset.require("./total/2015-03-20") +asset.require("./total/2016-03-09") +asset.require("./total/2017-08-21") +asset.require("./total/2019-07-02") +asset.require("./total/2020-12-14") +asset.require("./total/2021-12-04") +asset.require("./total/2024-04-08") +asset.require("./total/2026-08-12") +asset.require("./total/2027-08-02") +-- asset.require("./total/2028-07-22") +asset.require("./total/2030-11-25") +-- asset.require("./total/2033-03-30") +-- asset.require("./total/2034-03-20") +asset.require("./total/2035-09-02") +asset.require("./total/2037-07-13") +asset.require("./total/2038-12-26") +asset.require("./total/2039-12-15") +asset.require("./total/2041-04-30") +-- asset.require("./total/2042-04-20") +asset.require("./total/2043-04-09") diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2003-11-23.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2003-11-23.asset new file mode 100644 index 0000000000..82dee12ec2 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2003-11-23.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2003-11-23", + Enabled = false, + File = data.path .. "2003-11-23.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2003-11-23", + Version = "1.0", + Description = "Total eclipse map for 2003-11-23", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2006-03-29.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2006-03-29.asset new file mode 100644 index 0000000000..93642d6571 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2006-03-29.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2006-03-29", + Enabled = false, + File = data.path .. "2006-03-29.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2006-03-29", + Version = "1.0", + Description = "Total eclipse map for 2006-03-29", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2008-08-01.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2008-08-01.asset new file mode 100644 index 0000000000..03df58c887 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2008-08-01.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2008-08-01", + Enabled = false, + File = data.path .. "2008-08-01.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2008-08-01", + Version = "1.0", + Description = "Total eclipse map for 2008-08-01", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2009-07-22.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2009-07-22.asset new file mode 100644 index 0000000000..74d7bc9812 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2009-07-22.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2009-07-22", + Enabled = false, + File = data.path .. "2009-07-22.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2009-07-22", + Version = "1.0", + Description = "Total eclipse map for 2009-07-22", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2010-07-11.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2010-07-11.asset new file mode 100644 index 0000000000..7d6324f10c --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2010-07-11.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2010-07-11", + Enabled = false, + File = data.path .. "2010-07-11.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2010-07-11", + Version = "1.0", + Description = "Total eclipse map for 2010-07-11", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2012-11-13.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2012-11-13.asset new file mode 100644 index 0000000000..bdcf752c8f --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2012-11-13.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2012-11-13", + Enabled = false, + File = data.path .. "2012-11-13.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2012-11-13", + Version = "1.0", + Description = "Total eclipse map for 2012-11-13", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2015-03-20.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2015-03-20.asset new file mode 100644 index 0000000000..4c23180746 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2015-03-20.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2015-03-20", + Enabled = false, + File = data.path .. "2015-03-20.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2015-03-20", + Version = "1.0", + Description = "Total eclipse map for 2015-03-20", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2016-03-09.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2016-03-09.asset new file mode 100644 index 0000000000..80dedefe8a --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2016-03-09.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2016-03-09", + Enabled = false, + File = data.path .. "2016-03-09.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2016-03-09", + Version = "1.0", + Description = "Total eclipse map for 2016-03-09", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2017-08-21.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2017-08-21.asset new file mode 100644 index 0000000000..a33a876600 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2017-08-21.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2017-08-21", + Enabled = false, + File = data.path .. "2017-08-21.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2017-08-21", + Version = "1.0", + Description = "Total eclipse map for 2017-08-21", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2019-07-02.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2019-07-02.asset new file mode 100644 index 0000000000..49f39e18dd --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2019-07-02.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2019-07-02", + Enabled = false, + File = data.path .. "2019-07-02.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2019-07-02", + Version = "1.0", + Description = "Total eclipse map for 2019-07-02", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2020-12-14.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2020-12-14.asset new file mode 100644 index 0000000000..116351bc69 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2020-12-14.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2020-12-14", + Enabled = false, + File = data.path .. "2020-12-14.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2020-12-14", + Version = "1.0", + Description = "Total eclipse map for 2020-12-14", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2021-12-04.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2021-12-04.asset new file mode 100644 index 0000000000..b01e33b354 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2021-12-04.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2021-12-04", + Enabled = false, + File = data.path .. "2021-12-04.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2021-12-04", + Version = "1.0", + Description = "Total eclipse map for 2021-12-04", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2024-04-08.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2024-04-08.asset new file mode 100644 index 0000000000..47e8efd726 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2024-04-08.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2024-04-08", + Enabled = false, + File = data.path .. "2024-04-08.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2024-04-08", + Version = "1.0", + Description = "Total eclipse map for 2024-04-08", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2026-08-12.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2026-08-12.asset new file mode 100644 index 0000000000..e73db56245 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2026-08-12.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2026-08-12", + Enabled = false, + File = data.path .. "2026-08-12.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2026-08-12", + Version = "1.0", + Description = "Total eclipse map for 2026-08-12", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2027-08-02.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2027-08-02.asset new file mode 100644 index 0000000000..b13e5035b3 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2027-08-02.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2027-08-02", + Enabled = false, + File = data.path .. "2027-08-02.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2027-08-02", + Version = "1.0", + Description = "Total eclipse map for 2027-08-02", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2028-07-22.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2028-07-22.asset new file mode 100644 index 0000000000..e886f56326 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2028-07-22.asset @@ -0,0 +1,37 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2028-07-22", + Enabled = false, + File = data.path .. "2028-07-22.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.printWarning("The map for the total eclipse of 22nd July 2028 contains a geometry that cannot be read right now") + -- @TODO: The file contains a non-simple geometry which is currently not supported + -- openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + -- openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2028-07-22", + Version = "1.0", + Description = "Total eclipse map for 2028-07-22", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2030-11-25.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2030-11-25.asset new file mode 100644 index 0000000000..b33981bb1e --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2030-11-25.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2030-11-25", + Enabled = false, + File = data.path .. "2030-11-25.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2030-11-25", + Version = "1.0", + Description = "Total eclipse map for 2030-11-25", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2033-03-30.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2033-03-30.asset new file mode 100644 index 0000000000..aae1ac71f0 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2033-03-30.asset @@ -0,0 +1,37 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2033-03-30", + Enabled = false, + File = data.path .. "2033-03-30.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.printWarning("The map for the total eclipse of 30th March 2033 contains a geometry that cannot be read right now") + -- @TODO: The file contains a non-simple geometry which is currently not supported + -- openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + -- openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2033-03-30", + Version = "1.0", + Description = "Total eclipse map for 2033-03-30", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2034-03-20.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2034-03-20.asset new file mode 100644 index 0000000000..c5a662ddab --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2034-03-20.asset @@ -0,0 +1,37 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2034-03-20", + Enabled = false, + File = data.path .. "2034-03-20.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.printWarning("The map for the total eclipse of 20th March 2034 contains a geometry that cannot be read right now") + -- @TODO: The file contains a non-simple geometry which is currently not supported + -- openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + -- openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2034-03-20", + Version = "1.0", + Description = "Total eclipse map for 2034-03-20", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2035-09-02.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2035-09-02.asset new file mode 100644 index 0000000000..ea1110a5b4 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2035-09-02.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2035-09-02", + Enabled = false, + File = data.path .. "2035-09-02.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2035-09-02", + Version = "1.0", + Description = "Total eclipse map for 2035-09-02", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2037-07-13.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2037-07-13.asset new file mode 100644 index 0000000000..9d3b1ba1d3 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2037-07-13.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2037-07-13", + Enabled = false, + File = data.path .. "2037-07-13.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2037-07-13", + Version = "1.0", + Description = "Total eclipse map for 2037-07-13", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2038-12-26.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2038-12-26.asset new file mode 100644 index 0000000000..19964c89ce --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2038-12-26.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2038-12-26", + Enabled = false, + File = data.path .. "2038-12-26.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2038-12-26", + Version = "1.0", + Description = "Total eclipse map for 2038-12-26", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2039-12-15.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2039-12-15.asset new file mode 100644 index 0000000000..46c2d0c9b8 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2039-12-15.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2039-12-15", + Enabled = false, + File = data.path .. "2039-12-15.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2039-12-15", + Version = "1.0", + Description = "Total eclipse map for 2039-12-15", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2041-04-30.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2041-04-30.asset new file mode 100644 index 0000000000..7b215343c7 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2041-04-30.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2041-04-30", + Enabled = false, + File = data.path .. "2041-04-30.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2041-04-30", + Version = "1.0", + Description = "Total eclipse map for 2041-04-30", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2042-04-20.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2042-04-20.asset new file mode 100644 index 0000000000..952a43a8a9 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2042-04-20.asset @@ -0,0 +1,37 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2042-04-20", + Enabled = false, + File = data.path .. "2042-04-20.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.printWarning("The map for the total eclipse of 20th April 2042 contains a geometry that cannot be read right now") + -- @TODO: The file contains a non-simple geometry which is currently not supported + -- openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + -- openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2042-04-20", + Version = "1.0", + Description = "Total eclipse map for 2042-04-20", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2043-04-09.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2043-04-09.asset new file mode 100644 index 0000000000..96a3637e8d --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total/2043-04-09.asset @@ -0,0 +1,35 @@ +local earth = asset.require('scene/solarsystem/planets/earth/earth') +local data = asset.require('../total_data') + + + +local Layer = { + Identifier = "Total-2043-04-09", + Enabled = false, + File = data.path .. "2043-04-09.geojson", + HeightOffset = 2000.0, + DefaultProperties = { + LineWidth = 2.0, + Extrude = true + } +} + + +asset.onInitialize(function() + openspace.globebrowsing.addGeoJson(earth.Earth.Identifier, Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteGeoJson(earth.Earth.Identifier, Layer) +end) + + + +asset.meta = { + Name = "Total 2043-04-09", + Version = "1.0", + Description = "Total eclipse map for 2043-04-09", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total_data.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total_data.asset new file mode 100644 index 0000000000..826632b191 --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total_data.asset @@ -0,0 +1,8 @@ +local data = asset.syncedResource({ + Name = "Total Eclipse Paths", + Type = "HttpSynchronization", + Identifier = "earth-eclipse-path-total", + Version = 1 +}) + +asset.export("path", data) diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/timeline.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/timeline.asset new file mode 100644 index 0000000000..ad5d31540e --- /dev/null +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/timeline.asset @@ -0,0 +1,2290 @@ +local Timeline = { + Name = "Eclipses", + Image = "https://www.esa.int/var/esa/storage/images/esa_multimedia/images/2019/07/stages_of_a_total_solar_eclipse/19468511-1-eng-GB/Stages_of_a_total_solar_eclipse_pillars.jpg", + Description = "An eclipse is an awe-inspiring celestial event that drastically changes the appearance of the two biggest objects we see in our sky: our Sun and Moon. On Earth, people can experience solar eclipses when Earth, the Moon, and the Sun line up. There are four types of solar eclipses: total, partial, hybrid, and annular. The type of eclipse that people get to see depends on how the Moon aligns with Earth and the Sun, and how far away the Moon is from Earth. In addition to inspiring artists and musicians, eclipses have driven numerous scientific discoveries. For over a century, solar eclipses helped scientists decipher the Sun's structure and explosive events, find evidence for the theory of general relativity, discover a new element, and much more. Scientists still study eclipses to make new discoveries about the Sun, Earth, and our space environment. Total solar eclipses are particularly important because they allow scientists to see a part of the Sun's atmosphere - known as the corona - which is too faint to see except when the bright light of the Sun's surface is blocked.", + TimeRange = { + Start = "1900 Jan 01", + End = "2099 Dec 31" + }, + Milestones = { + { + Name = "Total Eclipse", + Date = "1901 May 18 05:33:48", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1902 Apr 08 14:05:06", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1902 Oct 31 08:00:18", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1903 Sep 21 04:39:52", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1904 Sep 09 20:44:21", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1905 Aug 30 13:07:26", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1906 Jul 21 13:14:19", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1907 Jan 14 06:05:43", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1908 Jan 03 21:45:22", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Hybrid Eclipse", + Date = "1908 Dec 23 11:44:28", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1909 Dec 12 19:44:48", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1910 Nov 02 02:08:32", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1911 Oct 22 04:13:02", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1912 Oct 10 13:36:14", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1913 Aug 31 20:52:12", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1914 Feb 25 00:13:01", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1915 Feb 14 04:33:20", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1916 Feb 03 16:00:21", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1916 Dec 24 20:46:22", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1917 Jun 19 13:16:21", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1917 Dec 14 09:27:20", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1918 Dec 03 15:22:02", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1919 Nov 22 15:14:12", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1920 Nov 10 15:52:15", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1921 Oct 01 12:35:58", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1922 Sep 21 04:40:31", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1923 Sep 10 20:47:29", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1924 Jul 31 19:58:20", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1925 Jan 24 14:54:03", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1926 Jan 14 06:36:58", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1927 Jan 03 20:22:53", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1927 Dec 24 03:59:41", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1928 Jun 17 20:27:28", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1929 May 09 06:10:34", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Hybrid Eclipse", + Date = "1930 Apr 28 19:03:34", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1931 Apr 18 00:45:35", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1931 Oct 11 12:55:40", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1932 Aug 31 20:03:41", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1933 Aug 21 05:49:11", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1934 Aug 10 08:37:48", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1935 Feb 03 16:16:20", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1935 Jul 30 09:16:28", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1936 Jun 19 05:20:31", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1937 Jun 08 20:41:02", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1938 May 29 13:50:19", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1939 Apr 19 16:45:53", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1940 Apr 07 20:21:21", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1941 Mar 27 20:08:08", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1942 Mar 16 23:37:07", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1942 Sep 10 15:39:32", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1943 Aug 01 04:16:13", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1944 Jul 20 05:43:13", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1945 Jul 09 13:27:45", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1946 May 30 21:00:24", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1946 Nov 23 17:37:12", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1947 Nov 12 20:05:37", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1948 Nov 01 05:59:18", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1949 Oct 21 21:13:01", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1950 Sep 12 03:38:47", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1951 Sep 01 12:51:51", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1952 Aug 20 15:13:35", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1953 Jul 11 02:44:14", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1954 Jan 05 02:32:01", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1954 Dec 25 07:36:42", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1955 Dec 14 07:02:25", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1956 Dec 02 08:00:35", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1957 Oct 23 04:54:02", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1958 Oct 12 20:55:28", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1959 Oct 02 12:27:00", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1960 Sep 20 22:59:56", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1961 Aug 11 10:46:47", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1962 Jul 31 12:25:33", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1963 Jul 20 20:36:13", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1964 Jun 10 04:34:07", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1964 Dec 04 01:31:54", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1965 Nov 23 04:14:51", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1966 Nov 12 14:23:28", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1967 Nov 02 05:38:56", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1968 Sep 22 11:18:46", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1969 Sep 11 19:58:59", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1970 Aug 31 21:55:30", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1971 Jul 22 09:31:55", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1972 Jan 16 11:03:22", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1973 Jan 04 15:46:21", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1973 Dec 24 15:02:44", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1974 Dec 13 16:13:13", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1975 Nov 03 13:15:54", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1976 Oct 23 05:13:45", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1977 Oct 12 20:27:27", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1978 Oct 02 06:28:43", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1979 Aug 22 17:22:38", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1980 Aug 10 19:12:21", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1981 Jul 31 03:46:37", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1982 Jun 21 12:04:33", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1982 Dec 15 09:32:09", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1983 Dec 04 12:31:15", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1984 Nov 22 22:54:17", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1985 Nov 12 14:11:27", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Hybrid Eclipse", + Date = "1986 Oct 03 19:06:15", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1987 Sep 23 03:12:22", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1988 Sep 11 04:44:29", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1989 Aug 31 05:31:47", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1990 Jul 22 03:03:07", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1991 Jul 11 19:07:01", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1992 Jun 30 12:11:22", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1993 May 21 14:20:15", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1994 May 10 17:12:26", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1995 Apr 29 17:33:21", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "1996 Apr 17 22:38:12", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1997 Mar 09 01:24:51", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "1998 Feb 26 17:29:27", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Annular Eclipse", + Date = "1999 Feb 16 06:34:38", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "2000 Feb 05 12:50:27", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Partial Eclipse", + Date = "2000 Jul 31 02:14:08", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/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" + }, + { + Name = "Total Eclipse", + Date = "2001 Jun 21 12:04:46", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2002 Jun 10 23:45:22", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2003 May 31 04:09:22", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2004 Apr 19 13:35:05", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Hybrid Eclipse", + Date = "2005 Apr 08 20:36:51", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2006 Mar 29 10:12:23", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2007 Mar 19 02:32:57", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2008 Feb 07 03:56:10", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2009 Jan 26 07:59:45", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2010 Jan 15 07:07:39", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2011 Jan 04 08:51:4", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2011 Jul 01 08:39:30", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2012 May 20 23:53:54", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2013 May 10 00:26:20", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2014 Apr 29 06:04:33", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2015 Mar 20 09:46:47", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2016 Mar 09 01:58:19", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2017 Feb 26 14:54:33", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2018 Feb 15 20:52:33", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2018 Aug 11 09:47:28", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2019 Jul 02 19:24:07", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2020 Jun 21 06:41:15", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2021 Jun 10 10:43:07", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2022 Apr 30 20:42:36", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Hybrid Eclipse", + Date = "2023 Apr 20 04:17:56", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2024 Apr 08 18:18:29", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2025 Mar 29 10:48:36", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2026 Feb 17 12:13:06", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2027 Feb 06 16:00:48", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2028 Jan 26 15:08:59", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2029 Jan 14 17:13:48", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2029 Jul 11 15:37:19", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2030 Jun 01 06:29:13", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2031 May 21 07:16:04", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2032 May 09 13:26:42", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2033 Mar 30 18:02:36", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2034 Mar 20 10:18:45", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2035 Mar 09 23:05:54", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2036 Feb 27 04:46:49", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2036 Aug 21 17:25:45", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2037 Jul 13 02:40:36", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2038 Jul 02 13:32:55", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2039 Jun 21 17:12:54", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2040 May 11 03:43:02", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2041 Apr 30 11:52:21", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2042 Apr 20 02:17:30", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2043 Apr 09 18:57:49", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2044 Feb 28 20:24:39", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2045 Feb 16 23:56:07", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2046 Feb 05 23:06:26", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2047 Jan 26 01:33:18", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2047 Jul 22 22:36:17", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2048 Jun 11 12:58:53", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2049 May 31 13:59:59", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Hybrid Eclipse", + Date = "2050 May 20 20:42:50", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2051 Apr 11 02:10:39", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2052 Mar 30 18:31:53", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2053 Mar 20 07:08:19", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2054 Mar 09 12:33:40", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2054 Sep 02 01:09:34", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2055 Jul 24 09:57:50", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2056 Jul 12 20:21:59", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2057 Jul 01 23:40:15", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2058 May 22 10:39:25", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2058 Nov 16 03:23:07", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2059 Nov 05 09:18:15", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2060 Oct 24 09:24:10", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2061 Oct 13 10:32:10", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2062 Sep 03 08:54:27", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2063 Aug 24 01:22:11", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2064 Aug 12 17:46:06", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2065 Jul 03 17:33:52", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2065 Dec 27 08:39:56", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2066 Dec 17 00:23:40", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Hybrid Eclipse", + Date = "2067 Dec 06 14:03:43", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2068 Nov 24 21:32:30", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2069 May 20 17:53:18", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2070 Apr 11 02:36:09", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2071 Mar 31 15:01:06", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2072 Mar 19 20:10:31", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2073 Feb 07 01:55:59", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2074 Jan 27 06:44:15", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2075 Jan 16 18:36:04", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2076 Jan 06 10:07:27", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2076 Jul 01 06:50:43", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2077 May 22 02:46:05", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2078 May 11 17:56:55", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2079 May 01 10:50:13", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2080 Mar 21 12:20:15", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2081 Mar 10 15:23:31", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2082 Feb 27 14:47:00", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2083 Feb 16 18:06:36", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2083 Aug 13 12:34:41", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2084 Jul 03 01:50:26", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2085 Jun 22 03:21:16", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2086 Jun 11 11:07:14", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2087 May 02 18:04:42", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2087 Oct 26 11:46:57", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2088 Oct 14 14:48:05", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2089 Oct 04 01:15:23", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2090 Sep 23 16:56:36", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Total Eclipse", + Date = "2091 Aug 15 00:34:43", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2092 Aug 03 09:59:33", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2093 Jul 23 12:32:04", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2094 Jun 13 00:22:11", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2094 Dec 07 20:05:56", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2095 Nov 27 01:02:57", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2096 Nov 15 00:36:15", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2097 Nov 04 02:01:25", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Partial Eclipse", + Date = "2098 Sep 25 00:31:16", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2099 Mar 21 22:54:32", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + }, + { + Name = "Annular Eclipse", + Date = "2100 Mar 10 22:28:11", + Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/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" + } + } +} + +asset.onInitialize(function() + openspace.loadMission(Timeline) +end) + +asset.onDeinitialize(function() + openspace.unloadMission(Timeline.Name) +end) + + + +asset.meta = { + Name = "Eclipses Timeline", + Version = "1.0", + Description = "A timeline that shows all of the eclipses in the past and next 100 years", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/profiles/eclipse.profile b/data/profiles/eclipse.profile new file mode 100644 index 0000000000..2e3193ea3e --- /dev/null +++ b/data/profiles/eclipse.profile @@ -0,0 +1,74 @@ +{ + "assets": [ + "base", + "base_keybindings", + "events/toggle_sun", + "scene/solarsystem/planets/earth/earth", + "scene/solarsystem/planets/earth/eclipses/eclipses", + "scene/solarsystem/planets/earth/eclipse_shadow" + ], + "camera": { + "altitude": 17000000.0, + "anchor": "Earth", + "latitude": 58.5877, + "longitude": 16.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": [], + "mark_nodes": [ + "Earth", + "Moon", + "Sun", + "ISS" + ], + "meta": { + "author": "OpenSpace Team", + "description": "OpenSpace profile to highlight solar eclipses on the Earth from 1900 to 2100", + "license": "MIT License", + "name": "Default", + "url": "https://www.openspaceproject.com", + "version": "1.0" + }, + "properties": [ + { + "name": "Scene.MoonOrbitalPlaneRadialGrid.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "false" + }, + { + "name": "Scene.EarthEclipticRadialGrid.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "false" + } + ], + "time": { + "type": "absolute", + "value": "2023 Oct 14 18:00:41" + }, + "version": { + "major": 1, + "minor": 1 + } +} diff --git a/modules/space/rendering/renderableeclipsecone.cpp b/modules/space/rendering/renderableeclipsecone.cpp index 72ef239df6..1f6c893fc1 100644 --- a/modules/space/rendering/renderableeclipsecone.cpp +++ b/modules/space/rendering/renderableeclipsecone.cpp @@ -336,7 +336,7 @@ std::vector calculateShadowPoints(const std::vector& srcT const glm::dvec3 dir = glm::normalize(dst - src); // The start point is the terminator point on the Moon - glm::vec3 p1 = dst -dir * lengthScale*1000.0; + glm::vec3 p1 = dst; vertices.push_back({ p1.x, p1.y, p1.z }); // The end point is calculated by forward propagating the incoming direction From 7483b912e0f96eedaf3f4097c4179b33e706c0fa Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 13 Sep 2023 09:51:30 +0200 Subject: [PATCH 133/701] Update submodules to fix compilation error on newer Clang and GCC (#2890) * Update submodules * Update Ghoul --- apps/OpenSpace/ext/sgct | 2 +- ext/ghoul | 2 +- modules/base/rendering/renderablenodeline.cpp | 4 ++-- modules/base/rendering/renderableplaneimageonline.cpp | 2 +- .../base/rendering/renderableplanetimevaryingimage.cpp | 4 ++-- modules/base/rendering/renderablesphereimageonline.cpp | 2 +- modules/base/rendering/screenspaceimagelocal.cpp | 4 +++- modules/base/rendering/screenspaceimageonline.cpp | 2 +- modules/cefwebgui/cefwebguimodule.cpp | 2 +- modules/gaia/rendering/renderablegaiastars.cpp | 2 +- modules/globebrowsing/src/geojson/geojsoncomponent.cpp | 10 +++++----- .../rendering/renderablekameleonvolume.cpp | 2 +- modules/space/horizonsfile.cpp | 6 ++++-- modules/space/rendering/renderableorbitalkepler.cpp | 2 +- modules/space/rendering/renderablestars.cpp | 4 ++-- modules/video/src/videoplayer.cpp | 3 ++- modules/vislab/rendering/renderabledistancelabel.cpp | 4 +++- src/navigation/pathnavigator.cpp | 2 +- src/scene/assetmanager.cpp | 4 ++-- 19 files changed, 35 insertions(+), 28 deletions(-) diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index 654a594e2d..ada33efc9e 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit 654a594e2d6e8f8784b1f73b02ae96ff33be0848 +Subproject commit ada33efc9e65fc6db36d1f75d9782afdcac80cef diff --git a/ext/ghoul b/ext/ghoul index c50518fb79..fb549390c1 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit c50518fb79edd741b41130f04143605232579495 +Subproject commit fb549390c101cfcaac34f490185854faeb18911d diff --git a/modules/base/rendering/renderablenodeline.cpp b/modules/base/rendering/renderablenodeline.cpp index 11a50606fd..a4b922c3f4 100644 --- a/modules/base/rendering/renderablenodeline.cpp +++ b/modules/base/rendering/renderablenodeline.cpp @@ -186,7 +186,7 @@ RenderableNodeLine::RenderableNodeLine(const ghoul::Dictionary& dictionary) "Trying to use relative offsets for start node '{}' that has no " "bounding sphere. This will result in no offset. Use direct " "values by setting UseRelativeOffsets to false", - parent()->identifier(), _start + parent()->identifier(), _start.value() )); } }); @@ -204,7 +204,7 @@ RenderableNodeLine::RenderableNodeLine(const ghoul::Dictionary& dictionary) "Trying to use relative offsets for end node '{}' that has no " "bounding sphere. This will result in no offset. Use direct " "values by setting UseRelativeOffsets to false", - parent()->identifier(), _end + parent()->identifier(), _end.value() )); } }); diff --git a/modules/base/rendering/renderableplaneimageonline.cpp b/modules/base/rendering/renderableplaneimageonline.cpp index 65c9f4ffb1..a7d876237d 100644 --- a/modules/base/rendering/renderableplaneimageonline.cpp +++ b/modules/base/rendering/renderableplaneimageonline.cpp @@ -134,7 +134,7 @@ void RenderablePlaneImageOnline::update(const UpdateData& data) { if (imageFile.corrupted) { LERRORC( "ScreenSpaceImageOnline", - fmt::format("Error loading image from URL '{}'", _texturePath) + fmt::format("Error loading image from URL '{}'", _texturePath.value()) ); return; } diff --git a/modules/base/rendering/renderableplanetimevaryingimage.cpp b/modules/base/rendering/renderableplanetimevaryingimage.cpp index 27c93f371a..b7d498ed47 100644 --- a/modules/base/rendering/renderableplanetimevaryingimage.cpp +++ b/modules/base/rendering/renderableplanetimevaryingimage.cpp @@ -98,7 +98,7 @@ RenderablePlaneTimeVaryingImage::RenderablePlaneTimeVaryingImage( if (!std::filesystem::is_directory(absPath(_sourceFolder))) { LERROR(fmt::format( "Time varying image, {} is not a valid directory", - _sourceFolder + _sourceFolder.value() )); } @@ -176,7 +176,7 @@ bool RenderablePlaneTimeVaryingImage::extractMandatoryInfoFromDictionary() { if (_sourceFiles.empty()) { LERROR(fmt::format( "{}: Plane sequence filepath {} was empty", - _identifier, _sourceFolder + _identifier, _sourceFolder.value() )); return false; } diff --git a/modules/base/rendering/renderablesphereimageonline.cpp b/modules/base/rendering/renderablesphereimageonline.cpp index d21e9d4bea..036fc52bcd 100644 --- a/modules/base/rendering/renderablesphereimageonline.cpp +++ b/modules/base/rendering/renderablesphereimageonline.cpp @@ -98,7 +98,7 @@ void RenderableSphereImageOnline::update(const UpdateData& data) { if (imageFile.corrupted) { LERRORC( "RenderableSphereImageOnline", - fmt::format("Error loading image from URL '{}'", _textureUrl) + fmt::format("Error loading image from URL '{}'", _textureUrl.value()) ); return; } diff --git a/modules/base/rendering/screenspaceimagelocal.cpp b/modules/base/rendering/screenspaceimagelocal.cpp index d84cf9b011..2115750690 100644 --- a/modules/base/rendering/screenspaceimagelocal.cpp +++ b/modules/base/rendering/screenspaceimagelocal.cpp @@ -85,7 +85,9 @@ ScreenSpaceImageLocal::ScreenSpaceImageLocal(const ghoul::Dictionary& dictionary if (!std::filesystem::is_regular_file(absPath(_texturePath))) { LWARNINGC( "ScreenSpaceImageLocal", - fmt::format("Image {} did not exist for {}", _texturePath, _identifier) + fmt::format( + "Image {} did not exist for {}", _texturePath.value(), _identifier + ) ); } else { diff --git a/modules/base/rendering/screenspaceimageonline.cpp b/modules/base/rendering/screenspaceimageonline.cpp index 71160a3eb2..e39b422288 100644 --- a/modules/base/rendering/screenspaceimageonline.cpp +++ b/modules/base/rendering/screenspaceimageonline.cpp @@ -110,7 +110,7 @@ void ScreenSpaceImageOnline::update() { if (imageFile.corrupted) { LERRORC( "ScreenSpaceImageOnline", - fmt::format("Error loading image from URL '{}'", _texturePath) + fmt::format("Error loading image from URL '{}'", _texturePath.value()) ); return; } diff --git a/modules/cefwebgui/cefwebguimodule.cpp b/modules/cefwebgui/cefwebguimodule.cpp index 193a12a242..e9c81bd121 100644 --- a/modules/cefwebgui/cefwebguimodule.cpp +++ b/modules/cefwebgui/cefwebguimodule.cpp @@ -102,7 +102,7 @@ void CefWebGuiModule::startOrStopGui() { const bool isMaster = global::windowDelegate->isMaster(); if (_enabled && isMaster) { - LDEBUGC("WebBrowser", fmt::format("Loading GUI from {}", _url)); + LDEBUGC("WebBrowser", fmt::format("Loading GUI from {}", _url.value())); if (!_instance) { _instance = std::make_unique( diff --git a/modules/gaia/rendering/renderablegaiastars.cpp b/modules/gaia/rendering/renderablegaiastars.cpp index 2b83ce82c0..cd2d5baded 100644 --- a/modules/gaia/rendering/renderablegaiastars.cpp +++ b/modules/gaia/rendering/renderablegaiastars.cpp @@ -511,7 +511,7 @@ RenderableGaiaStars::RenderableGaiaStars(const ghoul::Dictionary& dictionary) _dataIsDirty = true; } else { - LWARNING(fmt::format("File not found: {}", _filePath)); + LWARNING(fmt::format("File not found: {}", _filePath.value())); } }); addProperty(_filePath); diff --git a/modules/globebrowsing/src/geojson/geojsoncomponent.cpp b/modules/globebrowsing/src/geojson/geojsoncomponent.cpp index 1d876df11b..e87bf58e67 100644 --- a/modules/globebrowsing/src/geojson/geojsoncomponent.cpp +++ b/modules/globebrowsing/src/geojson/geojsoncomponent.cpp @@ -369,7 +369,7 @@ GeoJsonComponent::GeoJsonComponent(const ghoul::Dictionary& dictionary, else { LERROR(fmt::format( "Provided texture file does not exist: '{}'", - _defaultProperties.pointTexture + _defaultProperties.pointTexture.value() )); } }); @@ -593,7 +593,7 @@ void GeoJsonComponent::readFile() { std::ifstream file(_geoJsonFile); if (!file.good()) { - LERROR(fmt::format("Failed to open GeoJSON file: {}", _geoJsonFile)); + LERROR(fmt::format("Failed to open GeoJSON file: {}", _geoJsonFile.value())); return; } @@ -628,7 +628,7 @@ void GeoJsonComponent::readFile() { catch (const geos::util::GEOSException& e) { LERROR(fmt::format( "Error creating GeoJson layer with identifier '{}'. Problem reading " - "GeoJson file '{}'. Error: '{}'", identifier(), _geoJsonFile, e.what() + "GeoJson file '{}'. Error: '{}'", identifier(), _geoJsonFile.value(), e.what() )); } @@ -649,7 +649,7 @@ void GeoJsonComponent::parseSingleFeature(const geos::io::GeoJSONFeature& featur // Null geometry => no geometries to add LWARNING(fmt::format( "Feature {} in GeoJson file '{}' is a null geometry and will not be loaded", - indexInFile, _geoJsonFile + indexInFile, _geoJsonFile.value() )); // @TODO (emmbr26) We should eventually support features with null geometry } @@ -702,7 +702,7 @@ void GeoJsonComponent::parseSingleFeature(const geos::io::GeoJSONFeature& featur LERROR(fmt::format( "Error creating GeoJson layer with identifier '{}'. Problem reading " "feature {} in GeoJson file '{}'.", - identifier(), indexInFile, _geoJsonFile + identifier(), indexInFile, _geoJsonFile.value() )); LERRORC(error.component, error.message); // Do nothing diff --git a/modules/kameleonvolume/rendering/renderablekameleonvolume.cpp b/modules/kameleonvolume/rendering/renderablekameleonvolume.cpp index a4a45dd2f4..7a77315239 100644 --- a/modules/kameleonvolume/rendering/renderablekameleonvolume.cpp +++ b/modules/kameleonvolume/rendering/renderablekameleonvolume.cpp @@ -361,7 +361,7 @@ void RenderableKameleonVolume::load() { std::string RenderableKameleonVolume::cacheSuffix() const { glm::uvec3 dims = _dimensions; - return fmt::format(".{}.{}x{}x{}", _variable, dims[0], dims[1], dims[2]); + return fmt::format(".{}.{}x{}x{}", _variable.value(), dims[0], dims[1], dims[2]); } void RenderableKameleonVolume::loadFromPath(const std::string& path) { diff --git a/modules/space/horizonsfile.cpp b/modules/space/horizonsfile.cpp index 6e4bb00c0f..83ceae3953 100644 --- a/modules/space/horizonsfile.cpp +++ b/modules/space/horizonsfile.cpp @@ -163,7 +163,9 @@ HorizonsResultCode isValidHorizonsAnswer(const json& answer) { if (auto signature = answer.find("signature"); signature != answer.end()) { if (auto source = signature->find("source"); source != signature->end()) { if (*source != static_cast(ApiSource)) { - LWARNING(fmt::format("Horizons answer from unkown source '{}'", *source)); + LWARNING(fmt::format( + "Horizons answer from unknown source '{}'", source->dump() + )); } } else { @@ -178,7 +180,7 @@ HorizonsResultCode isValidHorizonsAnswer(const json& answer) { if (v != CurrentMajorVersion) { LWARNING(fmt::format( "Unknown Horizons major version '{}' found. The currently supported " - "major version is {}", *version, CurrentMajorVersion + "major version is {}", version->dump(), CurrentMajorVersion )); } } diff --git a/modules/space/rendering/renderableorbitalkepler.cpp b/modules/space/rendering/renderableorbitalkepler.cpp index 722801c5eb..0b5174457c 100644 --- a/modules/space/rendering/renderableorbitalkepler.cpp +++ b/modules/space/rendering/renderableorbitalkepler.cpp @@ -313,7 +313,7 @@ void RenderableOrbitalKepler::updateBuffers() { if (_startRenderIdx >= _numObjects) { throw ghoul::RuntimeError(fmt::format( - "Start index {} out of range [0, {}]", _startRenderIdx, _numObjects + "Start index {} out of range [0, {}]", _startRenderIdx.value(), _numObjects )); } diff --git a/modules/space/rendering/renderablestars.cpp b/modules/space/rendering/renderablestars.cpp index 87d8ca7d6b..9309473b57 100644 --- a/modules/space/rendering/renderablestars.cpp +++ b/modules/space/rendering/renderablestars.cpp @@ -662,7 +662,7 @@ RenderableStars::RenderableStars(const ghoul::Dictionary& dictionary) _colorTextureIsDirty = true; } else { - LWARNING(fmt::format("File not found: {}", _colorTexturePath)); + LWARNING(fmt::format("File not found: {}", _colorTexturePath.value())); } }); _colorTextureFile->setCallback([this]() { _colorTextureIsDirty = true; }); @@ -682,7 +682,7 @@ RenderableStars::RenderableStars(const ghoul::Dictionary& dictionary) _otherDataColorMapIsDirty = true; } else { - LWARNING(fmt::format("File not found: {}", _otherDataColorMapPath)); + LWARNING(fmt::format("File not found: {}", _otherDataColorMapPath.value())); } }); diff --git a/modules/video/src/videoplayer.cpp b/modules/video/src/videoplayer.cpp index 3b69a3f744..ca44dc492c 100644 --- a/modules/video/src/videoplayer.cpp +++ b/modules/video/src/videoplayer.cpp @@ -564,7 +564,8 @@ void VideoPlayer::handleMpvEvents() { } if (!checkMpvError(event->error)) { LWARNING(fmt::format( - "Error at mpv event : {} {}", event->event_id, event->reply_userdata + "Error at mpv event: {} {}", + static_cast(event->event_id), event->reply_userdata )); break; } diff --git a/modules/vislab/rendering/renderabledistancelabel.cpp b/modules/vislab/rendering/renderabledistancelabel.cpp index 80c2fa3aac..76a04775b4 100644 --- a/modules/vislab/rendering/renderabledistancelabel.cpp +++ b/modules/vislab/rendering/renderabledistancelabel.cpp @@ -155,7 +155,9 @@ void RenderableDistanceLabel::update(const UpdateData&) { } } else { - LERROR(fmt::format("There is no scenegraph node with id {}", _nodelineId)); + LERROR(fmt::format( + "There is no scenegraph node with id {}", _nodelineId.value() + )); _errorThrown = true; } } diff --git a/src/navigation/pathnavigator.cpp b/src/navigation/pathnavigator.cpp index 838df0eebb..a937ec4af5 100644 --- a/src/navigation/pathnavigator.cpp +++ b/src/navigation/pathnavigator.cpp @@ -414,7 +414,7 @@ double PathNavigator::findValidBoundingSphere(const SceneGraphNode* node) const LDEBUG(fmt::format( "The scene graph node '{}' has no, or a very small, bounding sphere. Using " "minimal value of {}. This might lead to unexpected results", - node->identifier(), _minValidBoundingSphere + node->identifier(), _minValidBoundingSphere.value() )); result = _minValidBoundingSphere; } diff --git a/src/scene/assetmanager.cpp b/src/scene/assetmanager.cpp index 4181214ee7..f29e23fb14 100644 --- a/src/scene/assetmanager.cpp +++ b/src/scene/assetmanager.cpp @@ -826,8 +826,8 @@ Asset* AssetManager::retrieveAsset(const std::filesystem::path& path, "Loading asset {0} from {1} with enable state {3} different from " "initial loading from {2} with state {4}. Only {4} will have an " "effect", - path, retriever, a->firstParent()->path(), explicitEnable, - a->explicitEnabled() + path, retriever, a->firstParent()->path(), + explicitEnable.value_or(true), a->explicitEnabled().value_or(true) )); } else { From 8c0c90dcf84697817240e489e185018c74838ac7 Mon Sep 17 00:00:00 2001 From: Malin E Date: Wed, 13 Sep 2023 14:04:49 +0200 Subject: [PATCH 134/701] Update touchbar remote scripting, fixes #2884 --- src/interaction/touchbar.mm | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/interaction/touchbar.mm b/src/interaction/touchbar.mm index 6f8bbbf1c4..fe59e2ed5d 100644 --- a/src/interaction/touchbar.mm +++ b/src/interaction/touchbar.mm @@ -172,9 +172,12 @@ NSArray* focusIdentifiers; } - (void)pauseResumeButtonAction:(id)sender { + // No sync or send because time settings are always synced and sent + // to the connected nodes and peers global::scriptEngine->queueScript( "openspace.time.togglePause();", - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); NSButton* button = static_cast(sender); @@ -197,7 +200,8 @@ NSArray* focusIdentifiers; ); global::scriptEngine->queueScript( str, - scripting::ScriptEngine::RemoteScripting::Yes + scripting::ScriptEngine::ShouldBeSynchronized::Yes, + scripting::ScriptEngine::ShouldSendToRemote::Yes ); } @@ -211,7 +215,8 @@ NSArray* focusIdentifiers; openspace.setPropertyValueSingle('RenderEngine.ShowLog', not isEnabled);\ openspace.setPropertyValueSingle('RenderEngine.ShowVersion', not isEnabled);\ openspace.setPropertyValueSingle('RenderEngine.ShowCamera', not isEnabled)", - scripting::ScriptEngine::RemoteScripting::No + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } @@ -220,8 +225,9 @@ NSArray* focusIdentifiers; (void)sender; global::scriptEngine->queueScript( "local isEnabled = openspace.propertyValue('Modules.CefWebGui.Visible');\ - openspace.setPropertyValueSingle('Modules.CefWebGui.Visible', not isEnabled);", - scripting::ScriptEngine::RemoteScripting::No + openspace.setPropertyValueSingle('Modules.CefWebGui.Visible', not isEnabled);", + scripting::ScriptEngine::ShouldBeSynchronized::No, + scripting::ScriptEngine::ShouldSendToRemote::No ); } @end From 4aac713185d4f9005fe7480014c1cd02786ec57c Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Fri, 15 Sep 2023 20:45:25 +0200 Subject: [PATCH 135/701] Make the eclipse profile start at 'yesterday' --- data/profiles/eclipse.profile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/profiles/eclipse.profile b/data/profiles/eclipse.profile index 2e3193ea3e..4efef08434 100644 --- a/data/profiles/eclipse.profile +++ b/data/profiles/eclipse.profile @@ -64,8 +64,8 @@ } ], "time": { - "type": "absolute", - "value": "2023 Oct 14 18:00:41" + "type": "relative", + "value": "-1d" }, "version": { "major": 1, From 36ee6840b55485ba9fa1cea5652ef1b9bc861cde Mon Sep 17 00:00:00 2001 From: Garrett Summerfield Date: Thu, 21 Sep 2023 06:01:43 -0500 Subject: [PATCH 136/701] Bump CCfits to 2.6 (fixes #2891) Updated CCfits submodule. --- modules/fitsfilereader/ext/CCfits | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/fitsfilereader/ext/CCfits b/modules/fitsfilereader/ext/CCfits index 3c16ca3f1e..15e78f599d 160000 --- a/modules/fitsfilereader/ext/CCfits +++ b/modules/fitsfilereader/ext/CCfits @@ -1 +1 @@ -Subproject commit 3c16ca3f1e9a405be7fdbd0db363151eca96629f +Subproject commit 15e78f599dcf619a573cc011e32b2635be9bf3dc From ce789fcd2270d0623ab41b19f1371c50155187f9 Mon Sep 17 00:00:00 2001 From: Malin E Date: Thu, 21 Sep 2023 14:22:36 +0200 Subject: [PATCH 137/701] Feature/matrix maintenance (#2875) * Split RenderableSphere class into a local and an online sphere * Make the video sphere derive from the regular sphere * Make RenderableTimeVaryingSphere derive from RenderableSphere * Some clean up * Add general functions for renderable matrix calculations * Make RenderableSphere and Plane use them * Fix an issue with the RenderablePlane shader * Make one function that returns all three types of render matrices * Make more Renderables use the general matric calculation function * Make more Renderable use the general matrix function * Simplify alternative transforms for matrix calculations * Small clean-up * Update RenderableModel (again) to use new transform functions * Make calc all matrix function to return tuple * Update some more places --- include/openspace/rendering/renderable.h | 66 ++++++++++++++++++- .../rendering/grids/renderableboxgrid.cpp | 15 ++--- .../base/rendering/grids/renderablegrid.cpp | 9 +-- .../rendering/grids/renderableradialgrid.cpp | 16 ++--- .../grids/renderablesphericalgrid.cpp | 16 ++--- .../rendering/renderablecartesianaxes.cpp | 8 +-- modules/base/rendering/renderabledisc.cpp | 10 +-- modules/base/rendering/renderablelabel.cpp | 8 +-- modules/base/rendering/renderablemodel.cpp | 12 ++-- modules/base/rendering/renderablenodeline.cpp | 10 +-- modules/base/rendering/renderableplane.cpp | 36 +++++----- modules/base/rendering/renderableplane.h | 6 +- modules/base/rendering/renderableprism.cpp | 15 ++--- modules/base/rendering/renderablesphere.cpp | 17 ++--- modules/base/rendering/renderabletrail.cpp | 8 +-- modules/base/shaders/plane_fs.glsl | 13 ++-- modules/base/shaders/plane_vs.glsl | 4 +- .../rendering/renderablebillboardscloud.cpp | 12 +--- .../rendering/renderableplanescloud.cpp | 30 ++++----- .../rendering/renderableplanescloud.h | 4 +- .../rendering/renderablepoints.cpp | 3 +- .../rendering/renderableorbitdisc.cpp | 9 +-- .../gaia/rendering/renderablegaiastars.cpp | 6 +- modules/galaxy/rendering/renderablegalaxy.cpp | 30 ++++----- .../skybrowser/src/renderableskytarget.cpp | 16 ++--- .../renderableconstellationbounds.cpp | 6 +- .../renderableconstellationlines.cpp | 11 +--- .../renderableconstellationsbase.cpp | 15 ++--- .../space/rendering/renderableeclipsecone.cpp | 9 +-- .../space/rendering/renderablefluxnodes.cpp | 19 +++--- .../rendering/renderablehabitablezone.cpp | 9 +-- .../rendering/renderableorbitalkepler.cpp | 10 +-- modules/space/rendering/renderablerings.cpp | 9 +-- modules/space/rendering/renderablestars.cpp | 5 +- .../space/rendering/renderabletravelspeed.cpp | 13 ++-- .../rendering/renderablecrawlingline.cpp | 8 +-- .../rendering/renderablefov.cpp | 8 +-- .../rendering/renderablemodelprojection.cpp | 10 ++- .../rendering/renderableplaneprojection.cpp | 10 ++- .../rendering/renderableplanetprojection.cpp | 11 +--- .../rendering/renderableshadowcylinder.cpp | 8 +-- src/rendering/renderable.cpp | 47 +++++++++++++ 42 files changed, 270 insertions(+), 317 deletions(-) diff --git a/include/openspace/rendering/renderable.h b/include/openspace/rendering/renderable.h index 38f94f62a3..71bd6f3c2e 100644 --- a/include/openspace/rendering/renderable.h +++ b/include/openspace/rendering/renderable.h @@ -141,8 +141,72 @@ protected: // An optional renderbin that renderables can use for certain components, in cases // where all parts of the renderable should not be rendered in the same bin std::optional _secondaryRenderBin; -private: + struct AlternativeTransform { + std::optional translation = std::nullopt; + std::optional rotation = std::nullopt; + std::optional scale = std::nullopt; + }; + + /** + * Calculates the model transformation matrix with the given data and returns it + * + * \param data the RenderData for the object that the model transformation matrix + * should be calculated for + * \param altTransform an object containing alternative transformations to use instead + * of those given in data. The transforms can be translation, rotation and + * scale. + * + * \return the resulting model transformation matrix in double precision + */ + glm::dmat4 calcModelTransform(const RenderData& data, + const AlternativeTransform& altTransform = {}) const; + + /** + * Calculates the model view transformation matrix with the given data and returns it + * + * \param data the RenderData for the object that the model view transformation matrix + * should be calculated for + * \param modelTransform an alternative model transformation matrix to use. If not + * provided the function will calculate a new one. + * + * \return the resulting model view transformation matrix in double precision + */ + glm::dmat4 calcModelViewTransform(const RenderData& data, + std::optional modelTransform = std::nullopt) const; + + /** + * Calculates the model view projection transformation matrix with the given data and + * returns it + * + * \param data the RenderData for the object that the model view projection + * transformation matrix should be calculated for + * \param modelTransform an alternative model transformation matrix to use. If not + * provided the function will calculate a new one. + * + * \return the resulting model view projection transformation matrix in double + * precision + */ + glm::dmat4 calcModelViewProjectionTransform(const RenderData& data, + std::optional modelTransform = std::nullopt) const; + + /** + * Calculates the model, model view, and the model view projection transformation + * matricies with the given data and returns them in a tuple object + * + * \param data the RenderData for the object that the transforms should be + * calculated for + * \param altModelTransform an object containing alternative transformations to use + * instead of those given in data. The transforms can be translation, rotation + * and scale. + * + * \return a tuple object containing the resulting model, model view, and the + * model view projection transformation matrices + */ + std::tuple calcAllTransforms( + const RenderData& data, const AlternativeTransform& altModelTransform = {}) const; + +private: double _boundingSphere = 0.0; double _interactionSphere = 0.0; SceneGraphNode* _parent = nullptr; diff --git a/modules/base/rendering/grids/renderableboxgrid.cpp b/modules/base/rendering/grids/renderableboxgrid.cpp index 2a54b6d064..7af3822024 100644 --- a/modules/base/rendering/grids/renderableboxgrid.cpp +++ b/modules/base/rendering/grids/renderableboxgrid.cpp @@ -168,18 +168,11 @@ void RenderableBoxGrid::deinitializeGL() { void RenderableBoxGrid::render(const RenderData& data, RendererTasks&){ _gridProgram->activate(); - glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * // Translation - glm::dmat4(data.modelTransform.rotation) * // Spice rotation - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * modelTransform; - const glm::dmat4 projectionMatrix = data.camera.projectionMatrix(); - - const glm::dmat4 modelViewProjectionMatrix = projectionMatrix * modelViewTransform; + auto [modelTransform, modelViewTransform, modelViewProjectionTransform] = + calcAllTransforms(data); _gridProgram->setUniform("modelViewTransform", modelViewTransform); - _gridProgram->setUniform("MVPTransform", modelViewProjectionMatrix); + _gridProgram->setUniform("MVPTransform", modelViewProjectionTransform); _gridProgram->setUniform("opacity", opacity()); _gridProgram->setUniform("gridColor", _color); @@ -227,7 +220,7 @@ void RenderableBoxGrid::render(const RenderData& data, RendererTasks&){ const glm::vec3 orthoUp = glm::normalize( glm::vec3(worldToModelTransform * glm::dvec4(up, 0.0)) ); - _labels->render(data, modelViewProjectionMatrix, orthoRight, orthoUp); + _labels->render(data, modelViewProjectionTransform, orthoRight, orthoUp); } } diff --git a/modules/base/rendering/grids/renderablegrid.cpp b/modules/base/rendering/grids/renderablegrid.cpp index a855a2b441..ceddd1bd0f 100644 --- a/modules/base/rendering/grids/renderablegrid.cpp +++ b/modules/base/rendering/grids/renderablegrid.cpp @@ -245,12 +245,9 @@ void RenderableGrid::deinitializeGL() { void RenderableGrid::render(const RenderData& data, RendererTasks&){ _gridProgram->activate(); - const glm::dmat4 modelMatrix = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * // Translation - glm::dmat4(data.modelTransform.rotation) * // Spice rotation - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); + const glm::dmat4 modelTransform = calcModelTransform(data); + const glm::dmat4 modelViewTransform = calcModelViewTransform(data, modelTransform); - const glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * modelMatrix; const glm::dmat4 projectionMatrix = data.camera.projectionMatrix(); const glm::dmat4 modelViewProjectionMatrix = projectionMatrix * modelViewTransform; @@ -260,7 +257,7 @@ void RenderableGrid::render(const RenderData& data, RendererTasks&){ glm::vec3 right = glm::cross(viewDirection, lookup); const glm::vec3 up = glm::cross(right, viewDirection); - const glm::dmat4 worldToModelTransform = glm::inverse(modelMatrix); + const glm::mat4 worldToModelTransform = glm::inverse(modelTransform); glm::vec3 orthoRight = glm::normalize( glm::vec3(worldToModelTransform * glm::vec4(right, 0.0)) ); diff --git a/modules/base/rendering/grids/renderableradialgrid.cpp b/modules/base/rendering/grids/renderableradialgrid.cpp index fa1f2c4d5e..4f528fd15b 100644 --- a/modules/base/rendering/grids/renderableradialgrid.cpp +++ b/modules/base/rendering/grids/renderableradialgrid.cpp @@ -199,19 +199,11 @@ void RenderableRadialGrid::deinitializeGL() { void RenderableRadialGrid::render(const RenderData& data, RendererTasks&) { _gridProgram->activate(); - const glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * // Translation - glm::dmat4(data.modelTransform.rotation) * // Spice rotation - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - const glm::dmat4 modelViewTransform = - data.camera.combinedViewMatrix() * modelTransform; - const glm::dmat4 projectionMatrix = data.camera.projectionMatrix(); - - const glm::dmat4 modelViewProjectionMatrix = projectionMatrix * modelViewTransform; + auto [modelTransform, modelViewTransform, modelViewProjectionTransform] = + calcAllTransforms(data); _gridProgram->setUniform("modelViewTransform", modelViewTransform); - _gridProgram->setUniform("MVPTransform", modelViewProjectionMatrix); + _gridProgram->setUniform("MVPTransform", modelViewProjectionTransform); _gridProgram->setUniform("opacity", opacity()); _gridProgram->setUniform("gridColor", _color); @@ -261,7 +253,7 @@ void RenderableRadialGrid::render(const RenderData& data, RendererTasks&) { const glm::vec3 orthoUp = glm::normalize( glm::vec3(worldToModelTransform * glm::dvec4(up, 0.0)) ); - _labels->render(data, modelViewProjectionMatrix, orthoRight, orthoUp); + _labels->render(data, modelViewProjectionTransform, orthoRight, orthoUp); } } diff --git a/modules/base/rendering/grids/renderablesphericalgrid.cpp b/modules/base/rendering/grids/renderablesphericalgrid.cpp index bc261d6078..b196d5d460 100644 --- a/modules/base/rendering/grids/renderablesphericalgrid.cpp +++ b/modules/base/rendering/grids/renderablesphericalgrid.cpp @@ -185,19 +185,11 @@ void RenderableSphericalGrid::deinitializeGL() { void RenderableSphericalGrid::render(const RenderData& data, RendererTasks&){ _gridProgram->activate(); - const glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * // Translation - glm::dmat4(data.modelTransform.rotation) * // Spice rotation - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - const glm::dmat4 modelViewTransform = - data.camera.combinedViewMatrix() * modelTransform; - const glm::dmat4 projectionMatrix = data.camera.projectionMatrix(); - - const glm::dmat4 modelViewProjectionMatrix = projectionMatrix * modelViewTransform; + auto [modelTransform, modelViewTransform, modelViewProjectionTransform] = + calcAllTransforms(data); _gridProgram->setUniform("modelViewTransform", modelViewTransform); - _gridProgram->setUniform("MVPTransform", modelViewProjectionMatrix); + _gridProgram->setUniform("MVPTransform", modelViewProjectionTransform); _gridProgram->setUniform("opacity", opacity()); _gridProgram->setUniform("gridColor", _color); @@ -246,7 +238,7 @@ void RenderableSphericalGrid::render(const RenderData& data, RendererTasks&){ const glm::vec3 orthoUp = glm::normalize( glm::vec3(worldToModelTransform * glm::dvec4(up, 0.0)) ); - _labels->render(data, modelViewProjectionMatrix, orthoRight, orthoUp); + _labels->render(data, modelViewProjectionTransform, orthoRight, orthoUp); } } diff --git a/modules/base/rendering/renderablecartesianaxes.cpp b/modules/base/rendering/renderablecartesianaxes.cpp index e93e18d107..841a6b032e 100644 --- a/modules/base/rendering/renderablecartesianaxes.cpp +++ b/modules/base/rendering/renderablecartesianaxes.cpp @@ -181,13 +181,7 @@ void RenderableCartesianAxes::deinitializeGL() { void RenderableCartesianAxes::render(const RenderData& data, RendererTasks&){ _program->activate(); - const glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - const glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * - modelTransform; + const glm::dmat4 modelViewTransform = calcModelViewTransform(data); _program->setUniform("modelViewTransform", glm::mat4(modelViewTransform)); _program->setUniform("projectionTransform", data.camera.projectionMatrix()); diff --git a/modules/base/rendering/renderabledisc.cpp b/modules/base/rendering/renderabledisc.cpp index f09ae1dbfd..2cb9431ab8 100644 --- a/modules/base/rendering/renderabledisc.cpp +++ b/modules/base/rendering/renderabledisc.cpp @@ -148,16 +148,12 @@ void RenderableDisc::deinitializeGL() { void RenderableDisc::render(const RenderData& data, RendererTasks&) { _shader->activate(); - glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * modelTransform; + const glm::dmat4 modelViewProjectionTransform = + calcModelViewProjectionTransform(data); _shader->setUniform( _uniformCache.modelViewProjection, - data.camera.projectionMatrix() * glm::mat4(modelViewTransform) + glm::mat4(modelViewProjectionTransform) ); _shader->setUniform(_uniformCache.width, _width); _shader->setUniform(_uniformCache.opacity, opacity()); diff --git a/modules/base/rendering/renderablelabel.cpp b/modules/base/rendering/renderablelabel.cpp index f11f5bd89f..54e1bbba80 100644 --- a/modules/base/rendering/renderablelabel.cpp +++ b/modules/base/rendering/renderablelabel.cpp @@ -412,10 +412,8 @@ void RenderableLabel::render(const RenderData& data, RendererTasks&) { } glm::dmat4 modelMatrix(1.0); - glm::dmat4 modelViewMatrix = data.camera.combinedViewMatrix() * modelMatrix; - glm::dmat4 projectionMatrix = glm::dmat4(data.camera.projectionMatrix()); - - glm::dmat4 modelViewProjectionMatrix = projectionMatrix * modelViewMatrix; + const glm::dmat4 modelViewProjectionTransform = + calcModelViewProjectionTransform(data, modelMatrix); glm::dvec3 cameraViewDirectionWorld = -data.camera.viewDirectionWorldSpace(); glm::dvec3 cameraUpDirectionWorld = data.camera.lookUpVectorWorldSpace(); @@ -432,7 +430,7 @@ void RenderableLabel::render(const RenderData& data, RendererTasks&) { } glm::dvec3 orthoUp = glm::normalize(glm::cross(cameraViewDirectionWorld, orthoRight)); - renderLabels(data, modelViewProjectionMatrix, orthoRight, orthoUp, fadeInVariable); + renderLabels(data, modelViewProjectionTransform, orthoRight, orthoUp, fadeInVariable); global::renderEngine->openglStateCache().resetBlendState(); global::renderEngine->openglStateCache().resetDepthState(); diff --git a/modules/base/rendering/renderablemodel.cpp b/modules/base/rendering/renderablemodel.cpp index 5b7f5db8aa..e9d9d0d1a9 100644 --- a/modules/base/rendering/renderablemodel.cpp +++ b/modules/base/rendering/renderablemodel.cpp @@ -790,14 +790,10 @@ void RenderableModel::render(const RenderData& data, RendererTasks&) { _program->activate(); // Model transform and view transform needs to be in double precision - const glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), glm::dvec3(_pivot.value())) * - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)) * - glm::scale(_modelTransform.value(), glm::dvec3(_modelScale)); - const glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * - modelTransform; + glm::dmat4 modelTransform = calcModelTransform(data); + modelTransform = glm::translate(modelTransform, glm::dvec3(_pivot.value())); + modelTransform *= glm::scale(_modelTransform.value(), glm::dvec3(_modelScale)); + const glm::dmat4 modelViewTransform = calcModelViewTransform(data, modelTransform); int nLightSources = 0; _lightIntensitiesBuffer.resize(_lightSources.size()); diff --git a/modules/base/rendering/renderablenodeline.cpp b/modules/base/rendering/renderablenodeline.cpp index a4b922c3f4..b15644c5fa 100644 --- a/modules/base/rendering/renderablenodeline.cpp +++ b/modules/base/rendering/renderablenodeline.cpp @@ -386,13 +386,9 @@ void RenderableNodeLine::render(const RenderData& data, RendererTasks&) { ); } - const glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - const glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * - modelTransform * anchorTranslation; + const glm::dmat4 modelTransform = calcModelTransform(data); + const glm::dmat4 modelViewTransform = + calcModelViewTransform(data, modelTransform) * anchorTranslation; _program->setUniform("modelViewTransform", glm::mat4(modelViewTransform)); _program->setUniform("projectionTransform", data.camera.projectionMatrix()); diff --git a/modules/base/rendering/renderableplane.cpp b/modules/base/rendering/renderableplane.cpp index 31de178d52..37e688e08f 100644 --- a/modules/base/rendering/renderableplane.cpp +++ b/modules/base/rendering/renderableplane.cpp @@ -29,14 +29,11 @@ #include #include #include -#include #include #include -#include #include #include #include -#include #include #include #include @@ -44,6 +41,11 @@ #include namespace { + constexpr std::array UniformNames = { + "modelViewProjection", "modelViewTransform", "colorTexture", "opacity", + "mirrorBackside", "multiplyColor" + }; + enum BlendMode { Normal = 0, Additive @@ -213,6 +215,8 @@ void RenderablePlane::initializeGL() { ); } ); + + ghoul::opengl::updateUniformLocations(*_shader, _uniformCache, UniformNames); } void RenderablePlane::deinitializeGL() { @@ -237,9 +241,9 @@ void RenderablePlane::render(const RenderData& data, RendererTasks&) { ZoneScoped; _shader->activate(); - _shader->setUniform("opacity", opacity()); + _shader->setUniform(_uniformCache.opacity, opacity()); - _shader->setUniform("mirrorBackside", _mirrorBackside); + _shader->setUniform(_uniformCache.mirrorBackside, _mirrorBackside); glm::dvec3 objectPositionWorld = glm::dvec3( glm::translate( @@ -262,26 +266,23 @@ void RenderablePlane::render(const RenderData& data, RendererTasks&) { cameraOrientedRotation : glm::dmat4(data.modelTransform.rotation); - const glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - rotationTransform * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - const glm::dmat4 modelViewTransform = - data.camera.combinedViewMatrix() * modelTransform; + auto [modelTransform, modelViewTransform, modelViewProjectionTransform] = + calcAllTransforms(data, { .rotation = rotationTransform }); - _shader->setUniform("modelViewProjectionTransform", - data.camera.projectionMatrix() * glm::mat4(modelViewTransform)); - - _shader->setUniform("modelViewTransform", glm::mat4(modelViewTransform)); + _shader->setUniform( + _uniformCache.modelViewProjection, + glm::mat4(modelViewProjectionTransform) + ); + _shader->setUniform(_uniformCache.modelViewTransform, glm::mat4(modelViewTransform)); ghoul::opengl::TextureUnit unit; unit.activate(); bindTexture(); defer { unbindTexture(); }; - _shader->setUniform("texture1", unit); + _shader->setUniform(_uniformCache.colorTexture, unit); - _shader->setUniform("multiplyColor", _multiplyColor); + _shader->setUniform(_uniformCache.multiplyColor, _multiplyColor); bool additiveBlending = (_blendMode == static_cast(BlendMode::Additive)); if (additiveBlending) { @@ -311,6 +312,7 @@ void RenderablePlane::update(const UpdateData&) { if (_shader->isDirty()) { _shader->rebuildFromFile(); + ghoul::opengl::updateUniformLocations(*_shader, _uniformCache, UniformNames); } if (_planeIsDirty) { diff --git a/modules/base/rendering/renderableplane.h b/modules/base/rendering/renderableplane.h index feb6c53782..d6bc9f9b53 100644 --- a/modules/base/rendering/renderableplane.h +++ b/modules/base/rendering/renderableplane.h @@ -28,11 +28,10 @@ #include #include -#include -#include #include #include #include +#include namespace ghoul::filesystem { class File; } @@ -83,6 +82,9 @@ protected: private: bool _planeIsDirty = false; + + UniformCache(modelViewProjection, modelViewTransform, colorTexture, opacity, + mirrorBackside, multiplyColor) _uniformCache; }; } // namespace openspace diff --git a/modules/base/rendering/renderableprism.cpp b/modules/base/rendering/renderableprism.cpp index 04fe0a22ad..b7d3936e14 100644 --- a/modules/base/rendering/renderableprism.cpp +++ b/modules/base/rendering/renderableprism.cpp @@ -328,17 +328,14 @@ void RenderablePrism::render(const RenderData& data, RendererTasks&) { _shader->activate(); // Model transform and view transform needs to be in double precision - glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - glm::mat4 modelViewProjectionTransform = - data.camera.projectionMatrix() * - glm::mat4(data.camera.combinedViewMatrix() * modelTransform); + const glm::dmat4 modelViewProjectionTransform = + calcModelViewProjectionTransform(data); // Uniforms - _shader->setUniform(_uniformCache.modelViewProjection, modelViewProjectionTransform); + _shader->setUniform( + _uniformCache.modelViewProjection, + glm::mat4(modelViewProjectionTransform) + ); _shader->setUniform(_uniformCache.color, glm::vec4(_lineColor.value(), opacity())); // Render diff --git a/modules/base/rendering/renderablesphere.cpp b/modules/base/rendering/renderablesphere.cpp index c734654687..2cd9f54ff2 100644 --- a/modules/base/rendering/renderablesphere.cpp +++ b/modules/base/rendering/renderablesphere.cpp @@ -235,26 +235,17 @@ void RenderableSphere::deinitializeGL() { void RenderableSphere::render(const RenderData& data, RendererTasks&) { Orientation orientation = static_cast(_orientation.value()); - glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - glm::dmat3 modelRotation = - glm::dmat3(data.modelTransform.rotation); - // Activate shader using IgnoreError = ghoul::opengl::ProgramObject::IgnoreError; _shader->activate(); _shader->setIgnoreUniformLocationError(IgnoreError::Yes); - glm::mat4 modelViewProjection = data.camera.projectionMatrix() * - glm::mat4(data.camera.combinedViewMatrix() * modelTransform); - _shader->setUniform(_uniformCache.modelViewProjection, modelViewProjection); + auto [modelTransform, modelViewTransform, modelViewProjectionTransform] = + calcAllTransforms(data); + glm::dmat3 modelRotation = glm::dmat3(data.modelTransform.rotation); - const glm::dmat4 modelViewTransform = - data.camera.combinedViewMatrix() * modelTransform; _shader->setUniform(_uniformCache.modelViewTransform, glm::mat4(modelViewTransform)); + _shader->setUniform(_uniformCache.modelViewProjection, glm::mat4(modelViewProjectionTransform)); glm::mat3 modelViewRotation = glm::mat3( glm::dmat3(data.camera.viewRotationMatrix()) * modelRotation diff --git a/modules/base/rendering/renderabletrail.cpp b/modules/base/rendering/renderabletrail.cpp index 31477e4be6..1f0d9f26ba 100644 --- a/modules/base/rendering/renderabletrail.cpp +++ b/modules/base/rendering/renderabletrail.cpp @@ -291,9 +291,10 @@ void RenderableTrail::internalRender(bool renderLines, bool renderPoints, // We pass in the model view transformation matrix as double in order to maintain // high precision for vertices; especially for the trails, a high vertex precision // is necessary as they are usually far away from their reference + glm::dmat4 modelViewTransform = calcModelViewTransform(data, modelTransform); _programObject->setUniform( _uniformCache.modelView, - data.camera.combinedViewMatrix() * modelTransform * info._localTransform + modelViewTransform * info._localTransform ); const int sorting = [](RenderInformation::VertexSorting s) { @@ -391,10 +392,7 @@ void RenderableTrail::render(const RenderData& data, RendererTasks&) { _programObject->activate(); _programObject->setUniform(_uniformCache.opacity, opacity()); - glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); + glm::dmat4 modelTransform = calcModelTransform(data); _programObject->setUniform(_uniformCache.projection, data.camera.projectionMatrix()); diff --git a/modules/base/shaders/plane_fs.glsl b/modules/base/shaders/plane_fs.glsl index d3491cd260..11761fdb47 100644 --- a/modules/base/shaders/plane_fs.glsl +++ b/modules/base/shaders/plane_fs.glsl @@ -29,8 +29,7 @@ in vec3 vs_gNormal; in float vs_screenSpaceDepth; in vec2 vs_st; -uniform sampler2D texture1; -uniform bool additiveBlending; +uniform sampler2D colorTexture; uniform float opacity = 1.0; uniform bool mirrorBackside = true; uniform vec3 multiplyColor; @@ -39,14 +38,14 @@ uniform vec3 multiplyColor; Fragment getFragment() { Fragment frag; if (gl_FrontFacing) { - frag.color = texture(texture1, vs_st); + frag.color = texture(colorTexture, vs_st); } else { if (mirrorBackside) { - frag.color = texture(texture1, vec2(1.0 - vs_st.s, vs_st.t)); + frag.color = texture(colorTexture, vec2(1.0 - vs_st.s, vs_st.t)); } else { - frag.color = texture(texture1, vs_st); + frag.color = texture(colorTexture, vs_st); } } @@ -59,10 +58,6 @@ Fragment getFragment() { frag.depth = vs_screenSpaceDepth; - if (additiveBlending) { - frag.blend = BLEND_MODE_ADDITIVE; - } - // G-Buffer frag.gPosition = vs_gPosition; frag.gNormal = vec4(vs_gNormal, 1.0); diff --git a/modules/base/shaders/plane_vs.glsl b/modules/base/shaders/plane_vs.glsl index 83f9720ca7..e1e3bb1f73 100644 --- a/modules/base/shaders/plane_vs.glsl +++ b/modules/base/shaders/plane_vs.glsl @@ -34,13 +34,13 @@ out vec3 vs_gNormal; out float vs_screenSpaceDepth; out vec2 vs_st; -uniform mat4 modelViewProjectionTransform; +uniform mat4 modelViewProjection; uniform mat4 modelViewTransform; void main() { vec4 position = vec4(in_position.xyz * pow(10, in_position.w), 1); - vec4 positionClipSpace = modelViewProjectionTransform * position; + vec4 positionClipSpace = modelViewProjection * position; vec4 positionScreenSpace = z_normalization(positionClipSpace); gl_Position = positionScreenSpace; diff --git a/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp index 2414994f05..3f04668c98 100644 --- a/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp +++ b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp @@ -702,15 +702,9 @@ void RenderableBillboardsCloud::render(const RenderData& data, RendererTasks&) { } } - glm::dmat4 modelMatrix = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * // Translation - glm::dmat4(data.modelTransform.rotation) * // Spice rotation - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - glm::dmat4 modelViewMatrix = data.camera.combinedViewMatrix() * modelMatrix; - glm::dmat4 projectionMatrix = glm::dmat4(data.camera.projectionMatrix()); - - glm::dmat4 modelViewProjectionMatrix = projectionMatrix * modelViewMatrix; + glm::dmat4 modelMatrix = calcModelTransform(data); + glm::dmat4 modelViewProjectionMatrix = + calcModelViewProjectionTransform(data, modelMatrix); glm::dvec3 cameraViewDirectionWorld = -data.camera.viewDirectionWorldSpace(); glm::dvec3 cameraUpDirectionWorld = data.camera.lookUpVectorWorldSpace(); diff --git a/modules/digitaluniverse/rendering/renderableplanescloud.cpp b/modules/digitaluniverse/rendering/renderableplanescloud.cpp index 060023baf9..c599f429fb 100644 --- a/modules/digitaluniverse/rendering/renderableplanescloud.cpp +++ b/modules/digitaluniverse/rendering/renderableplanescloud.cpp @@ -376,8 +376,8 @@ void RenderablePlanesCloud::deinitializeGL() { } void RenderablePlanesCloud::renderPlanes(const RenderData&, - const glm::dmat4& modelViewMatrix, - const glm::dmat4& projectionMatrix, + const glm::dmat4& modelViewTransform, + const glm::dmat4& projectionTransform, const float fadeInVariable) { glEnablei(GL_BLEND, 0); @@ -387,10 +387,11 @@ void RenderablePlanesCloud::renderPlanes(const RenderData&, _program->activate(); - glm::dmat4 modelViewProjectionMatrix = glm::dmat4(projectionMatrix) * modelViewMatrix; + glm::dmat4 modelViewProjectionTransform = + glm::dmat4(projectionTransform) * modelViewTransform; _program->setUniform( _uniformCache.modelViewProjectionTransform, - modelViewProjectionMatrix + modelViewProjectionTransform ); _program->setUniform(_uniformCache.alphaValue, opacity()); _program->setUniform(_uniformCache.fadeInValue, fadeInVariable); @@ -448,24 +449,21 @@ void RenderablePlanesCloud::render(const RenderData& data, RendererTasks&) { } } - const glm::dmat4 modelMatrix = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * // Translation - glm::dmat4(data.modelTransform.rotation) * // Spice rotation - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - const glm::dmat4 modelViewMatrix = data.camera.combinedViewMatrix() * modelMatrix; - const glm::mat4 projectionMatrix = data.camera.projectionMatrix(); + const glm::dmat4 modelTransform = calcModelTransform(data); + const glm::dmat4 modelViewTransform = calcModelViewTransform(data, modelTransform); + const glm::mat4 projectionTransform = data.camera.projectionMatrix(); if (_hasSpeckFile) { - renderPlanes(data, modelViewMatrix, projectionMatrix, fadeInVariable); + renderPlanes(data, modelViewTransform, projectionTransform, fadeInVariable); } if (_hasLabels) { - const glm::dmat4 mvpMatrix = glm::dmat4(projectionMatrix) * modelViewMatrix; + const glm::dmat4 modelViewProjectionTransform = + glm::dmat4(projectionTransform) * modelViewTransform; - const glm::dmat4 invMVPParts = glm::inverse(modelMatrix) * + const glm::dmat4 invMVPParts = glm::inverse(modelTransform) * glm::inverse(data.camera.combinedViewMatrix()) * - glm::inverse(glm::dmat4(projectionMatrix)); + glm::inverse(glm::dmat4(projectionTransform)); const glm::dvec3 orthoRight = glm::normalize( glm::dvec3(invMVPParts * glm::dvec4(1.0, 0.0, 0.0, 0.0)) ); @@ -473,7 +471,7 @@ void RenderablePlanesCloud::render(const RenderData& data, RendererTasks&) { glm::dvec3(invMVPParts * glm::dvec4(0.0, 1.0, 0.0, 0.0)) ); - _labels->render(data, mvpMatrix, orthoRight, orthoUp, fadeInVariable); + _labels->render(data, modelViewProjectionTransform, orthoRight, orthoUp, fadeInVariable); } } diff --git a/modules/digitaluniverse/rendering/renderableplanescloud.h b/modules/digitaluniverse/rendering/renderableplanescloud.h index 4ee824e228..8c8773e70d 100644 --- a/modules/digitaluniverse/rendering/renderableplanescloud.h +++ b/modules/digitaluniverse/rendering/renderableplanescloud.h @@ -80,8 +80,8 @@ private: void deleteDataGPUAndCPU(); void createPlanes(); - void renderPlanes(const RenderData& data, const glm::dmat4& modelViewMatrix, - const glm::dmat4& projectionMatrix, float fadeInVariable); + void renderPlanes(const RenderData& data, const glm::dmat4& modelViewTransform, + const glm::dmat4& projectionTransform, float fadeInVariable); void loadTextures(); diff --git a/modules/digitaluniverse/rendering/renderablepoints.cpp b/modules/digitaluniverse/rendering/renderablepoints.cpp index 1a7d76acd5..c104723ffb 100644 --- a/modules/digitaluniverse/rendering/renderablepoints.cpp +++ b/modules/digitaluniverse/rendering/renderablepoints.cpp @@ -238,8 +238,7 @@ void RenderablePoints::render(const RenderData& data, RendererTasks&) { _program->setUniform( _uniformCache.modelViewProjectionTransform, - glm::dmat4(data.camera.projectionMatrix()) * - data.camera.combinedViewMatrix() * glm::dmat4(1.0) + calcModelViewProjectionTransform(data, glm::dmat4(1.0)) ); _program->setUniform(_uniformCache.color, _pointColor); diff --git a/modules/exoplanets/rendering/renderableorbitdisc.cpp b/modules/exoplanets/rendering/renderableorbitdisc.cpp index dddb81f391..9fadb165f1 100644 --- a/modules/exoplanets/rendering/renderableorbitdisc.cpp +++ b/modules/exoplanets/rendering/renderableorbitdisc.cpp @@ -185,16 +185,9 @@ void RenderableOrbitDisc::deinitializeGL() { void RenderableOrbitDisc::render(const RenderData& data, RendererTasks&) { _shader->activate(); - glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * modelTransform; - _shader->setUniform( _uniformCache.modelViewProjection, - data.camera.projectionMatrix() * glm::mat4(modelViewTransform) + glm::mat4(calcModelViewProjectionTransform(data)) ); _shader->setUniform(_uniformCache.offset, _offset); _shader->setUniform(_uniformCache.opacity, opacity()); diff --git a/modules/gaia/rendering/renderablegaiastars.cpp b/modules/gaia/rendering/renderablegaiastars.cpp index cd2d5baded..f99b1c75aa 100644 --- a/modules/gaia/rendering/renderablegaiastars.cpp +++ b/modules/gaia/rendering/renderablegaiastars.cpp @@ -962,15 +962,13 @@ void RenderableGaiaStars::render(const RenderData& data, RendererTasks&) { GLint defaultFbo; glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFbo); - glm::dmat4 model = glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); + glm::dmat4 model = calcModelTransform(data); float viewScaling = data.camera.scaling(); glm::dmat4 view = data.camera.combinedViewMatrix(); glm::dmat4 projection = data.camera.projectionMatrix(); - glm::dmat4 modelViewProjMat = projection * view * model; + glm::dmat4 modelViewProjMat = calcModelViewProjectionTransform(data, model); glm::vec2 screenSize = glm::vec2(global::renderEngine->renderingResolution()); // Wait until camera has stabilized before we traverse the Octree/stream from files. diff --git a/modules/galaxy/rendering/renderablegalaxy.cpp b/modules/galaxy/rendering/renderablegalaxy.cpp index 164ff7f11c..b77ccf1001 100644 --- a/modules/galaxy/rendering/renderablegalaxy.cpp +++ b/modules/galaxy/rendering/renderablegalaxy.cpp @@ -629,17 +629,14 @@ void RenderableGalaxy::renderPoints(const RenderData& data) { glm::rotate(glm::dmat4(1.0), 4.45741, glm::dvec3(0.0, 0.0, 1.0) ); - glm::dmat4 modelMatrix = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * rotMatrix * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); + AlternativeTransform altTransform; + altTransform.rotation = glm::dmat4(data.modelTransform.rotation) * rotMatrix; + glm::dmat4 modelTransform = calcModelTransform(data, altTransform); - glm::dmat4 projectionMatrix = glm::dmat4(data.camera.projectionMatrix()); + glm::dmat4 cameraViewProjectionMatrix = + glm::dmat4(data.camera.projectionMatrix()) * data.camera.combinedViewMatrix(); - glm::dmat4 cameraViewProjectionMatrix = projectionMatrix * - data.camera.combinedViewMatrix(); - - _pointsProgram->setUniform(_uniformCachePoints.modelMatrix, modelMatrix); + _pointsProgram->setUniform(_uniformCachePoints.modelMatrix, modelTransform); _pointsProgram->setUniform( _uniformCachePoints.cameraViewProjectionMatrix, cameraViewProjectionMatrix @@ -682,17 +679,14 @@ void RenderableGalaxy::renderBillboards(const RenderData& data) { glm::rotate(glm::dmat4(1.0), 4.45741, glm::dvec3(0.0, 0.0, 1.0) ); - glm::dmat4 modelMatrix = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * rotMatrix * - glm::scale(glm::dmat4(1.0), data.modelTransform.scale); + AlternativeTransform altTransform; + altTransform.rotation = glm::dmat4(data.modelTransform.rotation) * rotMatrix; + glm::dmat4 modelTransform = calcModelTransform(data, altTransform); - glm::dmat4 projectionMatrix = glm::dmat4(data.camera.projectionMatrix()); + glm::dmat4 cameraViewProjectionMatrix = + glm::dmat4(data.camera.projectionMatrix()) * data.camera.combinedViewMatrix(); - glm::dmat4 cameraViewProjectionMatrix = projectionMatrix * - data.camera.combinedViewMatrix(); - - _billboardsProgram->setUniform(_uniformCacheBillboards.modelMatrix, modelMatrix); + _billboardsProgram->setUniform(_uniformCacheBillboards.modelMatrix, modelTransform); _billboardsProgram->setUniform( _uniformCacheBillboards.cameraViewProjectionMatrix, cameraViewProjectionMatrix diff --git a/modules/skybrowser/src/renderableskytarget.cpp b/modules/skybrowser/src/renderableskytarget.cpp index 8619ebaed8..429b660d15 100644 --- a/modules/skybrowser/src/renderableskytarget.cpp +++ b/modules/skybrowser/src/renderableskytarget.cpp @@ -241,23 +241,15 @@ void RenderableSkyTarget::render(const RenderData& data, RendererTasks&) { cameraOrientedRotation : glm::dmat4(data.modelTransform.rotation); - const glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - rotationTransform * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)) * - glm::dmat4(1.0); - const glm::dmat4 modelViewTransform = - data.camera.combinedViewMatrix() * modelTransform; + auto [modelTransform, modelViewTransform, modelViewProjectionTransform] = + calcAllTransforms(data, { .rotation = rotationTransform }); _shader->setUniform( "modelViewProjectionTransform", - data.camera.projectionMatrix() * glm::mat4(modelViewTransform) + glm::mat4(modelViewProjectionTransform) ); - _shader->setUniform( - "modelViewTransform", - glm::mat4(data.camera.combinedViewMatrix() * glm::dmat4(modelViewTransform)) - ); + _shader->setUniform("modelViewTransform", glm::mat4(modelViewTransform)); _shader->setUniform("multiplyColor", _multiplyColor); diff --git a/modules/space/rendering/renderableconstellationbounds.cpp b/modules/space/rendering/renderableconstellationbounds.cpp index 2aa9a6fd81..8e3cb017fa 100644 --- a/modules/space/rendering/renderableconstellationbounds.cpp +++ b/modules/space/rendering/renderableconstellationbounds.cpp @@ -186,11 +186,7 @@ void RenderableConstellationBounds::render(const RenderData& data, RendererTasks _program->setUniform("camrot", glm::mat4(data.camera.viewRotationMatrix())); _program->setUniform("scaling", glm::vec2(1.f, 0.f)); - glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - + const glm::dmat4 modelTransform = calcModelTransform(data); _program->setUniform("ViewProjection", data.camera.viewProjectionMatrix()); _program->setUniform("ModelTransform", glm::mat4(modelTransform)); diff --git a/modules/space/rendering/renderableconstellationlines.cpp b/modules/space/rendering/renderableconstellationlines.cpp index cb4f55cfec..01529fad9d 100644 --- a/modules/space/rendering/renderableconstellationlines.cpp +++ b/modules/space/rendering/renderableconstellationlines.cpp @@ -283,16 +283,11 @@ void RenderableConstellationLines::renderConstellations(const RenderData&, } void RenderableConstellationLines::render(const RenderData& data, RendererTasks& tasks) { - const glm::dmat4 modelMatrix = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * // Translation - glm::dmat4(data.modelTransform.rotation) * // Spice rotation - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - const glm::dmat4 modelViewMatrix = data.camera.combinedViewMatrix() * modelMatrix; - const glm::dmat4 projectionMatrix = data.camera.projectionMatrix(); + const glm::dmat4 modelViewTransform = calcModelViewTransform(data); + const glm::dmat4 projectionTransform = data.camera.projectionMatrix(); if (_drawElements) { - renderConstellations(data, modelViewMatrix, projectionMatrix); + renderConstellations(data, modelViewTransform, projectionTransform); } RenderableConstellationsBase::render(data, tasks); diff --git a/modules/space/rendering/renderableconstellationsbase.cpp b/modules/space/rendering/renderableconstellationsbase.cpp index ad73cffcf9..fd77b5bc64 100644 --- a/modules/space/rendering/renderableconstellationsbase.cpp +++ b/modules/space/rendering/renderableconstellationsbase.cpp @@ -214,21 +214,16 @@ void RenderableConstellationsBase::render(const RenderData& data, RendererTasks& return; } - const glm::dmat4 modelMatrix = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * // Translation - glm::dmat4(data.modelTransform.rotation) * // Spice rotation - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - const glm::dmat4 modelViewMatrix = data.camera.combinedViewMatrix() * modelMatrix; - const glm::dmat4 projectionMatrix = data.camera.projectionMatrix(); - const glm::dmat4 modelViewProjectionMatrix = projectionMatrix * modelViewMatrix; + const glm::dmat4 modelTransform = calcModelTransform(data); + const glm::dmat4 modelViewProjectionTransform = + calcModelViewProjectionTransform(data, modelTransform); const glm::vec3 lookup = data.camera.lookUpVectorWorldSpace(); const glm::vec3 viewDirection = data.camera.viewDirectionWorldSpace(); glm::vec3 right = glm::cross(viewDirection, lookup); const glm::vec3 up = glm::cross(right, viewDirection); - const glm::dmat4 worldToModelTransform = glm::inverse(modelMatrix); + const glm::dmat4 worldToModelTransform = glm::inverse(modelTransform); glm::vec3 orthoRight = glm::normalize( glm::vec3(worldToModelTransform * glm::vec4(right, 0.f)) ); @@ -244,7 +239,7 @@ void RenderableConstellationsBase::render(const RenderData& data, RendererTasks& const glm::vec3 orthoUp = glm::normalize( glm::vec3(worldToModelTransform * glm::dvec4(up, 0.f)) ); - _labels->render(data, modelViewProjectionMatrix, orthoRight, orthoUp); + _labels->render(data, modelViewProjectionTransform, orthoRight, orthoUp); } } // namespace openspace diff --git a/modules/space/rendering/renderableeclipsecone.cpp b/modules/space/rendering/renderableeclipsecone.cpp index 1f6c893fc1..a5b22b12cd 100644 --- a/modules/space/rendering/renderableeclipsecone.cpp +++ b/modules/space/rendering/renderableeclipsecone.cpp @@ -277,15 +277,12 @@ void RenderableEclipseCone::render(const RenderData& data, RendererTasks&) { _shader->activate(); // Model transform and view transform needs to be in double precision - const glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * modelTransform; + const glm::dmat4 modelViewProjectionTransform = + calcModelViewProjectionTransform(data); _shader->setUniform( _uniformCache.modelViewProjectionTransform, - data.camera.projectionMatrix() * glm::mat4(modelViewTransform) + glm::mat4(modelViewProjectionTransform) ); _shader->setUniform(_uniformCache.opacity, opacity()); diff --git a/modules/space/rendering/renderablefluxnodes.cpp b/modules/space/rendering/renderablefluxnodes.cpp index 7a547ae1b1..cd0ed7b9a5 100644 --- a/modules/space/rendering/renderablefluxnodes.cpp +++ b/modules/space/rendering/renderablefluxnodes.cpp @@ -676,21 +676,24 @@ void RenderableFluxNodes::render(const RenderData& data, RendererTasks&) { _shaderProgram->activate(); // Calculate Model View MatrixProjection - const glm::dmat4 rotMat = glm::dmat4(data.modelTransform.rotation); - const glm::dmat4 modelMat = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - rotMat * glm::scale(glm::dmat4(1.0), data.modelTransform.scale); - const glm::dmat4 modelViewMat = data.camera.combinedViewMatrix() * modelMat; + const glm::dmat4 rotationTransform = glm::dmat4(data.modelTransform.rotation); + const glm::dmat4 modelTransform = calcModelTransform( + data, + { .rotation = rotationTransform } + ); - _shaderProgram->setUniform("modelViewProjection", - data.camera.sgctInternal.projectionMatrix() * glm::mat4(modelViewMat) + _shaderProgram->setUniform( + "modelViewProjection", + glm::mat4(calcModelViewProjectionTransform(data, modelTransform)) ); SceneGraphNode* earthNode = sceneGraphNode("Earth"); if (!earthNode) { LWARNING("Could not find scene graph node 'Earth'"); } - glm::vec3 earthPos = earthNode->worldPosition() * data.modelTransform.rotation; + glm::vec3 earthPos = glm::vec3( + earthNode->worldPosition() * data.modelTransform.rotation + ); _shaderProgram->setUniform(_uniformCache.streamColor, _streamColor); _shaderProgram->setUniform(_uniformCache.nodeSize, _nodeSize); diff --git a/modules/space/rendering/renderablehabitablezone.cpp b/modules/space/rendering/renderablehabitablezone.cpp index 03b946631c..67caa87580 100644 --- a/modules/space/rendering/renderablehabitablezone.cpp +++ b/modules/space/rendering/renderablehabitablezone.cpp @@ -146,16 +146,9 @@ RenderableHabitableZone::RenderableHabitableZone(const ghoul::Dictionary& dictio void RenderableHabitableZone::render(const RenderData& data, RendererTasks&) { _shader->activate(); - glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * modelTransform; - _shader->setUniform( _uniformCache.modelViewProjection, - data.camera.projectionMatrix() * glm::mat4(modelViewTransform) + glm::mat4(calcModelViewProjectionTransform(data)) ); _shader->setUniform(_uniformCache.width, _width); _shader->setUniform(_uniformCache.opacity, opacity()); diff --git a/modules/space/rendering/renderableorbitalkepler.cpp b/modules/space/rendering/renderableorbitalkepler.cpp index 0b5174457c..1baa644886 100644 --- a/modules/space/rendering/renderableorbitalkepler.cpp +++ b/modules/space/rendering/renderableorbitalkepler.cpp @@ -271,15 +271,7 @@ void RenderableOrbitalKepler::render(const RenderData& data, RendererTasks&) { _programObject->setUniform(_uniformCache.opacity, opacity()); _programObject->setUniform(_uniformCache.inGameTime, data.time.j2000Seconds()); - glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - _programObject->setUniform( - _uniformCache.modelView, - data.camera.combinedViewMatrix() * modelTransform - ); + _programObject->setUniform(_uniformCache.modelView, calcModelViewTransform(data)); // Because we want the property to work similar to the planet trails const float fade = pow(_appearance.lineFade.maxValue() - _appearance.lineFade, 2.f); diff --git a/modules/space/rendering/renderablerings.cpp b/modules/space/rendering/renderablerings.cpp index b2e618dd6b..41fe330e8b 100644 --- a/modules/space/rendering/renderablerings.cpp +++ b/modules/space/rendering/renderablerings.cpp @@ -184,16 +184,9 @@ void RenderableRings::deinitializeGL() { void RenderableRings::render(const RenderData& data, RendererTasks&) { _shader->activate(); - glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * modelTransform; - _shader->setUniform( _uniformCache.modelViewProjection, - data.camera.projectionMatrix() * glm::mat4(modelViewTransform) + glm::mat4(calcModelViewProjectionTransform(data)) ); _shader->setUniform(_uniformCache.textureOffset, _offset); _shader->setUniform(_uniformCache.colorFilterValue, _colorFilter); diff --git a/modules/space/rendering/renderablestars.cpp b/modules/space/rendering/renderablestars.cpp index 9309473b57..8207385ad8 100644 --- a/modules/space/rendering/renderablestars.cpp +++ b/modules/space/rendering/renderablestars.cpp @@ -1047,10 +1047,7 @@ void RenderableStars::render(const RenderData& data, RendererTasks&) { glm::dvec3 cameraUp = data.camera.lookUpVectorWorldSpace(); _program->setUniform(_uniformCache.cameraUp, cameraUp); - glm::dmat4 modelMatrix = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), data.modelTransform.scale); + glm::dmat4 modelMatrix = calcModelTransform(data); glm::dmat4 projectionMatrix = glm::dmat4(data.camera.projectionMatrix()); diff --git a/modules/space/rendering/renderabletravelspeed.cpp b/modules/space/rendering/renderabletravelspeed.cpp index b495961e39..7b8b354370 100644 --- a/modules/space/rendering/renderabletravelspeed.cpp +++ b/modules/space/rendering/renderabletravelspeed.cpp @@ -299,15 +299,10 @@ void RenderableTravelSpeed::render(const RenderData& data, RendererTasks&) { } _shaderProgram->activate(); - const glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), data.modelTransform.scale); - - const glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * - modelTransform; - - _shaderProgram->setUniform("modelViewTransform", glm::mat4(modelViewTransform)); + _shaderProgram->setUniform( + "modelViewTransform", + glm::mat4(calcModelViewTransform(data)) + ); _shaderProgram->setUniform("projectionTransform", data.camera.projectionMatrix()); #ifndef __APPLE__ diff --git a/modules/spacecraftinstruments/rendering/renderablecrawlingline.cpp b/modules/spacecraftinstruments/rendering/renderablecrawlingline.cpp index 902847649e..31688c56c6 100644 --- a/modules/spacecraftinstruments/rendering/renderablecrawlingline.cpp +++ b/modules/spacecraftinstruments/rendering/renderablecrawlingline.cpp @@ -142,13 +142,7 @@ void RenderableCrawlingLine::render(const RenderData& data, RendererTasks&) { _program->activate(); _frameCounter++; - glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - - glm::dmat4 modelViewProjectionTransform = data.camera.projectionMatrix() * - glm::mat4(data.camera.combinedViewMatrix() * modelTransform); + glm::dmat4 modelViewProjectionTransform = calcModelViewProjectionTransform(data); _program->setUniform("modelViewProjection", modelViewProjectionTransform); diff --git a/modules/spacecraftinstruments/rendering/renderablefov.cpp b/modules/spacecraftinstruments/rendering/renderablefov.cpp index e29610b013..e25e156eaf 100644 --- a/modules/spacecraftinstruments/rendering/renderablefov.cpp +++ b/modules/spacecraftinstruments/rendering/renderablefov.cpp @@ -758,14 +758,8 @@ void RenderableFov::render(const RenderData& data, RendererTasks&) { _program->activate(); // Model transform and view transform needs to be in double precision - glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - glm::mat4 modelViewProjectionTransform = - data.camera.projectionMatrix() * - glm::mat4(data.camera.combinedViewMatrix() * modelTransform); + calcModelViewProjectionTransform(data); _program->setUniform(_uniformCache.modelViewProjection, modelViewProjectionTransform); diff --git a/modules/spacecraftinstruments/rendering/renderablemodelprojection.cpp b/modules/spacecraftinstruments/rendering/renderablemodelprojection.cpp index 3852feda2e..bd88be6f96 100644 --- a/modules/spacecraftinstruments/rendering/renderablemodelprojection.cpp +++ b/modules/spacecraftinstruments/rendering/renderablemodelprojection.cpp @@ -262,12 +262,10 @@ void RenderableModelProjection::render(const RenderData& data, RendererTasks&) { const glm::vec3 bodyPos = data.modelTransform.translation; // Model transform and view transform needs to be in double precision - const glm::dmat4 transform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)) * - glm::scale(glm::dmat4(1.0), glm::dvec3(_modelScale)); - const glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * transform; + const glm::dmat4 modelTransform = glm::scale( + calcModelTransform(data), glm::dvec3(_modelScale) + ); + const glm::dmat4 modelViewTransform = calcModelViewTransform(data, modelTransform); // malej 2023-FEB-23: The light sources should probably not be hard coded const glm::vec3 directionToSun = glm::normalize(_sunPosition - bodyPos); diff --git a/modules/spacecraftinstruments/rendering/renderableplaneprojection.cpp b/modules/spacecraftinstruments/rendering/renderableplaneprojection.cpp index bf6f4c41a0..9a9ea32360 100644 --- a/modules/spacecraftinstruments/rendering/renderableplaneprojection.cpp +++ b/modules/spacecraftinstruments/rendering/renderableplaneprojection.cpp @@ -125,10 +125,14 @@ void RenderablePlaneProjection::render(const RenderData& data, RendererTasks&) { glm::dmat4 modelTransform = glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * glm::dmat4(_stateMatrix); - glm::mat4 mvp = data.camera.projectionMatrix() * - glm::mat4(data.camera.combinedViewMatrix() * modelTransform); - _shader->setUniform("modelViewProjectionTransform", mvp); + const glm::dmat4 ModelViewProjectionTransform = + calcModelViewProjectionTransform(data, modelTransform); + + _shader->setUniform( + "modelViewProjectionTransform", + glm::mat4(ModelViewProjectionTransform) + ); ghoul::opengl::TextureUnit unit; unit.activate(); diff --git a/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp b/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp index 818c2e0a7d..dd395868f8 100644 --- a/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp +++ b/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp @@ -522,17 +522,12 @@ void RenderablePlanetProjection::render(const RenderData& data, RendererTasks&) _programObject->setUniform(_mainUniformCache.sunPos, static_cast(sunPos)); // Model transform and view transform needs to be in double precision - glm::dmat4 trans = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * // Translation - glm::dmat4(data.modelTransform.rotation) * // Spice rotation - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); + const glm::dmat4 modelTransform = calcModelTransform(data); - glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * trans; - - _programObject->setUniform(_mainUniformCache.modelTransform, glm::mat4(trans)); + _programObject->setUniform(_mainUniformCache.modelTransform, glm::mat4(modelTransform)); _programObject->setUniform( _mainUniformCache.modelViewProjectionTransform, - data.camera.projectionMatrix() * glm::mat4(modelViewTransform) + glm::mat4(calcModelViewProjectionTransform(data, modelTransform)) ); _programObject->setUniform(_mainUniformCache.hasBaseMap, _baseTexture != nullptr); diff --git a/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp b/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp index dc18010b34..f721ea17c7 100644 --- a/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp +++ b/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp @@ -260,15 +260,9 @@ void RenderableShadowCylinder::render(const RenderData& data, RendererTasks&) { _shader->activate(); // Model transform and view transform needs to be in double precision - const glm::dmat4 modelTransform = - glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * - glm::dmat4(data.modelTransform.rotation) * - glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale)); - glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * modelTransform; - _shader->setUniform( _uniformCache.modelViewProjectionTransform, - data.camera.projectionMatrix() * glm::mat4(modelViewTransform) + glm::mat4(calcModelViewProjectionTransform(data)) ); _shader->setUniform(_uniformCache.shadowColor, _shadowColor); diff --git a/src/rendering/renderable.cpp b/src/rendering/renderable.cpp index 1b35fbb3ff..ec30219e37 100644 --- a/src/rendering/renderable.cpp +++ b/src/rendering/renderable.cpp @@ -337,4 +337,51 @@ bool Renderable::hasOverrideRenderBin() const noexcept { return _hasOverrideRenderBin; } +glm::dmat4 Renderable::calcModelTransform(const RenderData& data, + const AlternativeTransform& altTransform) const +{ + glm::dvec3 translation = + altTransform.translation.value_or(data.modelTransform.translation); + glm::dmat3 rotation = altTransform.rotation.value_or(data.modelTransform.rotation); + glm::dvec3 scale = altTransform.scale.value_or(data.modelTransform.scale); + + return glm::translate(glm::dmat4(1.0), translation) * + glm::dmat4(rotation) * + glm::scale(glm::dmat4(1.0), scale); +} + +glm::dmat4 Renderable::calcModelViewTransform(const RenderData& data, + std::optional modelTransform) const +{ + glm::dmat4 modelMatrix = modelTransform.value_or(calcModelTransform(data)); + return data.camera.combinedViewMatrix() * modelMatrix; +} + +glm::dmat4 Renderable::calcModelViewProjectionTransform(const RenderData& data, + std::optional modelTransform) const +{ + glm::dmat4 modelMatrix = modelTransform.value_or(calcModelTransform(data)); + glm::dmat4 viewMatrix = data.camera.combinedViewMatrix(); + glm::dmat4 projectionMatrix = data.camera.projectionMatrix(); + return glm::dmat4(projectionMatrix * viewMatrix * modelMatrix); +} + +std::tuple Renderable::calcAllTransforms( + const RenderData& data, + const AlternativeTransform& altModelTransform) const +{ + glm::dmat4 modelTransform = calcModelTransform(data, altModelTransform); + glm::dmat4 modelViewTransform = calcModelViewTransform(data, modelTransform); + glm::dmat4 modelViewProjectionTransform = calcModelViewProjectionTransform( + data, + modelTransform + ); + + return { + modelTransform, + modelViewTransform, + modelViewProjectionTransform + }; +} + } // namespace openspace From 30003ae20fc34d79886bf3a1cf211abd8e6a7cd6 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 21 Sep 2023 20:51:33 +0200 Subject: [PATCH 138/701] Add new environment variable flag to control the MRF cache location --- openspace.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openspace.cfg b/openspace.cfg index 82e8a4b910..b2d27b72d5 100644 --- a/openspace.cfg +++ b/openspace.cfg @@ -126,7 +126,7 @@ ModuleConfigurations = { GlobeBrowsing = { TileCacheSize = 2048, -- for all globes (CPU and GPU memory) MRFCacheEnabled = false, - MRFCacheLocation = "${BASE}/mrf_cache", + MRFCacheLocation = os.getenv("OPENSPACE_MRFCACHE") or "${BASE}/mrf_cache", DefaultGeoPointTexture = "${DATA}/globe_pin.png" }, Sync = { From c6ffddd253b2baffc84b174a27b2bf31fc8eab73 Mon Sep 17 00:00:00 2001 From: Gene Payne Date: Fri, 22 Sep 2023 11:35:10 -0600 Subject: [PATCH 139/701] Non-Windows compiler fix for empty initializer list --- include/openspace/rendering/renderable.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/include/openspace/rendering/renderable.h b/include/openspace/rendering/renderable.h index 71bd6f3c2e..9ca5adfbd7 100644 --- a/include/openspace/rendering/renderable.h +++ b/include/openspace/rendering/renderable.h @@ -160,7 +160,9 @@ protected: * \return the resulting model transformation matrix in double precision */ glm::dmat4 calcModelTransform(const RenderData& data, - const AlternativeTransform& altTransform = {}) const; + const AlternativeTransform& altTransform = { + std::nullopt, std::nullopt, std::nullopt + }) const; /** * Calculates the model view transformation matrix with the given data and returns it @@ -204,7 +206,9 @@ protected: * model view projection transformation matrices */ std::tuple calcAllTransforms( - const RenderData& data, const AlternativeTransform& altModelTransform = {}) const; + const RenderData& data, const AlternativeTransform& altModelTransform = { + std::nullopt, std::nullopt, std::nullopt + }) const; private: double _boundingSphere = 0.0; From 357f58ccfe3ddee7eafd7b8d83b86113187cecff Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 25 Sep 2023 16:54:10 +0200 Subject: [PATCH 140/701] Use OPENSPACE_GLOBEBROWSING instead of OPENSPACE_MRFCACHE --- openspace.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openspace.cfg b/openspace.cfg index b2d27b72d5..ec258bdd81 100644 --- a/openspace.cfg +++ b/openspace.cfg @@ -126,7 +126,7 @@ ModuleConfigurations = { GlobeBrowsing = { TileCacheSize = 2048, -- for all globes (CPU and GPU memory) MRFCacheEnabled = false, - MRFCacheLocation = os.getenv("OPENSPACE_MRFCACHE") or "${BASE}/mrf_cache", + MRFCacheLocation = os.getenv("OPENSPACE_GLOBEBROWSING") or "${BASE}/mrf_cache", DefaultGeoPointTexture = "${DATA}/globe_pin.png" }, Sync = { From 38308a4cde1b16fd0c1255de52692d633b44eeee Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 27 Sep 2023 23:48:37 +0200 Subject: [PATCH 141/701] Store the mrf cache in a mrf_cache subfolder inside the OPENSPACE_GLOBEBROWSING instead if it is provided --- openspace.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openspace.cfg b/openspace.cfg index ec258bdd81..9d39a87a04 100644 --- a/openspace.cfg +++ b/openspace.cfg @@ -126,7 +126,7 @@ ModuleConfigurations = { GlobeBrowsing = { TileCacheSize = 2048, -- for all globes (CPU and GPU memory) MRFCacheEnabled = false, - MRFCacheLocation = os.getenv("OPENSPACE_GLOBEBROWSING") or "${BASE}/mrf_cache", + MRFCacheLocation = (os.getenv("OPENSPACE_GLOBEBROWSING") or "${BASE}") .. "/mrf_cache", DefaultGeoPointTexture = "${DATA}/globe_pin.png" }, Sync = { From 46ed8382e83bd777082fe935e87e2940e6a7ff78 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 28 Sep 2023 09:40:51 +0200 Subject: [PATCH 142/701] Add the ability to specify a custom shader for the RenderableGalaxy class --- .../examples/galaxyshader/galaxyraycast.glsl | 73 ++++++++++++++++++ .../assets/examples/galaxyshader/volume.asset | 76 +++++++++++++++++++ modules/galaxy/rendering/galaxyraycaster.cpp | 6 +- modules/galaxy/rendering/galaxyraycaster.h | 4 +- modules/galaxy/rendering/renderablegalaxy.cpp | 12 ++- modules/galaxy/rendering/renderablegalaxy.h | 1 + 6 files changed, 168 insertions(+), 4 deletions(-) create mode 100644 data/assets/examples/galaxyshader/galaxyraycast.glsl create mode 100644 data/assets/examples/galaxyshader/volume.asset diff --git a/data/assets/examples/galaxyshader/galaxyraycast.glsl b/data/assets/examples/galaxyshader/galaxyraycast.glsl new file mode 100644 index 0000000000..bc4acd2ffe --- /dev/null +++ b/data/assets/examples/galaxyshader/galaxyraycast.glsl @@ -0,0 +1,73 @@ +/***************************************************************************************** +* * +* OpenSpace * +* * +* Copyright (c) 2014-2020 * +* * +* 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. * +****************************************************************************************/ + +uniform float maxStepSize#{id} = 0.1; +uniform vec3 aspect#{id} = vec3(1.0); +uniform float opacityCoefficient#{id} = 1.0; +uniform float absorptionMultiply#{id} = 50.0; +uniform float emissionMultiply#{id} = 1500.0; +uniform sampler3D galaxyTexture#{id}; + +void sample#{id}(vec3 samplePos, vec3 dir, inout vec3 accumulatedColor, + inout vec3 accumulatedAlpha, inout float stepSize) +{ + vec3 aspect = aspect#{id}; + stepSize = maxStepSize#{id} / length(dir / aspect); + + // Early ray termination on black parts of the data + vec3 normalizedPos = samplePos * 2.0 - 1.0; + if (normalizedPos.x * normalizedPos.x + normalizedPos.y * normalizedPos.y > 0.7) { + return; + } + + vec4 sampledColor = texture(galaxyTexture#{id}, samplePos.xyz); + + // Source textures currently are square-rooted to avoid dithering in the shadows. + // So square them back + sampledColor = sampledColor*sampledColor; + + // Fudge for the dust "spreading" + sampledColor.a = clamp(sampledColor.a, 0.0, 1.0); + sampledColor.a = pow(sampledColor.a, 0.7); + + // Absorption probability + float scaledDensity = sampledColor.a * stepSize * absorptionMultiply#{id}; + vec3 alphaTint = vec3(-0.7, -0.44, -0.35); + vec3 absorption = alphaTint * scaledDensity; + + // Extinction + vec3 extinction = exp(-absorption); + accumulatedColor.rgb *= extinction; + + // Emission + accumulatedColor.rgb += + sampledColor.rgb * stepSize * emissionMultiply#{id} * opacityCoefficient#{id}; + + vec3 oneMinusFrontAlpha = vec3(1.0) - accumulatedAlpha; + accumulatedAlpha += oneMinusFrontAlpha * sampledColor.rgb * opacityCoefficient#{id}; +} + +float stepSize#{id}(vec3 samplePos, vec3 dir) { + return maxStepSize#{id} * length(dir * 1.0 / aspect#{id}); +} diff --git a/data/assets/examples/galaxyshader/volume.asset b/data/assets/examples/galaxyshader/volume.asset new file mode 100644 index 0000000000..d52b3f2bc0 --- /dev/null +++ b/data/assets/examples/galaxyshader/volume.asset @@ -0,0 +1,76 @@ +local transforms = asset.require("scene/solarsystem/sun/transforms") + + + +local data = asset.syncedResource({ + Name = "Milkyway Volume Data", + Type = "HttpSynchronization", + Identifier = "milkyway_volume_data", + Version = 1 +}) + + +local KiloParsec = 3.086E19 + +local MilkyWayVolume = { + Identifier = "MilkyWayVolume_CustomShader", + Parent = transforms.SolarSystemBarycenter.Identifier, + Transform = { + Translation = { + Type = "StaticTranslation", + -- The center of the Milky Way is approximately 8 kiloparsec from the Sun. + -- The x-axis of galactic coordinates points from the sun towards the center + -- of the galaxy. + Position = { 8 * KiloParsec, 0, 0 } + } + }, + Renderable = { + Type = "RenderableGalaxy", + StepSize = 0.01, + AbsorptionMultiply = 200, + EmissionMultiply = 250, + Rotation = { math.pi, 3.1248, 4.45741 }, + RaycastingShader = asset.localResource("galaxyraycast2.glsl"), + Volume = { + Type = "Volume", + Filename = data .. "MilkyWayRGBAVolume1024x1024x128.raw", + Dimensions = { 1024, 1024, 128 }, + Size = { 1.2E21, 1.2E21, 0.15E21 }, + Downscale = 0.4, + }, + Points = { + Type = "Points", + Filename = data .. "MilkyWayPoints.off", + EnabledPointsRatio = 0.3, + Texture = data .. "halo.png" + } + }, + GUI = { + Path = "/Milky Way", + Name = "Milky Way Volume (Custom Shader)", + Description = "Volumetric rendering of Milky Way galaxy based on simulation from NAOJ" + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(MilkyWayVolume) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(MilkyWayVolume) +end) + +asset.export(MilkyWayVolume) + + + +asset.meta = { + Name = "Milky Way Volume", + Version = "1.1", + Description = [[Volumetric rendering of Milky Way galaxy based on simulations from " + "NAOJ with a custom shader]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT License" +} diff --git a/modules/galaxy/rendering/galaxyraycaster.cpp b/modules/galaxy/rendering/galaxyraycaster.cpp index 7aa2334963..623bdb04c1 100644 --- a/modules/galaxy/rendering/galaxyraycaster.cpp +++ b/modules/galaxy/rendering/galaxyraycaster.cpp @@ -43,10 +43,12 @@ namespace { namespace openspace { -GalaxyRaycaster::GalaxyRaycaster(ghoul::opengl::Texture& texture) +GalaxyRaycaster::GalaxyRaycaster(ghoul::opengl::Texture& texture, + std::optional raycastingShader) : _boundingBox(glm::vec3(1.f)) , _texture(texture) , _textureUnit(nullptr) + , _raycastingShader(raycastingShader.value_or(GlslRaycastPath)) {} void GalaxyRaycaster::initialize() { @@ -149,7 +151,7 @@ std::string GalaxyRaycaster::boundsFragmentShaderPath() const { } std::string GalaxyRaycaster::raycasterPath() const { - return std::string(GlslRaycastPath); + return _raycastingShader.string(); } std::string GalaxyRaycaster::helperPath() const { diff --git a/modules/galaxy/rendering/galaxyraycaster.h b/modules/galaxy/rendering/galaxyraycaster.h index 9be21a3f97..5711247f40 100644 --- a/modules/galaxy/rendering/galaxyraycaster.h +++ b/modules/galaxy/rendering/galaxyraycaster.h @@ -45,7 +45,8 @@ struct RaycastData; class GalaxyRaycaster : public VolumeRaycaster { public: - GalaxyRaycaster(ghoul::opengl::Texture& texture); + GalaxyRaycaster(ghoul::opengl::Texture& texture, + std::optional raycastingShader = std::nullopt); ~GalaxyRaycaster() override = default; void initialize(); @@ -87,6 +88,7 @@ private: float _emissionMultiply = 0.f; ghoul::opengl::Texture& _texture; std::unique_ptr _textureUnit; + std::filesystem::path _raycastingShader; }; // GalaxyRaycaster diff --git a/modules/galaxy/rendering/renderablegalaxy.cpp b/modules/galaxy/rendering/renderablegalaxy.cpp index b77ccf1001..b6ca4bbab3 100644 --- a/modules/galaxy/rendering/renderablegalaxy.cpp +++ b/modules/galaxy/rendering/renderablegalaxy.cpp @@ -175,6 +175,10 @@ namespace { // [[codegen::verbatim(EmissionMultiplyInfo.description)]] std::optional emissionMultiply; + // If this value is specified, the default raycasting shader is overwritten and + // the shader found at the provided location is used instead + std::optional raycastingShader; + enum class [[codegen::map(StarRenderingMethod)]] StarRenderingMethod { Points, Billboards @@ -285,6 +289,7 @@ RenderableGalaxy::RenderableGalaxy(const ghoul::Dictionary& dictionary) _stepSize = p.stepSizeInfo.value_or(_stepSize); _absorptionMultiply = p.absorptionMultiply.value_or(_absorptionMultiply); _emissionMultiply = p.emissionMultiply.value_or(_emissionMultiply); + _raycastingShader = p.raycastingShader.value_or(_raycastingShader); _starRenderingMethod.addOptions({ { StarRenderingMethod::Points, "Points" }, @@ -417,7 +422,12 @@ void RenderableGalaxy::initializeGL() { _texture->setDimensions(_volume->dimensions()); _texture->uploadTexture(); - _raycaster = std::make_unique(*_texture); + if (_raycastingShader.empty()) { + _raycaster = std::make_unique(*_texture); + } + else { + _raycaster = std::make_unique(*_texture, _raycastingShader); + } _raycaster->initialize(); // We no longer need the data diff --git a/modules/galaxy/rendering/renderablegalaxy.h b/modules/galaxy/rendering/renderablegalaxy.h index a6b9be02fc..6614529633 100644 --- a/modules/galaxy/rendering/renderablegalaxy.h +++ b/modules/galaxy/rendering/renderablegalaxy.h @@ -88,6 +88,7 @@ private: glm::ivec3 _volumeDimensions = glm::ivec3(0); std::string _pointsFilename; std::string _pointSpreadFunctionTexturePath; + std::filesystem::path _raycastingShader; std::unique_ptr _raycaster; std::unique_ptr>> _volume; From 49b3cb9eb1753a3ea4619dbd1dd3de5c38f03ae8 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Fri, 6 Oct 2023 14:12:18 +0200 Subject: [PATCH 143/701] Fix naming of umbral and penumbral shadows --- .../space/rendering/renderableeclipsecone.cpp | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/modules/space/rendering/renderableeclipsecone.cpp b/modules/space/rendering/renderableeclipsecone.cpp index a5b22b12cd..b782045340 100644 --- a/modules/space/rendering/renderableeclipsecone.cpp +++ b/modules/space/rendering/renderableeclipsecone.cpp @@ -456,34 +456,9 @@ void RenderableEclipseCone::createCone(double et) { ); - // 4. Construct the penumbral shadow - std::vector penumbralVertices; - if (_showPenumbralShadow) { - penumbralVertices = calculateShadowPoints( - resSrc.terminatorPoints, - resDst.terminatorPoints, - shadowerToLightSource, - lightSourceToShadower, - distance * static_cast(_shadowLength) - ); - - // We need to duplicate the first two vertices to close the cylinder at the seam - penumbralVertices.push_back(penumbralVertices[0]); - penumbralVertices.push_back(penumbralVertices[1]); - } - - - // 5. Construct the umbral shadow + // 4. Construct the umbral shadow std::vector umbralVertices; if (_showUmbralShadow) { - // For the umbral shadow, we need to mix the terminator points with a 180 - // degree phase shift, so that the top terminator point of the sun gets matched - // with the bottom terminator point of the Moon, etc - std::rotate( - resSrc.terminatorPoints.begin(), - resSrc.terminatorPoints.begin() + resSrc.terminatorPoints.size() / 2, - resSrc.terminatorPoints.end() - ); umbralVertices = calculateShadowPoints( resSrc.terminatorPoints, resDst.terminatorPoints, @@ -498,6 +473,31 @@ void RenderableEclipseCone::createCone(double et) { } + // 5. Construct the penumbral shadow + std::vector penumbralVertices; + if (_showPenumbralShadow) { + // For the penumbral shadow, we need to mix the terminator points with a 180 + // degree phase shift, so that the top terminator point of the sun gets matched + // with the bottom terminator point of the Moon, etc + std::rotate( + resSrc.terminatorPoints.begin(), + resSrc.terminatorPoints.begin() + resSrc.terminatorPoints.size() / 2, + resSrc.terminatorPoints.end() + ); + penumbralVertices = calculateShadowPoints( + resSrc.terminatorPoints, + resDst.terminatorPoints, + shadowerToLightSource, + lightSourceToShadower, + distance * static_cast(_shadowLength) + ); + + // We need to duplicate the first two vertices to close the cylinder at the seam + penumbralVertices.push_back(penumbralVertices[0]); + penumbralVertices.push_back(penumbralVertices[1]); + } + + // 6. Combine vertices std::vector vertices; vertices.reserve(umbralVertices.size() + penumbralVertices.size()); From 4cc8e394fb6c89c02549e274abfbb62fe9a4ef53 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Fri, 6 Oct 2023 14:51:57 +0200 Subject: [PATCH 144/701] Add sponsor logos --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c5f30645b6..b15ef66fb1 100644 --- a/README.md +++ b/README.md @@ -47,4 +47,9 @@ Feel free to create issues for missing features, bug reports, or compile problem ![Image](https://github.com/OpenSpace/openspace.github.io/raw/master/assets/images/himalaya-nkpg-dome.jpg) # License -The contents of this repository is under an [MIT license](https://github.com/OpenSpace/OpenSpace/blob/master/LICENSE.md). +The contents of this repository provided under an [MIT license](https://github.com/OpenSpace/OpenSpace/blob/master/LICENSE.md). + +# Support +OpenSpace is supported by the following institutions: + +![Image](https://github.com/OpenSpace/openspace.github.io/raw/master/assets/logos/sponsors.png) From c56ca4d71cb44133169556593839fe26187bc69e Mon Sep 17 00:00:00 2001 From: Micah Acinapura Date: Fri, 6 Oct 2023 13:54:40 -0400 Subject: [PATCH 145/701] Update default_layers for Europa Made the local layer for Europa default as the new york is broken and the Sweden is misaligned. --- .../solarsystem/planets/jupiter/europa/default_layers.asset | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/assets/scene/solarsystem/planets/jupiter/europa/default_layers.asset b/data/assets/scene/solarsystem/planets/jupiter/europa/default_layers.asset index 281f4178c7..19438c0567 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/europa/default_layers.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/europa/default_layers.asset @@ -1,13 +1,13 @@ asset.require("./layers/colorlayers/europa_texture", false) -asset.require("./layers/colorlayers/voyager_global_mosaic_local", false) +asset.require("./layers/colorlayers/voyager_global_mosaic_local", true) asset.require("./layers/colorlayers/voyager_global_mosaic_sweden", false) -asset.require("./layers/colorlayers/voyager_global_mosaic_newyork", true) +asset.require("./layers/colorlayers/voyager_global_mosaic_newyork", false) asset.meta = { Name = "Default Europa Layers", - Version = "1.0", + Version = "1.1", Description = "Default Europa layers are: Europa Texture", Author = "OpenSpace Team", URL = "http://openspaceproject.com", From abee11f97326f29f36f39913af0804b00c0e20bc Mon Sep 17 00:00:00 2001 From: Micah Acinapura Date: Mon, 9 Oct 2023 19:38:49 -0400 Subject: [PATCH 146/701] changed shader variables from const for mac compilation (#2915) --- modules/atmosphere/shaders/atmosphere_deferred_fs.glsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index c0de958617..86da689bc5 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -509,8 +509,8 @@ vec3 sunColor(vec3 v, vec3 s, float r, float mu, float irradianceFactor) { // const float SunAngularSize = (0.3 * M_PI / 180.0); const float FuzzyFactor = 0.5; // How fuzzy should the edges be - const float p1 = cos(sunAngularSize); - const float p2 = cos(sunAngularSize * FuzzyFactor); + float p1 = cos(sunAngularSize); + float p2 = cos(sunAngularSize * FuzzyFactor); float t = (angle - p1) / (p2 - p1); float scale = clamp(t, 0.0, 1.0); From 685b185b5eed90ded042878bc63dae78bc264502 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 16 Oct 2023 13:29:07 +0200 Subject: [PATCH 147/701] Fix property spelling --- modules/globebrowsing/src/renderableglobe.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/globebrowsing/src/renderableglobe.cpp b/modules/globebrowsing/src/renderableglobe.cpp index e21987e1d9..b94a63780b 100644 --- a/modules/globebrowsing/src/renderableglobe.cpp +++ b/modules/globebrowsing/src/renderableglobe.cpp @@ -128,7 +128,7 @@ namespace { constexpr openspace::properties::Property::PropertyInfo PerformFrustumCullingInfo = { "PerformFrustumCulling", - "Perform frusum culling", + "Perform frustum culling", "If this value is set to 'true', frustum culling will be performed.", openspace::properties::Property::Visibility::AdvancedUser }; From 15f175ce3d034581506b20616867d1ba55d191ee Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 16 Oct 2023 20:06:08 +0200 Subject: [PATCH 148/701] Update SGCT submodule --- apps/OpenSpace/ext/sgct | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index ada33efc9e..cfd94f0e6a 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit ada33efc9e65fc6db36d1f75d9782afdcac80cef +Subproject commit cfd94f0e6af50772d1ed27136cf5190d105c6b35 From 1dbe58a8ac4d1ccccb76789cf29a4da412179d78 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 18 Oct 2023 22:29:31 +0200 Subject: [PATCH 149/701] Add a new property to control whether the blackout factor should apply to the master (closes #2923) --- include/openspace/rendering/renderengine.h | 5 ++-- src/rendering/renderengine.cpp | 33 ++++++++++++++-------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index 4a298becb6..9465ada77d 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -92,9 +92,6 @@ public: void renderEndscreen(); void postDraw(); - float globalBlackOutFactor() const; - void setGlobalBlackOutFactor(float opacity); - float hdrExposure() const; bool isHdrDisabled() const; @@ -168,6 +165,7 @@ private: void renderCameraInformation(); void renderShutdownInformation(float timer, float fullTime); void renderDashboard(); + float combinedBlackoutFactor() const; Camera* _camera = nullptr; Scene* _scene = nullptr; @@ -193,6 +191,7 @@ private: properties::BoolProperty _disableMasterRendering; properties::FloatProperty _globalBlackOutFactor; + properties::BoolProperty _applyBlackoutToMaster; properties::BoolProperty _enableFXAA; diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index e8d3ecbade..2061c8b5e1 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -278,6 +278,14 @@ namespace { openspace::properties::Property::Visibility::User }; + constexpr openspace::properties::Property::PropertyInfo ApplyBlackoutToMasterInfo = { + "ApplyBlackoutToMaster", + "Apply Blackout to Master", + "If this value is 'true', the blackout factor is applied to the master node. " + "Regardless of this value, the clients will always adhere to the factor", + openspace::properties::Property::Visibility::AdvancedUser + }; + constexpr openspace::properties::Property::PropertyInfo FXAAInfo = { "FXAA", "Enable FXAA", @@ -317,6 +325,7 @@ RenderEngine::RenderEngine() , _showFrameInformation(ShowFrameNumberInfo, false) , _disableMasterRendering(DisableMasterInfo, false) , _globalBlackOutFactor(GlobalBlackoutFactorInfo, 1.f, 0.f, 1.f) + , _applyBlackoutToMaster(ApplyBlackoutToMasterInfo, true) , _enableFXAA(FXAAInfo, true) , _disableHDRPipeline(DisableHDRPipelineInfo, false) , _hdrExposure(HDRExposureInfo, 3.7f, 0.01f, 10.f) @@ -377,6 +386,7 @@ RenderEngine::RenderEngine() addProperty(_value); addProperty(_globalBlackOutFactor); + addProperty(_applyBlackoutToMaster); addProperty(_screenshotWindowIds); addProperty(_applyWarping); @@ -686,8 +696,8 @@ void RenderEngine::render(const glm::mat4& sceneMatrix, const glm::mat4& viewMat } const bool renderingEnabled = delegate.isMaster() ? !_disableMasterRendering : true; - if (renderingEnabled && _globalBlackOutFactor > 0.f) { - _renderer.render(_scene, _camera, _globalBlackOutFactor); + if (renderingEnabled && combinedBlackoutFactor() > 0.f) { + _renderer.render(_scene, _camera, combinedBlackoutFactor()); } // The CEF webbrowser fix has to be called at least once per frame and we are doing @@ -755,7 +765,7 @@ void RenderEngine::render(const glm::mat4& sceneMatrix, const glm::mat4& viewMat glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); for (ScreenSpaceRenderable* ssr : ssrs) { - ssr->render(_globalBlackOutFactor); + ssr->render(combinedBlackoutFactor()); } glDisable(GL_BLEND); } @@ -905,6 +915,15 @@ void RenderEngine::renderDashboard() { global::dashboard->render(penPosition); } +float RenderEngine::combinedBlackoutFactor() const { + if (global::windowDelegate->isMaster()) { + return _applyBlackoutToMaster ? _globalBlackOutFactor : 1.f; + } + else { + return _globalBlackOutFactor; + } +} + void RenderEngine::postDraw() { ZoneScoped; @@ -930,14 +949,6 @@ ghoul::opengl::OpenGLStateCache& RenderEngine::openglStateCache() { return *_openglStateCache; } -float RenderEngine::globalBlackOutFactor() const { - return _globalBlackOutFactor; -} - -void RenderEngine::setGlobalBlackOutFactor(float opacity) { - _globalBlackOutFactor = opacity; -} - float RenderEngine::hdrExposure() const { return _hdrExposure; } From 06a7c692c5fa56d6f69ac34771cb3bd2524bacf3 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 19 Oct 2023 03:48:57 +0200 Subject: [PATCH 150/701] Add special handling for a number of properties in the DashboardItemPropertyValue (closes #2899) --- data/assets/examples/dashboarditems.asset | 106 ++++++++- .../openspace/navigation/orbitalnavigator.h | 1 - .../dashboard/dashboarditempropertyvalue.cpp | 204 +++++++++++++++++- 3 files changed, 291 insertions(+), 20 deletions(-) diff --git a/data/assets/examples/dashboarditems.asset b/data/assets/examples/dashboarditems.asset index f6c3b14179..26654ef092 100644 --- a/data/assets/examples/dashboarditems.asset +++ b/data/assets/examples/dashboarditems.asset @@ -1,7 +1,6 @@ local Angle = { Type = "DashboardItemAngle", Identifier = "Angle", - GuiName = "Angle", ReferenceType = "Node", ReferenceNodeName = "Earth", DestinationType = "Node", @@ -10,8 +9,7 @@ local Angle = { local Date = { Type = "DashboardItemDate", - Identifier = "Date", - GuiName = "Date" + Identifier = "Date" } local SimulationIncrement = { @@ -22,14 +20,12 @@ local SimulationIncrement = { local Distance = { Type = "DashboardItemDistance", - Identifier = "Distance", - GuiName = "Distance" + Identifier = "Distance" } local Framerate = { Type = "DashboardItemFramerate", - Identifier = "Framerate", - GuiName = "Framerate" + Identifier = "Framerate" } local ParallelConnection = { @@ -40,18 +36,79 @@ local ParallelConnection = { local Mission = { Type = "DashboardItemMission", - Identifier = "Mission", - GuiName = "Mission" + Identifier = "Mission" } local PropertyValue = { Type = "DashboardItemPropertyValue", - Identifier = "asd", - GuiName = "adasd", + Identifier = "DashbaordItemPropertyValue", URI = "Scene.Earth.Renderable.Enabled", DisplayString = "Earth is enabled: {}" } +local PropertyValueFloat = { + Type = "DashboardItemPropertyValue", + Identifier = "DashbaordItemPropertyValue_Float", + URI = "Scene.Earth.Renderable.TargetLodScaleFactor", + DisplayString = "Earth LOD is {:.5f}" +} + +local PropertyValueDouble = { + Type = "DashboardItemPropertyValue", + Identifier = "DashbaordItemPropertyValue_Double", + URI = "NavigationHandler.PathNavigator.ArrivalDistanceFactor", + DisplayString = "Arrival Distance Factor is {:.8f}" +} + +local PropertyValueInt = { + Type = "DashboardItemPropertyValue", + Identifier = "DashbaordItemPropertyValue_Int", + URI = "LuaConsole.HistoryLength", + DisplayString = "History length is {}" +} + +local PropertyValueUInt = { + Type = "DashboardItemPropertyValue", + Identifier = "DashboardItemPropertyValue_UInt", + URI = "Modules.Globebrowsing.TileCacheSize", + DisplayString = "Tile Cache Size is {}" +} + +local PropertyValueDVec3 = { + Type = "DashboardItemPropertyValue", + Identifier = "DashboardItemPropertyValue_DVec3", + URI = "Scene.SolarSystemBarycenter.Transform.Transform", + DisplayString = "SSB Transform is: ({}, {}, {})" +} + +local PropertyValueIVec2 = { + Type = "DashboardItemPropertyValue", + Identifier = "DashboardItemPropertyValue_IVec2", + URI = "Scene.SolarSystemBarycenter.Renderable.ScreenSpacePosition", + DisplayString = "Random ScreenSpace Position: ({}, {})" +} + +local PropertyValueVec2 = { + Type = "DashboardItemPropertyValue", + Identifier = "DashboardItemPropertyValue_Vec2", + URI = "Scene.EarthAtmosphere.Renderable.AtmosphereDimmingSunsetAngle", + DisplayString = "Sunset Angle is ({}, {})" +} + +local PropertyValueVec3 = { + Type = "DashboardItemPropertyValue", + Identifier = "DashboardItemPropertyValue_Vec3", + URI = "RenderEngine.GlobalRotation", + DisplayString = "Global Rotation is ({}, {}, {})" +} + +local PropertyValueVec4 = { + Type = "DashboardItemPropertyValue", + Identifier = "DashboardItemPropertyValue_Vec4", + URI = "LuaConsole.BackgroundColor", + DisplayString = "Background Coolor is ({}, {}, {}, {})" +} + local ElapsedTime = { Type = "DashboardItemElapsedTime", Identifier = "ElapsedTime", @@ -73,6 +130,15 @@ asset.onInitialize(function() openspace.dashboard.addDashboardItem(ParallelConnection) openspace.dashboard.addDashboardItem(Mission) openspace.dashboard.addDashboardItem(PropertyValue) + openspace.dashboard.addDashboardItem(PropertyValueFloat) + openspace.dashboard.addDashboardItem(PropertyValueDouble) + openspace.dashboard.addDashboardItem(PropertyValueInt) + openspace.dashboard.addDashboardItem(PropertyValueUInt) + openspace.dashboard.addDashboardItem(PropertyValueDVec3) + openspace.dashboard.addDashboardItem(PropertyValueIVec2) + openspace.dashboard.addDashboardItem(PropertyValueVec2) + openspace.dashboard.addDashboardItem(PropertyValueVec3) + openspace.dashboard.addDashboardItem(PropertyValueVec4) openspace.dashboard.addDashboardItem(ElapsedTime) openspace.dashboard.addDashboardItem(InputState) end) @@ -80,6 +146,15 @@ end) asset.onDeinitialize(function() openspace.dashboard.removeDashboardItem(InputState) openspace.dashboard.removeDashboardItem(ElapsedTime) + openspace.dashboard.removeDashboardItem(PropertyValueVec4) + openspace.dashboard.removeDashboardItem(PropertyValueVec3) + openspace.dashboard.removeDashboardItem(PropertyValueVec2) + openspace.dashboard.removeDashboardItem(PropertyValueIVec2) + openspace.dashboard.removeDashboardItem(PropertyValueDVec3) + openspace.dashboard.removeDashboardItem(PropertyValueUInt) + openspace.dashboard.removeDashboardItem(PropertyValueInt) + openspace.dashboard.removeDashboardItem(PropertyValueDouble) + openspace.dashboard.removeDashboardItem(PropertyValueFloat) openspace.dashboard.removeDashboardItem(PropertyValue) openspace.dashboard.removeDashboardItem(Mission) openspace.dashboard.removeDashboardItem(ParallelConnection) @@ -98,6 +173,15 @@ asset.export(Framerate) asset.export(ParallelConnection) asset.export(Mission) asset.export(PropertyValue) +asset.export(PropertyValueFloat) +asset.export(PropertyValueDouble) +asset.export(PropertyValueInt) +asset.export(PropertyValueUInt) +asset.export(PropertyValueDVec3) +asset.export(PropertyValueIVec2) +asset.export(PropertyValueVec2) +asset.export(PropertyValueVec3) +asset.export(PropertyValueVec4) asset.export(ElapsedTime) asset.export(InputState) diff --git a/include/openspace/navigation/orbitalnavigator.h b/include/openspace/navigation/orbitalnavigator.h index 99896908c0..0d5f440cb9 100644 --- a/include/openspace/navigation/orbitalnavigator.h +++ b/include/openspace/navigation/orbitalnavigator.h @@ -37,7 +37,6 @@ #include #include #include -#include #include #include #include diff --git a/modules/base/dashboard/dashboarditempropertyvalue.cpp b/modules/base/dashboard/dashboarditempropertyvalue.cpp index 2d24893547..ba0058cfa4 100644 --- a/modules/base/dashboard/dashboarditempropertyvalue.cpp +++ b/modules/base/dashboard/dashboarditempropertyvalue.cpp @@ -27,6 +27,24 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include @@ -47,8 +65,11 @@ namespace { "DisplayString", "Display String", "The String that is being displayed. It must either be empty (in which case only " - "the value itself will be displayed), or it must contain extact one instance of " - "{}, which will be replaced with the value of the property during rendering", + "the value itself will be displayed), or it must contain extact one or more " + "instances of {}, which will be replaced with the value(s) of the property " + "during rendering. For scalar types, there has to be exactly one instance of {}, " + "for vector types, there need to be as many {} as there are compoents in the " + "vector, for example two {} for vec2 types, three for vec3 types, etc", // @VISIBILITY(2.67) openspace::properties::Property::Visibility::User }; @@ -97,12 +118,179 @@ void DashboardItemPropertyValue::render(glm::vec2& penPosition) { } if (_property) { - std::string value = _property->stringValue(); - RenderFont( - *_font, - penPosition, - fmt::format(fmt::runtime(_displayString.value()), value) - ); + std::string_view type = _property->className(); + if (type == "DoubleProperty") { + double value = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), value) + ); + } + else if (type == "FloatProperty") { + float value = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), value) + ); + } + else if (type == "IntProperty") { + int value = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), value) + ); + } + else if (type == "LongProperty") { + long value = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), value) + ); + } + else if (type == "ShortProperty") { + short value = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), value) + ); + } + else if (type == "UIntProperty") { + unsigned int v = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), v) + ); + } + else if (type == "ULongProperty") { + unsigned long v = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), v) + ); + } + else if (type == "UShortProperty") { + unsigned short v = + static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), v) + ); + } + else if (type == "DVec2Property") { + glm::dvec2 v = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), v.x, v.y) + ); + } + else if (type == "DVec3Property") { + glm::dvec3 v = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), v.x, v.y, v.z) + ); + } + else if (type == "DVec4Property") { + glm::dvec4 v = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), v.x, v.y, v.z, v.w) + ); + } + else if (type == "IVec2Property") { + glm::ivec2 v = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), v.x, v.y) + ); + } + else if (type == "IVec3Property") { + glm::ivec3 v = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), v.x, v.y, v.z) + ); + } + else if (type == "IVec4Property") { + glm::ivec4 v = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), v.x, v.y, v.z, v.w) + ); + } + else if (type == "UVec2Property") { + glm::uvec2 v = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), v.x, v.y) + ); + } + else if (type == "UVec3Property") { + glm::uvec3 v = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), v.x, v.y, v.z) + ); + } + else if (type == "UVec4Property") { + glm::uvec4 v = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), v.x, v.y, v.z, v.w) + ); + } + else if (type == "Vec2Property") { + glm::vec2 v = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), v.x, v.y) + ); + } + else if (type == "Vec3Property") { + glm::vec3 v = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), v.x, v.y, v.z) + ); + } + else if (type == "Vec4Property") { + glm::vec4 v = static_cast(_property)->value(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), v.x, v.y, v.z, v.w) + ); + } + else { + // Fallback if we don't have a special case above + + std::string value = _property->stringValue(); + RenderFont( + *_font, + penPosition, + fmt::format(fmt::runtime(_displayString.value()), value) + ); + } + penPosition.y -= _font->height(); } } From b43a13d39e5a251f1de42e898b003cd0fc0b71ef Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 19 Oct 2023 11:59:25 +0200 Subject: [PATCH 151/701] Merge asset.localResource and asset.syncedResource (#2906) --- .../educational/scale/arc_de_triomphe.asset | 2 +- data/assets/educational/scale/big_ben.asset | 2 +- .../educational/scale/burj_khalifa.asset | 2 +- .../educational/scale/eiffeltower.asset | 2 +- .../scale/empire_state_building.asset | 2 +- .../educational/scale/gateway_arch.asset | 2 +- .../scale/golden_gate_bridge.asset | 2 +- .../scale/kuala_lumpur_tower.asset | 2 +- data/assets/educational/scale/rose_bowl.asset | 2 +- .../assets/educational/scale/school_bus.asset | 2 +- data/assets/educational/scale/scientist.asset | 2 +- .../educational/scale/statue_of_liberty.asset | 2 +- data/assets/examples/animation.asset | 2 +- data/assets/examples/approachevents.asset | 2 +- .../assets/examples/galaxyshader/volume.asset | 4 +- .../geojson_extruded_shaded_polygon.asset | 2 +- .../examples/geojson/geojson_lines.asset | 2 +- .../geojson/geojson_multiple_polygons.asset | 2 +- .../examples/geojson/geojson_points.asset | 2 +- .../geojson/geojson_points_outfacing.asset | 2 +- .../geojson/geojson_polygons_with_holes.asset | 2 +- .../examples/geojson/geojson_roverpath.asset | 2 +- .../geojson_toronto_neighborhoods.asset | 2 +- data/assets/examples/globerotation.asset | 2 +- data/assets/examples/globetranslation.asset | 2 +- .../examples/modelshader/modelshader.asset | 6 +- .../examples/temperature_land_highres.asset | 2 +- data/assets/examples/urlsynchronization.asset | 10 +- data/assets/examples/video/videoglobe.asset | 2 +- data/assets/examples/video/videoplane.asset | 2 +- .../examples/video/videoscreenspace.asset | 2 +- data/assets/examples/video/videosphere.asset | 2 +- .../examples/video/videostretchedtotime.asset | 2 +- .../examples/volume/generated/cartesian.asset | 4 +- .../volume/generated/cartesiansequence.asset | 4 +- .../examples/volume/generated/spherical.asset | 4 +- data/assets/global/openspacebookmarks.asset | 2 +- data/assets/gui/images.asset | 6 +- .../modules/exoplanets/exoplanets_data.asset | 4 +- .../exoplanets/exoplanets_textures.asset | 4 +- .../modules/skybrowser/hover_circle.asset | 2 +- .../assets/nightsky/cardinal_directions.asset | 2 +- data/assets/nightsky/ecliptic_band.asset | 2 +- data/assets/nightsky/light_pollution.asset | 2 +- data/assets/nightsky/planets.asset | 2 +- data/assets/nightsky/zenith.asset | 2 +- data/assets/scene/digitaluniverse/2dF.asset | 4 +- data/assets/scene/digitaluniverse/2mass.asset | 4 +- data/assets/scene/digitaluniverse/6dF.asset | 4 +- data/assets/scene/digitaluniverse/abell.asset | 4 +- .../digitaluniverse/alternatestarlabels.asset | 2 +- .../digitaluniverse/backgroundradiation.asset | 4 +- .../backgroundradiation_multiverse.asset | 2 +- .../scene/digitaluniverse/clusters.asset | 2 +- .../digitaluniverse/constellationbounds.asset | 2 +- .../digitaluniverse/constellations.asset | 2 +- .../scene/digitaluniverse/deepsky.asset | 4 +- .../assets/scene/digitaluniverse/dwarfs.asset | 4 +- .../scene/digitaluniverse/exoplanets.asset | 4 +- .../exoplanets_candidates.asset | 4 +- .../digitaluniverse/globularclusters.asset | 4 +- data/assets/scene/digitaluniverse/grids.asset | 2 +- .../assets/scene/digitaluniverse/groups.asset | 2 +- .../scene/digitaluniverse/h2regions.asset | 4 +- data/assets/scene/digitaluniverse/hdf.asset | 6 +- .../scene/digitaluniverse/localdwarfs.asset | 4 +- .../scene/digitaluniverse/milkyway.asset | 4 +- .../digitaluniverse/milkyway_arm_labels.asset | 4 +- .../digitaluniverse/milkyway_label.asset | 2 +- .../digitaluniverse/milkyway_sphere.asset | 2 +- .../digitaluniverse/obassociations.asset | 4 +- .../scene/digitaluniverse/openclusters.asset | 4 +- .../digitaluniverse/planetarynebulae.asset | 4 +- .../scene/digitaluniverse/pulsars.asset | 4 +- .../scene/digitaluniverse/quasars.asset | 6 +- data/assets/scene/digitaluniverse/sdss.asset | 4 +- .../scene/digitaluniverse/starlabels.asset | 2 +- .../scene/digitaluniverse/starorbits.asset | 2 +- data/assets/scene/digitaluniverse/stars.asset | 8 +- .../scene/digitaluniverse/superclusters.asset | 4 +- .../digitaluniverse/supernovaremnants.asset | 4 +- data/assets/scene/digitaluniverse/tully.asset | 4 +- data/assets/scene/digitaluniverse/voids.asset | 2 +- .../constellations/constellation_art.asset | 6 +- data/assets/scene/milkyway/gaia/apogee.asset | 6 +- .../gaia/gaia_dr2_download_stars.asset | 4 +- .../scene/milkyway/gaia/gaiastars.asset | 6 +- data/assets/scene/milkyway/gaia/galah.asset | 6 +- .../habitable_zone_textures.asset | 2 +- data/assets/scene/milkyway/milkyway/eso.asset | 2 +- .../scene/milkyway/milkyway/volume.asset | 2 +- .../objects/orionnebula/cluster.asset | 2 +- .../milkyway/objects/orionnebula/nebula.asset | 2 +- data/assets/scene/milkyway/stars/denver.asset | 6 +- .../dwarf_planets/ceres/kernels.asset | 2 +- .../ceres/layers/colorlayers/lamo.asset | 2 +- .../ceres/layers/colorlayers/lamo_local.asset | 2 +- .../dwarf_planets/eris/planet.asset | 2 +- .../dwarf_planets/haumea/planet.asset | 2 +- .../dwarf_planets/makemake/planet.asset | 2 +- .../dwarf_planets/pluto/charon/charon.asset | 2 +- .../dwarf_planets/pluto/kernels.asset | 2 +- .../dwarf_planets/pluto/pluto.asset | 2 +- .../dwarf_planets/vesta/planet.asset | 2 +- .../sun_earth_2012_fieldlines_batsrus.asset | 4 +- .../sun_earth_2012_fieldlines_enlil.asset | 4 +- .../2012/sun_earth_2012_fieldlines_pfss.asset | 4 +- .../bastille_day/density_volume.asset | 4 +- .../heliosphere/bastille_day/fieldlines.asset | 6 +- .../heliosphere/bastille_day/fluxnodes.asset | 4 +- .../bastille_day/fluxnodescutplane.asset | 4 +- .../bastille_day/fluxnodeslegend.asset | 2 +- .../bastille_day/magnetogram.asset | 2 +- .../interstellar/c-2019_q4_borisov.asset | 2 +- .../solarsystem/interstellar/oumuamua.asset | 2 +- .../missions/apollo/11/apollo11.asset | 4 +- .../missions/apollo/11/kernels.asset | 2 +- .../solarsystem/missions/apollo/11/lem.asset | 2 +- .../missions/apollo/11/lem_flipbook.asset | 2 +- .../missions/apollo/15/apollo15.asset | 2 +- .../missions/apollo/15/kernels.asset | 2 +- .../missions/apollo/17/bouldersstation2.asset | 2 +- .../missions/apollo/17/bouldersstation6.asset | 2 +- .../missions/apollo/17/bouldersstation7.asset | 2 +- .../solarsystem/missions/apollo/17/lem.asset | 2 +- .../missions/apollo/8/kernels.asset | 2 +- .../missions/apollo/8/launch_model.asset | 2 +- .../solarsystem/missions/apollo/8/model.asset | 2 +- .../apollo/apollo_globebrowsing.asset | 8 +- .../missions/apollo/insignias_map.asset | 2 +- .../solarsystem/missions/artemis/model.asset | 2 +- .../solarsystem/missions/artemis/trail.asset | 2 +- .../missions/artemis/transforms.asset | 2 +- .../solarsystem/missions/dawn/dawn.asset | 6 +- .../solarsystem/missions/dawn/vesta.asset | 8 +- .../solarsystem/missions/insight/edl.asset | 4 +- .../missions/juice/fieldlines.asset | 4 +- .../solarsystem/missions/juice/kernels.asset | 2 +- .../solarsystem/missions/juice/model.asset | 2 +- .../solarsystem/missions/juice/plane.asset | 2 +- .../solarsystem/missions/juno/juno.asset | 2 +- .../solarsystem/missions/juno/kernels.asset | 2 +- .../missions/messenger/kernels.asset | 2 +- .../messenger/mercurymagnetosphere.asset | 2 +- .../missions/messenger/messenger.asset | 2 +- .../missions/newhorizons/charon.asset | 2 +- .../missions/newhorizons/kernels.asset | 2 +- .../missions/newhorizons/label.asset | 2 +- .../missions/newhorizons/model.asset | 2 +- .../missions/newhorizons/othermoons.asset | 8 +- .../missions/newhorizons/pluto.asset | 8 +- .../missions/osirisrex/bennu.asset | 2 +- .../missions/osirisrex/bennu_projection.asset | 6 +- .../missions/osirisrex/imageplane.asset | 2 +- .../missions/osirisrex/kernels.asset | 2 +- .../missions/osirisrex/model.asset | 2 +- .../missions/perseverance/model.asset | 2 +- .../missions/perseverance/spice.asset | 2 +- .../missions/pioneer/pioneer10.asset | 2 +- .../missions/pioneer/pioneer11.asset | 2 +- .../missions/pioneer/pioneermodel.asset | 2 +- .../solarsystem/missions/rosetta/67p.asset | 6 +- .../missions/rosetta/rosetta.asset | 4 +- .../missions/voyager/voyager1.asset | 4 +- .../missions/voyager/voyager2.asset | 4 +- .../voyager1_2__pioneer10_11.asset | 4 +- .../solarsystem/planets/earth/earth.asset | 2 +- .../eclipses/corona/corona20170821.asset | 2 +- .../earth/eclipses/paths/annular_data.asset | 2 +- .../earth/eclipses/paths/hybrid_data.asset | 2 +- .../earth/eclipses/paths/total_data.asset | 2 +- .../planets/earth/lagrange_points/l1.asset | 4 +- .../planets/earth/lagrange_points/l2.asset | 4 +- .../planets/earth/lagrange_points/l4.asset | 4 +- .../planets/earth/lagrange_points/l5.asset | 4 +- .../layers/colorlayers/blue_marble.asset | 2 +- .../layers/colorlayers/bmng_newyork.asset | 2 +- .../layers/colorlayers/bmng_sweden.asset | 2 +- .../earth/layers/colorlayers/bmng_utah.asset | 2 +- .../colorlayers/esri_noaa20_combo.asset | 2 +- .../layers/colorlayers/esri_viirs_combo.asset | 2 +- .../colorlayers/esri_world_imagery.asset | 2 +- .../heightlayers/blue_marble_height.asset | 2 +- .../layers/heightlayers/terrain_tileset.asset | 2 +- .../nightlayers/earth_at_night_2012.asset | 2 +- .../nightlayers/earth_night_texture.asset | 2 +- .../earth/layers/overlays/coastlines.asset | 2 +- .../layers/overlays/reference_features.asset | 2 +- .../layers/overlays/reference_labels.asset | 2 +- .../layers/watermasks/gebco_newyork.asset | 2 +- .../layers/watermasks/gebco_sweden.asset | 2 +- .../earth/layers/watermasks/gebco_utah.asset | 2 +- .../layers/watermasks/modis_water_mask.asset | 2 +- .../earth/magnetosphere/magnetosphere.asset | 4 +- .../transforms_magnetosphere.asset | 2 +- .../solarsystem/planets/earth/markers.asset | 2 +- .../apollo_15_metric_newyork.asset | 2 +- .../colorlayers/clemuvvis_newyork.asset | 2 +- .../layers/colorlayers/clemuvvis_sweden.asset | 2 +- .../layers/colorlayers/clemuvvis_utah.asset | 2 +- .../layers/colorlayers/kaguya_newyork.asset | 2 +- .../layers/colorlayers/kaguya_sweden.asset | 2 +- .../moon/layers/colorlayers/kaguya_utah.asset | 2 +- .../colorlayers/lo_mr_mosaic_newyork.asset | 2 +- .../colorlayers/lo_mr_mosaic_sweden.asset | 2 +- .../colorlayers/lola_clr_shade_newyork.asset | 2 +- .../colorlayers/lola_clr_shade_sweden.asset | 2 +- .../colorlayers/lola_clr_shade_utah.asset | 2 +- .../colorlayers/lola_shade_newyork.asset | 2 +- .../colorlayers/lola_shade_sweden.asset | 2 +- .../layers/colorlayers/lola_shade_utah.asset | 2 +- .../layers/colorlayers/moon_texture.asset | 2 +- .../colorlayers/uvvishybrid_newyork.asset | 2 +- .../colorlayers/uvvishybrid_sweden.asset | 2 +- .../layers/colorlayers/uvvishybrid_utah.asset | 2 +- .../moon/layers/colorlayers/wac_newyork.asset | 2 +- .../moon/layers/colorlayers/wac_sweden.asset | 2 +- .../moon/layers/colorlayers/wac_utah.asset | 2 +- .../layers/colorlayers/wac_v1_newyork.asset | 2 +- .../layers/colorlayers/wac_v1_sweden.asset | 2 +- .../moon/layers/colorlayers/wac_v1_utah.asset | 2 +- .../layers/heightlayers/loladem_newyork.asset | 2 +- .../layers/heightlayers/loladem_sweden.asset | 2 +- .../layers/heightlayers/loladem_utah.asset | 2 +- .../planets/earth/moon/markers.asset | 2 +- .../solarsystem/planets/earth/moon/moon.asset | 2 +- .../nasa-treks/Apollo_15_Metric_Cam_DEM.asset | 8 +- .../nasa-treks/Apollo_15_Pan_Cam_DEM.asset | 6 +- .../Apollo_15_Pan_Cam_Image_Mosaic.asset | 6 +- .../nasa-treks/Apollo_16_Metric_Cam_DEM.asset | 6 +- .../nasa-treks/Apollo_17_Metric_Cam_DEM.asset | 4 +- .../nasa-treks/Apollo_Zone_Metric_Cam.asset | 2 +- .../Apollo_Zone_Metric_Cam_DEM.asset | 2 +- .../earth/moon/nasa-treks/Global.asset | 38 +++--- .../Kaguya_LGM2011_Freeair_Gravity.asset | 4 +- .../Kaguya_LGM2011_Surface_Gravity.asset | 4 +- .../nasa-treks/LOLA_Roughness_16ppd.asset | 2 +- .../moon/nasa-treks/LOLA_Slope_16ppd.asset | 2 +- .../LOLA_Slope_Northpole_120m.asset | 2 +- .../LOLA_Slope_Southpole_120m.asset | 2 +- .../LOLA_and_TC_Stereo_DEM_Merge_512ppd.asset | 2 +- ..._of_Region_Inside_Schrodinger_Crater.asset | 2 +- ...trolled_Mosaic_of_Schrodinger_Crater.asset | 2 +- .../nasa-treks/LRO_Diviner_CF_Mosaic.asset | 2 +- .../LRO_Diviner_CF_Mosaic_128ppd.asset | 2 +- .../LRO_Diviner_Surface_Temp_Avg.asset | 2 +- .../LRO_Diviner_Surface_Temp_Normal_Avg.asset | 2 +- ...er_Surface_Temperature_Mosaic_128ppd.asset | 2 +- .../earth/moon/nasa-treks/LRO_LOLA_DEM.asset | 14 +- .../LRO_LROC_Crater_Abundance.asset | 46 +++---- .../LRO_LROC_Crater_Abundance_Hazard.asset | 46 +++---- .../nasa-treks/LRO_LROC_Crater_Density.asset | 46 +++---- .../LRO_LROC_Crater_Density_Hazard.asset | 46 +++---- .../earth/moon/nasa-treks/LRO_LROC_DEM.asset | 86 ++++++------ .../nasa-treks/LRO_LROC_Image_Mosaic.asset | 68 +++++----- .../LRO_LROC_Image_Mosaic_26cm.asset | 2 +- .../LRO_LROC_Image_Mosaic_28cm.asset | 2 +- .../moon/nasa-treks/LRO_LROC_Mosaic.asset | 2 +- .../LRO_LROC_NAC_Image_Mosaic.asset | 4 +- .../nasa-treks/LRO_LROC_Rock_Abundance.asset | 46 +++---- .../LRO_LROC_Rock_Abundance_Hazard.asset | 46 +++---- .../nasa-treks/LRO_LROC_Rock_Density.asset | 48 +++---- .../LRO_LROC_Rock_Density_Hazard.asset | 44 +++--- .../moon/nasa-treks/LRO_Laser_Altimeter.asset | 2 +- ..._Mini-RF_Circular_Polarization_Ratio.asset | 2 +- .../nasa-treks/LRO_NAC_ColorHillshade.asset | 2 +- .../moon/nasa-treks/LRO_NAC_Mosaic.asset | 2 +- .../nasa-treks/LRO_NAC_Mosaic_0.5mpp.asset | 2 +- .../moon/nasa-treks/LRO_NAC_Mosaic_1mpp.asset | 2 +- .../nasa-treks/LRO_NAC_PSR_Mosaic_20mpp.asset | 4 +- .../LRO_NAC_and_CE-2_CCD_Mosaic_1mpp.asset | 2 +- .../nasa-treks/LRO_Narrow_Angle_Camera.asset | 50 +++---- .../moon/nasa-treks/LRO_WAC-GLD100_DEM.asset | 2 +- .../moon/nasa-treks/LRO_WAC_GLD100_DEM.asset | 4 +- ..._Kaguya_Multi_Instruments_1895.21mpp.asset | 10 +- .../atmosphere/2000_carbon_monoxide.asset | 2 +- .../atmosphere/2004_ir_hurricane.asset | 2 +- .../atmosphere/2005_hurricane-grayir.asset | 2 +- .../atmosphere/2005_hurricane-wvsst.asset | 2 +- .../noaa-sos/atmosphere/2012_hurricane.asset | 2 +- .../atmosphere/aerosol_blackcarbon.asset | 2 +- .../aerosol_blackcarbon_and_sulfate.asset | 2 +- .../noaa-sos/atmosphere/aerosol_sulfate.asset | 2 +- .../noaa-sos/atmosphere/airtraffic.asset | 2 +- .../earth/noaa-sos/atmosphere/all_sats.asset | 2 +- .../noaa-sos/atmosphere/aqua_swath.asset | 2 +- .../noaa-sos/atmosphere/carbonflux.asset | 2 +- .../carbontracker_2000_2100-fixed_scale.asset | 2 +- ...arbontracker_2000_2100-sliding_scale.asset | 2 +- .../noaa-sos/atmosphere/climate_niche.asset | 2 +- .../earth/noaa-sos/atmosphere/co_gmd.asset | 2 +- .../earth/noaa-sos/atmosphere/fim_chem.asset | 2 +- .../noaa-sos/atmosphere/fossil_fuel.asset | 2 +- .../earth/noaa-sos/atmosphere/fukushima.asset | 2 +- .../earth/noaa-sos/atmosphere/geo_sat.asset | 2 +- .../earth/noaa-sos/atmosphere/geo_scan.asset | 2 +- .../noaa-sos/atmosphere/giss_temp_anom.asset | 2 +- .../atmosphere/globe-insolation.asset | 2 +- .../noaa-sos/atmosphere/globe-rainfall.asset | 2 +- .../atmosphere/harvey-clouds_precip.asset | 2 +- .../atmosphere/hurricane_season_2017.asset | 2 +- .../hurricane_season_2017_wvsst.asset | 2 +- .../hurricane_tracks-cumulative.asset | 2 +- .../earth/noaa-sos/atmosphere/isaac.asset | 2 +- .../earth/noaa-sos/atmosphere/iss_track.asset | 2 +- .../earth/noaa-sos/atmosphere/land_temp.asset | 2 +- .../earth/noaa-sos/atmosphere/lightning.asset | 2 +- .../noaa-sos/atmosphere/ltg_vaisala.asset | 2 +- .../earth/noaa-sos/atmosphere/nasa_sats.asset | 2 +- .../atmosphere/nccs_models-carbon.asset | 2 +- .../atmosphere/nccs_models-chem.asset | 2 +- .../atmosphere/nccs_models-winds.asset | 2 +- .../earth/noaa-sos/atmosphere/no2_omsi.asset | 2 +- .../noaa-sos/atmosphere/noaa_sat-tracks.asset | 2 +- .../earth/noaa-sos/atmosphere/pclim.asset | 2 +- .../earth/noaa-sos/atmosphere/poes_sat.asset | 2 +- .../atmosphere/reanalysis-antarctic.asset | 2 +- .../atmosphere/reanalysis-elnino.asset | 2 +- .../atmosphere/reanalysis-hurricane.asset | 2 +- .../earth/noaa-sos/atmosphere/sandy.asset | 2 +- .../noaa-sos/atmosphere/sunsync_sat.asset | 2 +- .../earth/noaa-sos/atmosphere/temp_anom.asset | 2 +- .../atmosphere/tropical_widening.asset | 2 +- .../atmosphere/typhoon_haiyan-wvsst.asset | 2 +- .../noaa-sos/atmosphere/typhoon_haiyan.asset | 2 +- .../noaa-sos/atmosphere/volcano_ash.asset | 2 +- .../noaa-sos/land/agriculture-cropland.asset | 2 +- .../land/agriculture-pastureland.asset | 2 +- .../planets/earth/noaa-sos/land/birds.asset | 2 +- .../land/blue_marble-blue_marble.asset | 2 +- .../land/blue_marble-blue_marble_topo.asset | 2 +- .../blue_marble-blue_marble_topo_bathy.asset | 2 +- .../land/blue_marble-nightlights.asset | 2 +- .../blue_marble-seasonal_blue_marble.asset | 2 +- .../earth/noaa-sos/land/dams-global.asset | 2 +- .../noaa-sos/land/dams-mississippi.asset | 2 +- .../earth/noaa-sos/land/dams-yangtze.asset | 2 +- .../noaa-sos/land/day_night-06z_only.asset | 2 +- .../noaa-sos/land/day_night-full_year.asset | 2 +- .../noaa-sos/land/day_night-oneday.asset | 2 +- .../noaa-sos/land/earth_night-1992_2002.asset | 2 +- .../noaa-sos/land/earth_night-1992_2008.asset | 2 +- .../noaa-sos/land/earth_night-1992_2009.asset | 2 +- .../noaa-sos/land/earth_night-2012.asset | 2 +- .../land/earth_night-color_nightlights.asset | 2 +- .../land/earth_night-nightlights.asset | 2 +- .../land/earthquake-1980_1995_quakes.asset | 2 +- .../noaa-sos/land/earthquake-2001_2015.asset | 2 +- .../noaa-sos/land/earthquakes_1901_2000.asset | 2 +- .../land/earthquakes_and_eruptions.asset | 2 +- .../earths_magnetism_magnetic_lines.asset | 2 +- .../land/earths_magnetism_magnets.asset | 2 +- .../planets/earth/noaa-sos/land/etopo1.asset | 2 +- .../noaa-sos/land/etopo2-earth_bright.asset | 2 +- .../noaa-sos/land/etopo2-earth_color.asset | 2 +- .../noaa-sos/land/etopo2-earth_shaded.asset | 2 +- .../noaa-sos/land/etopo2-earth_topo.asset | 2 +- .../earth/noaa-sos/land/etopo2-landsat.asset | 2 +- .../planets/earth/noaa-sos/land/fire.asset | 2 +- .../earth/noaa-sos/land/fire_veg.asset | 2 +- .../land/flooding-displaced_250.asset | 2 +- .../earth/noaa-sos/land/flooding-fatal.asset | 2 +- .../noaa-sos/land/flooding-heavy_rain.asset | 2 +- .../noaa-sos/land/flooding-major_floods.asset | 2 +- .../earth/noaa-sos/land/food_v_feed.asset | 2 +- .../planets/earth/noaa-sos/land/forests.asset | 2 +- .../noaa-sos/land/geomag_tracklines.asset | 2 +- .../noaa-sos/land/global_vegetation.asset | 2 +- .../earth/noaa-sos/land/gray_earth.asset | 2 +- .../earth/noaa-sos/land/hot_topo.asset | 2 +- .../noaa-sos/land/irsat_nightlights.asset | 2 +- .../earth/noaa-sos/land/japan_quake.asset | 2 +- .../koppen_climate-koppen_1901_2100.asset | 2 +- .../land/koppen_climate-koppen_2007.asset | 2 +- .../noaa-sos/land/land_cover-animation.asset | 2 +- .../noaa-sos/land/land_cover-ribbon.asset | 2 +- .../noaa-sos/land/land_cover-slideshow.asset | 2 +- .../land_production-cropland_current.asset | 2 +- .../land_production-cropland_potential.asset | 2 +- .../land/land_production-production_gap.asset | 2 +- .../earth/noaa-sos/land/land_ratio.asset | 2 +- .../noaa-sos/land/latitude_longitude.asset | 2 +- .../noaa-sos/land/magnetic_declination.asset | 2 +- .../earth/noaa-sos/land/nightsky.asset | 2 +- .../noaa-sos/land/nuclear_earthquake.asset | 2 +- .../earth/noaa-sos/land/paleo_map.asset | 2 +- .../earth/noaa-sos/land/paleo_overlays.asset | 2 +- .../noaa-sos/land/pantropical_biomass.asset | 2 +- .../earth/noaa-sos/land/plate_movement.asset | 2 +- .../noaa-sos/land/river_discharge_2010.asset | 2 +- .../land/sea_floor_age-iso_lines_yellow.asset | 2 +- .../land/sea_floor_age-shaded_veg.asset | 2 +- .../noaa-sos/land/sea_floor_age-topo.asset | 2 +- .../land/seismic_waves-1994northridge.asset | 2 +- .../land/species_richness-amphibians.asset | 2 +- ...ecies_richness-amphibians_threatened.asset | 2 +- .../land/species_richness-birds.asset | 2 +- .../species_richness-birds_threatened.asset | 2 +- .../land/species_richness-mammals.asset | 2 +- .../species_richness-mammals_threatened.asset | 2 +- .../noaa-sos/land/surface_temperature.asset | 2 +- .../earth/noaa-sos/land/top_quakes.asset | 2 +- .../noaa-sos/land/volcanoes-eruptions.asset | 2 +- .../land/volcanoes-global_volcanoes.asset | 2 +- .../noaa-sos/land/volcanoes-tsunami.asset | 2 +- .../earth/noaa-sos/models/bm10000.asset | 2 +- .../earth/noaa-sos/models/gfdl_seaice.asset | 2 +- .../noaa-sos/models/ipcc_temp-ccsm-a1b.asset | 2 +- .../noaa-sos/models/ipcc_temp-ccsm-b1.asset | 2 +- .../noaa-sos/models/ipcc_temp-compare.asset | 2 +- .../noaa-sos/models/ipcc_temp-gfdl-a1b.asset | 2 +- .../noaa-sos/models/ipcc_temp-gfdl-b1.asset | 2 +- .../noaa-sos/models/ipcc_temp-had-a1b.asset | 2 +- .../noaa-sos/models/ipcc_temp-had-b1.asset | 2 +- .../earth/noaa-sos/models/rcp-ga26.asset | 2 +- .../earth/noaa-sos/models/rcp-ga45.asset | 2 +- .../earth/noaa-sos/models/rcp-ga60.asset | 2 +- .../earth/noaa-sos/models/rcp-ga85.asset | 2 +- .../earth/noaa-sos/models/ukmet-a1b.asset | 2 +- .../earth/noaa-sos/models/ukmet-e1.asset | 2 +- .../noaa-sos/oceans/2009_ice_animation.asset | 2 +- .../oceans/6m_sea_level_rise-black.asset | 2 +- .../oceans/6m_sea_level_rise-red.asset | 2 +- .../noaa-sos/oceans/animal_tracking.asset | 2 +- .../noaa-sos/oceans/argo_buoy_tracks.asset | 2 +- .../noaa-sos/oceans/argo_buoy_waterfall.asset | 2 +- .../earth/noaa-sos/oceans/atl_turtle.asset | 2 +- .../noaa-sos/oceans/buoy_locations.asset | 2 +- .../earth/noaa-sos/oceans/catch_model.asset | 2 +- .../noaa-sos/oceans/chlorophyll_model.asset | 2 +- .../earth/noaa-sos/oceans/currents.asset | 2 +- .../earth/noaa-sos/oceans/dart_buoy.asset | 2 +- .../noaa-sos/oceans/ecco2_sst-gray_land.asset | 2 +- .../noaa-sos/oceans/ecco2_sst-veg_land.asset | 2 +- .../earth/noaa-sos/oceans/elnino.asset | 2 +- .../oceans/gfdl_sst-black_background.asset | 2 +- .../oceans/gfdl_sst-land_background.asset | 2 +- .../noaa-sos/oceans/greenland_melt.asset | 2 +- .../earth/noaa-sos/oceans/japan_tsunami.asset | 2 +- .../noaa-sos/oceans/japan_tsunami_waves.asset | 2 +- .../oceans/loggerheadseaturtletracks.asset | 2 +- .../noaa-sos/oceans/marine_impacts.asset | 2 +- .../oceans/marine_life_tracking.asset | 2 +- .../oceans/mexico_turtles_947293.asset | 2 +- .../oceans/mexico_turtles_958002.asset | 2 +- .../earth/noaa-sos/oceans/modis_sst.asset | 2 +- .../earth/noaa-sos/oceans/nasa_speed.asset | 2 +- .../earth/noaa-sos/oceans/nasa_sst.asset | 2 +- .../noaa-sos/oceans/ocean_acid-co2_flux.asset | 2 +- .../earth/noaa-sos/oceans/ocean_acid-ph.asset | 2 +- .../oceans/ocean_acid-saturation.asset | 2 +- .../noaa-sos/oceans/ocean_depths_temp.asset | 2 +- .../noaa-sos/oceans/ocean_drain-gray.asset | 2 +- .../earth/noaa-sos/oceans/pac_turtle.asset | 2 +- .../earth/noaa-sos/oceans/phytoplankton.asset | 2 +- .../earth/noaa-sos/oceans/pr_tsunami.asset | 2 +- .../earth/noaa-sos/oceans/reefs_risk.asset | 2 +- .../earth/noaa-sos/oceans/sea_level.asset | 2 +- .../noaa-sos/oceans/sea_level_trends.asset | 2 +- .../oceans/sea_surface_height_anomaly.asset | 2 +- .../noaa-sos/oceans/seaice_monthly.asset | 2 +- .../noaa-sos/oceans/seaice_radiation.asset | 2 +- .../oceans/seawifs-land_background.asset | 2 +- .../noaa-sos/oceans/seawifs-no_holes.asset | 2 +- .../noaa-sos/oceans/seawifs-polar_holes.asset | 2 +- .../planets/earth/noaa-sos/oceans/shark.asset | 2 +- .../noaa-sos/oceans/ship_tracks-mosaic.asset | 2 +- .../noaa-sos/oceans/ship_tracks-tracks.asset | 2 +- .../earth/noaa-sos/oceans/shipping.asset | 2 +- .../noaa-sos/oceans/species_richness.asset | 2 +- .../planets/earth/noaa-sos/oceans/sss.asset | 2 +- .../earth/noaa-sos/oceans/sst_1980_1999.asset | 2 +- .../tsunami_historical_series-alaska.asset | 2 +- .../tsunami_historical_series-aleutians.asset | 2 +- ...ami_historical_series-aleutians_1957.asset | 2 +- .../tsunami_historical_series-cascadia.asset | 2 +- .../tsunami_historical_series-chile.asset | 2 +- .../tsunami_historical_series-japan.asset | 2 +- .../tsunami_historical_series-lisbon.asset | 2 +- .../tsunami_historical_series-samoa.asset | 2 +- .../tsunami_historical_series-sumatra.asset | 2 +- .../noaa-sos/oceans/tsunami_locations.asset | 2 +- .../earth/noaa-sos/oceans/vector_winds.asset | 2 +- .../oceans/vent_discoveries_animation.asset | 2 +- .../noaa-sos/oceans/vent_locations.asset | 2 +- .../earth/noaa-sos/oceans/vorticity.asset | 2 +- .../oceans/waves-wave_height_2012.asset | 2 +- .../oceans/waves-wave_height_katrina.asset | 2 +- .../oceans/waves-wave_height_sandy.asset | 2 +- .../oceans/waves-wave_power_2012.asset | 2 +- .../oceans/weeklyseaice-10day_seaice.asset | 2 +- .../oceans/weeklyseaice-sept_seaice.asset | 2 +- .../earth/noaa-sos/overlays/cables.asset | 2 +- .../earth/noaa-sos/overlays/capitals.asset | 2 +- .../earth/noaa-sos/overlays/city_names.asset | 2 +- .../overlays/continent_borders-black.asset | 2 +- .../overlays/continent_borders-white.asset | 2 +- .../noaa-sos/overlays/continent_names.asset | 2 +- .../overlays/country_borders-black.asset | 2 +- .../overlays/country_borders-white.asset | 2 +- .../noaa-sos/overlays/country_pop_names.asset | 2 +- .../earth/noaa-sos/overlays/currents.asset | 2 +- .../overlays/general_circulation.asset | 2 +- .../noaa-sos/overlays/land_mask-black.asset | 2 +- .../noaa-sos/overlays/land_mask-veg.asset | 2 +- .../noaa-sos/overlays/latlon_grid-black.asset | 2 +- .../noaa-sos/overlays/latlon_grid-white.asset | 2 +- .../earth/noaa-sos/overlays/ocean_names.asset | 2 +- .../overlays/plate_boundary-color.asset | 2 +- .../overlays/plate_boundary-white.asset | 2 +- .../earth/noaa-sos/overlays/plate_names.asset | 2 +- .../earth/noaa-sos/overlays/railroad.asset | 2 +- .../earth/noaa-sos/overlays/rivers.asset | 2 +- .../earth/noaa-sos/overlays/roads-black.asset | 2 +- .../earth/noaa-sos/overlays/roads-white.asset | 2 +- .../overlays/state_borders-black.asset | 2 +- .../overlays/state_borders-white.asset | 2 +- .../earth/noaa-sos/overlays/timezones.asset | 2 +- .../satellites/communications/amateur.asset | 2 +- .../communications/experimental.asset | 2 +- .../communications/geostationary.asset | 2 +- .../communications/globalstar.asset | 2 +- .../satellites/communications/gorizont.asset | 2 +- .../satellites/communications/intelsat.asset | 2 +- .../satellites/communications/iridium.asset | 2 +- .../communications/iridium_next.asset | 2 +- .../satellites/communications/molniya.asset | 2 +- .../satellites/communications/orbcomm.asset | 2 +- .../communications/other_comm.asset | 2 +- .../satellites/communications/raduga.asset | 2 +- .../earth/satellites/communications/ses.asset | 2 +- .../satellites/communications/starlink.asset | 2 +- .../earth/satellites/debris/debris_asat.asset | 2 +- .../satellites/debris/debris_breezem.asset | 2 +- .../satellites/debris/debris_fengyun.asset | 2 +- .../satellites/debris/debris_iridium33.asset | 2 +- .../satellites/debris/debris_kosmos2251.asset | 2 +- .../debris/volume/cartesian_volume.asset | 4 +- .../debris/volume/spherical_volume.asset | 4 +- .../earth/satellites/misc/active.asset | 2 +- .../earth/satellites/misc/brightest.asset | 2 +- .../earth/satellites/misc/cubesats.asset | 2 +- .../earth/satellites/misc/hubble_trail.asset | 2 +- .../planets/earth/satellites/misc/iss.asset | 4 +- .../earth/satellites/misc/military.asset | 2 +- .../planets/earth/satellites/misc/other.asset | 2 +- .../planets/earth/satellites/misc/radar.asset | 2 +- .../earth/satellites/misc/spacestations.asset | 2 +- .../earth/satellites/misc/tle-new.asset | 2 +- .../earth/satellites/navigation/beidou.asset | 2 +- .../earth/satellites/navigation/galileo.asset | 2 +- .../satellites/navigation/glosnass.asset | 2 +- .../earth/satellites/navigation/gps.asset | 2 +- .../earth/satellites/navigation/musson.asset | 2 +- .../earth/satellites/navigation/nnss.asset | 2 +- .../earth/satellites/navigation/sbas.asset | 2 +- .../earth/satellites/science/education.asset | 2 +- .../satellites/science/engineering.asset | 2 +- .../earth/satellites/science/geodetic.asset | 2 +- .../earth/satellites/science/spaceearth.asset | 2 +- .../earth/satellites/weather/aqua.asset | 2 +- .../earth/satellites/weather/argos.asset | 2 +- .../earth/satellites/weather/dmc.asset | 2 +- .../satellites/weather/earth_resources.asset | 2 +- .../earth/satellites/weather/goes.asset | 2 +- .../earth/satellites/weather/noaa.asset | 2 +- .../earth/satellites/weather/planet.asset | 2 +- .../earth/satellites/weather/sarsat.asset | 2 +- .../earth/satellites/weather/snpp.asset | 2 +- .../earth/satellites/weather/spire.asset | 2 +- .../earth/satellites/weather/tdrss.asset | 2 +- .../earth/satellites/weather/terra.asset | 2 +- .../earth/satellites/weather/weather.asset | 2 +- .../planets/jupiter/callisto/callisto.asset | 2 +- .../layers/colorlayers/callisto_texture.asset | 2 +- .../planets/jupiter/europa/europa.asset | 2 +- .../layers/colorlayers/europa_texture.asset | 2 +- .../voyager_global_mosaic_local.asset | 2 +- .../voyager_global_mosaic_newyork.asset | 2 +- .../voyager_global_mosaic_sweden.asset | 2 +- .../planets/jupiter/ganymede/ganymede.asset | 2 +- .../layers/colorlayers/ganymede_texture.asset | 2 +- .../solarsystem/planets/jupiter/io/io.asset | 2 +- .../io/layers/colorlayers/io_texture.asset | 2 +- .../solarsystem/planets/jupiter/kernels.asset | 2 +- .../layers/colorlayers/jupiter_texture.asset | 2 +- .../layers/colorlayers/jupiter_video.asset | 2 +- .../mars/layers/colorlayers/ctx_blended.asset | 2 +- .../colorlayers/ctx_blended_beta01.asset | 2 +- .../colorlayers/ctx_mosaic_newyork.asset | 2 +- .../colorlayers/ctx_mosaic_sweden.asset | 2 +- .../layers/colorlayers/ctx_mosaic_utah.asset | 2 +- .../mars/layers/colorlayers/hirise.asset | 2 +- .../mars/layers/colorlayers/hirisels.asset | 2 +- .../layers/colorlayers/mars_texture.asset | 2 +- .../colorlayers/moc_wa_color_newyork.asset | 2 +- .../colorlayers/moc_wa_color_sweden.asset | 2 +- .../colorlayers/moc_wa_color_utah.asset | 2 +- .../colorlayers/mola_hrsc_newyork.asset | 2 +- .../layers/colorlayers/mola_hrsc_sweden.asset | 2 +- .../layers/colorlayers/mola_hrsc_utah.asset | 2 +- .../mola_pseudo_color_newyork.asset | 2 +- .../mola_pseudo_color_sweden.asset | 2 +- .../colorlayers/mola_pseudo_color_utah.asset | 2 +- .../colorlayers/themis_ir_day_newyork.asset | 2 +- .../colorlayers/themis_ir_day_sweden.asset | 2 +- .../colorlayers/themis_ir_day_utah.asset | 2 +- .../colorlayers/themis_ir_night_newyork.asset | 2 +- .../colorlayers/themis_ir_night_sweden.asset | 2 +- .../colorlayers/themis_ir_night_utah.asset | 2 +- .../colorlayers/viking_mdim_newyork.asset | 2 +- .../colorlayers/viking_mdim_sweden.asset | 2 +- .../layers/colorlayers/viking_mdim_utah.asset | 2 +- .../mars/layers/heightlayers/hirisels.asset | 2 +- .../mars/layers/heightlayers/mdem200m.asset | 2 +- .../mars/layers/heightlayers/mola_amnh.asset | 2 +- .../layers/heightlayers/mola_sweden.asset | 2 +- .../mars/layers/heightlayers/mola_utah.asset | 2 +- .../mars/layers/nasa-treks/MEX_HRSC.asset | 4 +- .../layers/nasa-treks/MGS_MOC_Atlas.asset | 2 +- .../mars/layers/nasa-treks/MGS_MOLA.asset | 6 +- .../MGS_MOLA_and_Mars_Express_HRSC.asset | 4 +- .../mars/layers/nasa-treks/MGS_TES.asset | 12 +- .../layers/nasa-treks/MO_THEMIS-IR_Day.asset | 2 +- .../nasa-treks/MO_THEMIS-IR_Night.asset | 2 +- .../mars/layers/nasa-treks/MRO_CTX.asset | 98 +++++++------- .../mars/layers/nasa-treks/MRO_HiRISE.asset | 42 +++--- .../planets/mars/layers/nasa-treks/MSL.asset | 2 +- .../layers/nasa-treks/Mars_Express_HRSC.asset | 14 +- .../Mars_Reconnaissance_Orbiter_CTX.asset | 126 +++++++++--------- .../scene/solarsystem/planets/mars/mars.asset | 2 +- .../planets/mars/moons/deimos.asset | 4 +- .../planets/mars/moons/deimos_globe.asset | 2 +- .../planets/mars/moons/phobos.asset | 4 +- .../planets/mars/moons/phobos_globe.asset | 2 +- .../layers/colorlayers/alsimap_02122015.asset | 2 +- .../layers/colorlayers/casimap_02122015.asset | 2 +- .../layers/colorlayers/fesimap_02122015.asset | 2 +- .../layers/colorlayers/mercury_texture.asset | 2 +- .../colorlayers/messenger_bdr_newyork.asset | 2 +- .../colorlayers/messenger_bdr_sweden.asset | 2 +- .../colorlayers/messenger_bdr_utah.asset | 2 +- .../colorlayers/messenger_hie_newyork.asset | 2 +- .../colorlayers/messenger_hie_sweden.asset | 2 +- .../colorlayers/messenger_hie_utah.asset | 2 +- .../colorlayers/messenger_hiw_newyork.asset | 2 +- .../colorlayers/messenger_hiw_sweden.asset | 2 +- .../colorlayers/messenger_hiw_utah.asset | 2 +- .../colorlayers/messenger_loi_newyork.asset | 2 +- .../colorlayers/messenger_loi_sweden.asset | 2 +- .../colorlayers/messenger_loi_utah.asset | 2 +- .../colorlayers/messenger_mdis_newyork.asset | 2 +- .../colorlayers/messenger_mdis_sweden.asset | 2 +- .../colorlayers/messenger_mdis_utah.asset | 2 +- .../colorlayers/messenger_mdr_utah.asset | 2 +- .../messenger_mosaic2_newyork.asset | 2 +- .../messenger_mosaic2_sweden.asset | 2 +- .../colorlayers/messenger_mosaic2_utah.asset | 2 +- .../messenger_mosaic_newyork.asset | 2 +- .../colorlayers/messenger_mosaic_sweden.asset | 2 +- .../colorlayers/messenger_mosaic_utah.asset | 2 +- .../colorlayers/messenger_mp3_utah.asset | 2 +- .../colorlayers/messenger_shade_newyork.asset | 2 +- .../colorlayers/messenger_shade_sweden.asset | 2 +- .../colorlayers/messenger_shade_utah.asset | 2 +- .../layers/colorlayers/mgsimap_02122015.asset | 2 +- .../layers/colorlayers/ssimap_02122015.asset | 2 +- .../heightlayers/messenger_dem_utah.asset | 2 +- .../mercury/layers/nasa-treks/MSGR_MDIS.asset | 6 +- .../layers/nasa-treks/MSGR_MDIS_Mosaic.asset | 20 +-- .../layers/nasa-treks/MSGR_MDIS_Slope.asset | 20 +-- .../solarsystem/planets/mercury/mercury.asset | 2 +- .../solarsystem/planets/neptune/kernels.asset | 2 +- .../layers/colorlayers/neptune_texture.asset | 2 +- ...n_voyager2_clrmosaic_globalfill_600m.asset | 2 +- .../planets/saturn/dione/dione.asset | 2 +- .../layers/colorlayers/dione_texture.asset | 2 +- .../planets/saturn/enceladus/enceladus.asset | 2 +- .../colorlayers/enceladus_texture.asset | 2 +- .../global_mosaic_100m_hpf_newyork.asset | 2 +- .../global_mosaic_100m_hpf_sweden.asset | 2 +- .../planets/saturn/hyperion/hyperion.asset | 2 +- .../planets/saturn/iapetus/iapetus.asset | 2 +- .../layers/colorlayers/iapetus_texture.asset | 2 +- .../solarsystem/planets/saturn/kernels.asset | 2 +- .../layers/colorlayers/saturn_texture.asset | 2 +- .../layers/colorlayers/mimas_texture.asset | 2 +- .../planets/saturn/mimas/mimas.asset | 2 +- .../planets/saturn/minor/shepherd_group.asset | 2 +- .../layers/colorlayers/rhea_texture.asset | 2 +- .../planets/saturn/rhea/rhea.asset | 2 +- .../solarsystem/planets/saturn/saturn.asset | 2 +- .../layers/colorlayers/tethys_texture.asset | 2 +- .../planets/saturn/tethys/tethys.asset | 2 +- .../cassini_iss_global_mosaic_4km_local.asset | 2 +- ...assini_iss_global_mosaic_4km_newyork.asset | 2 +- ...cassini_iss_global_mosaic_4km_sweden.asset | 2 +- .../planets/saturn/titan/titan.asset | 2 +- .../solarsystem/planets/uranus/kernels.asset | 2 +- .../layers/colorlayers/uranus_texture.asset | 2 +- .../colorlayers/clouds_magellan_combo.asset | 4 +- .../clouds_magellan_combo_newyork.asset | 4 +- .../colorlayers/magellan_mosaic_newyork.asset | 2 +- .../colorlayers/magellan_mosaic_utah.asset | 2 +- .../layers/colorlayers/venus_texture.asset | 2 +- .../heightlayers/magellan_newyork.asset | 2 +- .../layers/heightlayers/magellan_utah.asset | 2 +- .../solarsystem/planets/venus/venus.asset | 2 +- .../solarsystem/sssb/amor_asteroid.asset | 2 +- .../solarsystem/sssb/apollo_asteroid.asset | 2 +- .../scene/solarsystem/sssb/astraea.asset | 2 +- .../solarsystem/sssb/aten_asteroid.asset | 2 +- .../solarsystem/sssb/atira_asteroid.asset | 2 +- .../scene/solarsystem/sssb/c2019y4atlas.asset | 2 +- .../solarsystem/sssb/centaur_asteroid.asset | 2 +- .../solarsystem/sssb/chiron-type_comet.asset | 2 +- .../solarsystem/sssb/encke-type_comet.asset | 2 +- .../solarsystem/sssb/halley-type_comet.asset | 2 +- .../sssb/inner_main_belt_asteroid.asset | 2 +- .../scene/solarsystem/sssb/itokawa.asset | 4 +- .../sssb/jupiter-family_comet.asset | 2 +- .../sssb/jupiter_trojan_asteroid.asset | 2 +- .../solarsystem/sssb/main_belt_asteroid.asset | 2 +- .../sssb/mars-crossing_asteroid.asset | 2 +- .../sssb/outer_main_belt_asteroid.asset | 2 +- data/assets/scene/solarsystem/sssb/pha.asset | 2 +- .../scene/solarsystem/sssb/swifttuttle.asset | 2 +- .../solarsystem/sssb/tesla_roadster.asset | 2 +- .../sssb/transneptunian_object_asteroid.asset | 2 +- .../scene/solarsystem/sun/EUV_layer.asset | 2 +- data/assets/scene/solarsystem/sun/glare.asset | 2 +- .../sun/layers/colorlayers/sun_texture.asset | 2 +- .../assets/scene/solarsystem/sun/marker.asset | 2 +- .../sun/transforms_heliosphere.asset | 2 +- .../solarsystem/telescopes/gaia/gaia.asset | 2 +- .../solarsystem/telescopes/gaia/trail.asset | 2 +- .../telescopes/gaia/transforms.asset | 2 +- .../solarsystem/telescopes/jwst/jwst.asset | 4 +- .../telescopes/jwst/targets/crab_image.asset | 2 +- .../jwst/targets/hd84406_image.asset | 2 +- .../telescopes/jwst/targets/hh212_image.asset | 2 +- .../telescopes/jwst/targets/hudf_image.asset | 2 +- .../telescopes/jwst/targets/m51_image.asset | 2 +- .../telescopes/jwst/targets/m82_image.asset | 2 +- .../telescopes/jwst/targets/orion_image.asset | 2 +- .../telescopes/jwst/targets/ring_image.asset | 2 +- .../jwst/targets/sn1987a_image.asset | 2 +- .../jwst/targets/trifid_image.asset | 2 +- .../solarsystem/telescopes/jwst/trail.asset | 2 +- .../telescopes/jwst/transforms.asset | 2 +- data/assets/spice/base.asset | 6 +- data/assets/util/add_marker.asset | 2 +- data/assets/util/constellations_helper.asset | 2 +- data/assets/util/launcher_images.asset | 2 +- data/assets/util/static_server.asset | 2 +- data/assets/util/webgui.asset | 2 +- src/scene/assetmanager.cpp | 117 +++++++++------- .../AssetLoaderTest/assetfunctionsexist.asset | 6 +- 758 files changed, 1412 insertions(+), 1395 deletions(-) diff --git a/data/assets/educational/scale/arc_de_triomphe.asset b/data/assets/educational/scale/arc_de_triomphe.asset index 3640c96a83..1669995813 100644 --- a/data/assets/educational/scale/arc_de_triomphe.asset +++ b/data/assets/educational/scale/arc_de_triomphe.asset @@ -3,7 +3,7 @@ local sunAsset = asset.require("scene/solarsystem/sun/sun") -local modelFolder = asset.syncedResource({ +local modelFolder = asset.resource({ Name = "Scale Model Arc de Triomphe", Type = "HttpSynchronization", Identifier = "scale_model_arc_de_triomphe", diff --git a/data/assets/educational/scale/big_ben.asset b/data/assets/educational/scale/big_ben.asset index 6720edafe6..20cce7e0e2 100644 --- a/data/assets/educational/scale/big_ben.asset +++ b/data/assets/educational/scale/big_ben.asset @@ -3,7 +3,7 @@ local sunAsset = asset.require("scene/solarsystem/sun/sun") -local modelFolder = asset.syncedResource({ +local modelFolder = asset.resource({ Name = "Scale Model Big Ben", Type = "HttpSynchronization", Identifier = "scale_model_big_ben", diff --git a/data/assets/educational/scale/burj_khalifa.asset b/data/assets/educational/scale/burj_khalifa.asset index 0f7d24101e..ff46cd6976 100644 --- a/data/assets/educational/scale/burj_khalifa.asset +++ b/data/assets/educational/scale/burj_khalifa.asset @@ -3,7 +3,7 @@ local sunAsset = asset.require("scene/solarsystem/sun/sun") -local modelFolder = asset.syncedResource({ +local modelFolder = asset.resource({ Name = "Scale Burj Khalifa", Type = "UrlSynchronization", Identifier = "scale_model_burj_khalifa", diff --git a/data/assets/educational/scale/eiffeltower.asset b/data/assets/educational/scale/eiffeltower.asset index ed612a1271..5495949158 100644 --- a/data/assets/educational/scale/eiffeltower.asset +++ b/data/assets/educational/scale/eiffeltower.asset @@ -3,7 +3,7 @@ local sunAsset = asset.require("scene/solarsystem/sun/sun") -local modelFolder = asset.syncedResource({ +local modelFolder = asset.resource({ Name = "Scale Eiffel Tower", Type = "HttpSynchronization", Identifier = "scale_model_eiffel_tower", diff --git a/data/assets/educational/scale/empire_state_building.asset b/data/assets/educational/scale/empire_state_building.asset index c35daf815e..eec3bf3c24 100644 --- a/data/assets/educational/scale/empire_state_building.asset +++ b/data/assets/educational/scale/empire_state_building.asset @@ -3,7 +3,7 @@ local sunAsset = asset.require("scene/solarsystem/sun/sun") -local modelFolder = asset.syncedResource({ +local modelFolder = asset.resource({ Name = "Scale Empire State Building", Type = "HttpSynchronization", Identifier = "scale_model_empire_state", diff --git a/data/assets/educational/scale/gateway_arch.asset b/data/assets/educational/scale/gateway_arch.asset index 2d089375e4..3946149d10 100644 --- a/data/assets/educational/scale/gateway_arch.asset +++ b/data/assets/educational/scale/gateway_arch.asset @@ -3,7 +3,7 @@ local sunAsset = asset.require("scene/solarsystem/sun/sun") -local modelFolder = asset.syncedResource({ +local modelFolder = asset.resource({ Name = "Scale Gateway Arch", Type = "HttpSynchronization", Identifier = "scale_model_gateway_arch", diff --git a/data/assets/educational/scale/golden_gate_bridge.asset b/data/assets/educational/scale/golden_gate_bridge.asset index 5e7b07d3fc..75df110e7f 100644 --- a/data/assets/educational/scale/golden_gate_bridge.asset +++ b/data/assets/educational/scale/golden_gate_bridge.asset @@ -3,7 +3,7 @@ local sunAsset = asset.require("scene/solarsystem/sun/sun") -local modelFolder = asset.syncedResource({ +local modelFolder = asset.resource({ Name = "Scale Golden Gate Bridge", Type = "HttpSynchronization", Identifier = "scale_model_golden_gate_bridge", diff --git a/data/assets/educational/scale/kuala_lumpur_tower.asset b/data/assets/educational/scale/kuala_lumpur_tower.asset index 6a4f7ce950..3d64296e95 100644 --- a/data/assets/educational/scale/kuala_lumpur_tower.asset +++ b/data/assets/educational/scale/kuala_lumpur_tower.asset @@ -3,7 +3,7 @@ local sunAsset = asset.require("scene/solarsystem/sun/sun") -local modelFolder = asset.syncedResource({ +local modelFolder = asset.resource({ Name = "Scale Kuala Lumpur Tower", Type = "HttpSynchronization", Identifier = "scale_model_kuala_lumpur_tower", diff --git a/data/assets/educational/scale/rose_bowl.asset b/data/assets/educational/scale/rose_bowl.asset index 67f3a660a1..46e30ccf9f 100644 --- a/data/assets/educational/scale/rose_bowl.asset +++ b/data/assets/educational/scale/rose_bowl.asset @@ -3,7 +3,7 @@ local sunAsset = asset.require("scene/solarsystem/sun/sun") -local modelFolder = asset.syncedResource({ +local modelFolder = asset.resource({ Name = "Scale Rose Bowl", Type = "HttpSynchronization", Identifier = "scale_model_rose_bowl", diff --git a/data/assets/educational/scale/school_bus.asset b/data/assets/educational/scale/school_bus.asset index ba9cdf20db..ef2875b6a9 100644 --- a/data/assets/educational/scale/school_bus.asset +++ b/data/assets/educational/scale/school_bus.asset @@ -3,7 +3,7 @@ local sunAsset = asset.require("scene/solarsystem/sun/sun") -local modelFolder = asset.syncedResource({ +local modelFolder = asset.resource({ Name = "Scale School Bus", Type = "HttpSynchronization", Identifier = "scale_model_school_bus", diff --git a/data/assets/educational/scale/scientist.asset b/data/assets/educational/scale/scientist.asset index 8e889ac0f0..621654dea5 100644 --- a/data/assets/educational/scale/scientist.asset +++ b/data/assets/educational/scale/scientist.asset @@ -3,7 +3,7 @@ local sunAsset = asset.require("scene/solarsystem/sun/sun") -local modelFolder = asset.syncedResource({ +local modelFolder = asset.resource({ Name = "Scale Model Scientist", Type = "HttpSynchronization", Identifier = "scale_model_scientist", diff --git a/data/assets/educational/scale/statue_of_liberty.asset b/data/assets/educational/scale/statue_of_liberty.asset index 31171ac56e..e40bf4a21a 100644 --- a/data/assets/educational/scale/statue_of_liberty.asset +++ b/data/assets/educational/scale/statue_of_liberty.asset @@ -3,7 +3,7 @@ local sunAsset = asset.require("scene/solarsystem/sun/sun") -local modelFolder = asset.syncedResource({ +local modelFolder = asset.resource({ Name = "Scale Model Statue of Liberty", Type = "HttpSynchronization", Identifier = "scale_model_statue_of_liberty", diff --git a/data/assets/examples/animation.asset b/data/assets/examples/animation.asset index b715ad7293..6406ae0e96 100644 --- a/data/assets/examples/animation.asset +++ b/data/assets/examples/animation.asset @@ -3,7 +3,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local model = asset.syncedResource({ +local model = asset.resource({ Name = "Animated Box", Type = "HttpSynchronization", Identifier = "animated_box", diff --git a/data/assets/examples/approachevents.asset b/data/assets/examples/approachevents.asset index 7d68868671..46e71fd254 100644 --- a/data/assets/examples/approachevents.asset +++ b/data/assets/examples/approachevents.asset @@ -3,7 +3,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local model = asset.syncedResource({ +local model = asset.resource({ Name = "Animated Box", Type = "HttpSynchronization", Identifier = "animated_box", diff --git a/data/assets/examples/galaxyshader/volume.asset b/data/assets/examples/galaxyshader/volume.asset index d52b3f2bc0..17db8fe4ee 100644 --- a/data/assets/examples/galaxyshader/volume.asset +++ b/data/assets/examples/galaxyshader/volume.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local data = asset.syncedResource({ +local data = asset.resource({ Name = "Milkyway Volume Data", Type = "HttpSynchronization", Identifier = "milkyway_volume_data", @@ -30,7 +30,7 @@ local MilkyWayVolume = { AbsorptionMultiply = 200, EmissionMultiply = 250, Rotation = { math.pi, 3.1248, 4.45741 }, - RaycastingShader = asset.localResource("galaxyraycast2.glsl"), + RaycastingShader = asset.resource("galaxyraycast2.glsl"), Volume = { Type = "Volume", Filename = data .. "MilkyWayRGBAVolume1024x1024x128.raw", diff --git a/data/assets/examples/geojson/geojson_extruded_shaded_polygon.asset b/data/assets/examples/geojson/geojson_extruded_shaded_polygon.asset index 56002c2439..f192dec785 100644 --- a/data/assets/examples/geojson/geojson_extruded_shaded_polygon.asset +++ b/data/assets/examples/geojson/geojson_extruded_shaded_polygon.asset @@ -3,7 +3,7 @@ local sun = asset.require("scene/solarsystem/sun/sun") -local data = asset.syncedResource({ +local data = asset.resource({ Name = "GeoJSON Example Africa", Type = "UrlSynchronization", Identifier = "geojson_example_polygon_extruded_africa", diff --git a/data/assets/examples/geojson/geojson_lines.asset b/data/assets/examples/geojson/geojson_lines.asset index 481c7b2326..684ff47cce 100644 --- a/data/assets/examples/geojson/geojson_lines.asset +++ b/data/assets/examples/geojson/geojson_lines.asset @@ -2,7 +2,7 @@ local earth = asset.require("scene/solarsystem/planets/earth/earth") -local data = asset.syncedResource({ +local data = asset.resource({ Name = "GeoJSON Example Lines", Type = "UrlSynchronization", Identifier = "geojson_example_lines", diff --git a/data/assets/examples/geojson/geojson_multiple_polygons.asset b/data/assets/examples/geojson/geojson_multiple_polygons.asset index 640ce589f5..1613446283 100644 --- a/data/assets/examples/geojson/geojson_multiple_polygons.asset +++ b/data/assets/examples/geojson/geojson_multiple_polygons.asset @@ -2,7 +2,7 @@ local earth = asset.require("scene/solarsystem/planets/earth/earth") -local data = asset.syncedResource({ +local data = asset.resource({ Name = "GeoJSON Example Polygon Multiple", Type = "UrlSynchronization", Identifier = "geojson_example_polygon_multiple", diff --git a/data/assets/examples/geojson/geojson_points.asset b/data/assets/examples/geojson/geojson_points.asset index a1a4736661..bcf0464845 100644 --- a/data/assets/examples/geojson/geojson_points.asset +++ b/data/assets/examples/geojson/geojson_points.asset @@ -2,7 +2,7 @@ local earth = asset.require("scene/solarsystem/planets/earth/earth") -local data = asset.syncedResource({ +local data = asset.resource({ Name = "GeoJSON Example Outfacing", Type = "UrlSynchronization", Identifier = "geojson_example_points", diff --git a/data/assets/examples/geojson/geojson_points_outfacing.asset b/data/assets/examples/geojson/geojson_points_outfacing.asset index 9e9f74a299..07ad634959 100644 --- a/data/assets/examples/geojson/geojson_points_outfacing.asset +++ b/data/assets/examples/geojson/geojson_points_outfacing.asset @@ -2,7 +2,7 @@ local earth = asset.require("scene/solarsystem/planets/earth/earth") -local data = asset.syncedResource({ +local data = asset.resource({ Name = "GeoJSON Example Outfacing", Type = "UrlSynchronization", Identifier = "geojson_example_points", diff --git a/data/assets/examples/geojson/geojson_polygons_with_holes.asset b/data/assets/examples/geojson/geojson_polygons_with_holes.asset index 8adcaff40e..eeadd26b76 100644 --- a/data/assets/examples/geojson/geojson_polygons_with_holes.asset +++ b/data/assets/examples/geojson/geojson_polygons_with_holes.asset @@ -2,7 +2,7 @@ local earth = asset.require("scene/solarsystem/planets/earth/earth") -local data = asset.syncedResource({ +local data = asset.resource({ Name = "GeoJSON Example Polygon with holes", Type = "UrlSynchronization", Identifier = "geojson_example_polygon_with_holes", diff --git a/data/assets/examples/geojson/geojson_roverpath.asset b/data/assets/examples/geojson/geojson_roverpath.asset index 876f5b8e33..97e7056f78 100644 --- a/data/assets/examples/geojson/geojson_roverpath.asset +++ b/data/assets/examples/geojson/geojson_roverpath.asset @@ -2,7 +2,7 @@ local mars = asset.require("scene/solarsystem/planets/mars/mars") -local data = asset.syncedResource({ +local data = asset.resource({ Name = "GeoJSON Example Path Perseverance", Type = "UrlSynchronization", Identifier = "geojson_example_path_perseverance", diff --git a/data/assets/examples/geojson/geojson_toronto_neighborhoods.asset b/data/assets/examples/geojson/geojson_toronto_neighborhoods.asset index 1eba4160c1..7ac4341ae4 100644 --- a/data/assets/examples/geojson/geojson_toronto_neighborhoods.asset +++ b/data/assets/examples/geojson/geojson_toronto_neighborhoods.asset @@ -2,7 +2,7 @@ local earth = asset.require("scene/solarsystem/planets/earth/earth") -local data = asset.syncedResource({ +local data = asset.resource({ Name = "GeoJSON Example Toronto Neighborhoods", Type = "UrlSynchronization", Identifier = "geojson_example_toronto_neighborhoods", diff --git a/data/assets/examples/globerotation.asset b/data/assets/examples/globerotation.asset index f267be6e56..25bfe9258f 100644 --- a/data/assets/examples/globerotation.asset +++ b/data/assets/examples/globerotation.asset @@ -3,7 +3,7 @@ local earth = asset.require("scene/solarsystem/planets/earth/earth") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "New Horizons Model", Type = "HttpSynchronization", Identifier = "newhorizons_model", diff --git a/data/assets/examples/globetranslation.asset b/data/assets/examples/globetranslation.asset index ba393ed61c..7cccfb64f5 100644 --- a/data/assets/examples/globetranslation.asset +++ b/data/assets/examples/globetranslation.asset @@ -3,7 +3,7 @@ local earth = asset.require("scene/solarsystem/planets/earth/earth") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "New Horizons Model", Type = "HttpSynchronization", Identifier = "newhorizons_model", diff --git a/data/assets/examples/modelshader/modelshader.asset b/data/assets/examples/modelshader/modelshader.asset index 8cacd99129..e086da7e98 100644 --- a/data/assets/examples/modelshader/modelshader.asset +++ b/data/assets/examples/modelshader/modelshader.asset @@ -3,7 +3,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local model = asset.syncedResource({ +local model = asset.resource({ Name = "Animated Box", Type = "HttpSynchronization", Identifier = "animated_box", @@ -27,8 +27,8 @@ local Model = { -- (malej 2023-MAY-22) Note that PerformShading should be false in this example, -- these example shaders dont't contain any light calculations PerformShading = false, - VertexShader = asset.localResource("model_vs.glsl"), - FragmentShader = asset.localResource("model_fs.glsl"), + VertexShader = asset.resource("model_vs.glsl"), + FragmentShader = asset.resource("model_fs.glsl"), EnableAnimation = true, AnimationStartTime = "2023 05 11 00:00:00", AnimationTimeScale = "Second", diff --git a/data/assets/examples/temperature_land_highres.asset b/data/assets/examples/temperature_land_highres.asset index 75217b70df..18de8d6409 100644 --- a/data/assets/examples/temperature_land_highres.asset +++ b/data/assets/examples/temperature_land_highres.asset @@ -2,7 +2,7 @@ local globe = asset.require("scene/solarsystem/planets/earth/earth") -local path = asset.syncedResource({ +local path = asset.resource({ Name = "Earth Textures Climate", Type = "HttpSynchronization", Identifier = "earth_textures_climate", diff --git a/data/assets/examples/urlsynchronization.asset b/data/assets/examples/urlsynchronization.asset index 6005a176c6..e45895f791 100644 --- a/data/assets/examples/urlsynchronization.asset +++ b/data/assets/examples/urlsynchronization.asset @@ -1,11 +1,11 @@ -asset.syncedResource({ +asset.resource({ Name = "Example Single", Type = "UrlSynchronization", Identifier = "example_single", Url = "http://celestrak.com/NORAD/elements/geo.txt" }) -asset.syncedResource({ +asset.resource({ Name = "Example Multiple", Type = "UrlSynchronization", Identifier = "example_multiple", @@ -15,7 +15,7 @@ asset.syncedResource({ } }) -asset.syncedResource({ +asset.resource({ Name = "Example Large", Type = "UrlSynchronization", Identifier = "example_large", @@ -23,7 +23,7 @@ asset.syncedResource({ Override = true }) -asset.syncedResource({ +asset.resource({ Name = "Example Medium", Type = "UrlSynchronization", Identifier = "example_medium", @@ -34,7 +34,7 @@ asset.syncedResource({ -- Load a resource without hashing, meaning that the bare directory name will be -- used for the downloaded file. If UseHash is true, the hash of the URL is appended -- to the directory name to produce a unique directory under all circumstances -asset.syncedResource({ +asset.resource({ Name = "Example No Hash", Type = "UrlSynchronization", Identifier = "no_hash", diff --git a/data/assets/examples/video/videoglobe.asset b/data/assets/examples/video/videoglobe.asset index 83f9bcf7b6..e886d5dbbf 100644 --- a/data/assets/examples/video/videoglobe.asset +++ b/data/assets/examples/video/videoglobe.asset @@ -10,7 +10,7 @@ local Layer = { Identifier = "GlobeVideoLoopExample", Enabled = true, Type = "VideoTileProvider", - Video = asset.localResource("examplevideo.mp4"), + Video = asset.resource("examplevideo.mp4"), } diff --git a/data/assets/examples/video/videoplane.asset b/data/assets/examples/video/videoplane.asset index f81fda6a47..f4b102dc43 100644 --- a/data/assets/examples/video/videoplane.asset +++ b/data/assets/examples/video/videoplane.asset @@ -18,7 +18,7 @@ local Plane = { Type = "RenderableVideoPlane", MirrorBackside = true, Size = 3E7, - Video = asset.localResource("examplevideo.mp4"), + Video = asset.resource("examplevideo.mp4"), }, GUI = { Name = "Video Plane Example", diff --git a/data/assets/examples/video/videoscreenspace.asset b/data/assets/examples/video/videoscreenspace.asset index 4b52ce4a6b..c114f26251 100644 --- a/data/assets/examples/video/videoscreenspace.asset +++ b/data/assets/examples/video/videoscreenspace.asset @@ -5,7 +5,7 @@ local ScreenSpace = { Identifier = "ScreenSpaceVideoExample", Type = "ScreenSpaceVideo", Name = "Screen Space Video Example", - Video = asset.localResource("examplevideo.mp4") + Video = asset.resource("examplevideo.mp4") } diff --git a/data/assets/examples/video/videosphere.asset b/data/assets/examples/video/videosphere.asset index 960a70c58c..5155cbb2a7 100644 --- a/data/assets/examples/video/videosphere.asset +++ b/data/assets/examples/video/videosphere.asset @@ -7,7 +7,7 @@ local Sphere = { Type = "RenderableVideoSphere", Size = 100.0, Segments = 80, - Video = asset.localResource("examplevideo.mp4"), + Video = asset.resource("examplevideo.mp4"), Orientation = "Both" }, GUI = { diff --git a/data/assets/examples/video/videostretchedtotime.asset b/data/assets/examples/video/videostretchedtotime.asset index 93c31047a9..747470b7a7 100644 --- a/data/assets/examples/video/videostretchedtotime.asset +++ b/data/assets/examples/video/videostretchedtotime.asset @@ -9,7 +9,7 @@ local Layer = { Name = "Stretched Video Example", Identifier = "StretchedVideoExample", Type = "VideoTileLayer", - Video = asset.localResource("examplevideo.mp4"), + Video = asset.resource("examplevideo.mp4"), StartTime = "2023 01 29 20:00:00", EndTime = "2023 01 29 21:00:00", PlaybackMode = "MapToSimulationTime", diff --git a/data/assets/examples/volume/generated/cartesian.asset b/data/assets/examples/volume/generated/cartesian.asset index 634f009e6f..30ad1dc7ed 100644 --- a/data/assets/examples/volume/generated/cartesian.asset +++ b/data/assets/examples/volume/generated/cartesian.asset @@ -19,8 +19,8 @@ local Volume = { }, Renderable = { Type = "RenderableTimeVaryingVolume", - SourceDirectory = asset.localResource("cartesian"), - TransferFunction = asset.localResource("../transferfunction.txt"), + SourceDirectory = asset.resource("cartesian"), + TransferFunction = asset.resource("../transferfunction.txt"), StepSize = 0.01, MinValue = 0, MaxValue = 1, diff --git a/data/assets/examples/volume/generated/cartesiansequence.asset b/data/assets/examples/volume/generated/cartesiansequence.asset index c0e860c6e5..a9cc344384 100644 --- a/data/assets/examples/volume/generated/cartesiansequence.asset +++ b/data/assets/examples/volume/generated/cartesiansequence.asset @@ -13,8 +13,8 @@ local Volume = { Parent = transforms.SolarSystemBarycenter.Identifier, Renderable = { Type = "RenderableTimeVaryingVolume", - SourceDirectory = asset.localResource("cartesiansequence"), - TransferFunction = asset.localResource("../transferfunction.txt"), + SourceDirectory = asset.resource("cartesiansequence"), + TransferFunction = asset.resource("../transferfunction.txt"), StepSize = 0.01, MinValue = 0, MaxValue = 1, diff --git a/data/assets/examples/volume/generated/spherical.asset b/data/assets/examples/volume/generated/spherical.asset index d0d4b7e25c..d61e070962 100644 --- a/data/assets/examples/volume/generated/spherical.asset +++ b/data/assets/examples/volume/generated/spherical.asset @@ -19,8 +19,8 @@ local Volume = { }, Renderable = { Type = "RenderableTimeVaryingVolume", - SourceDirectory = asset.localResource("spherical"), - TransferFunction = asset.localResource("../transferfunction.txt"), + SourceDirectory = asset.resource("spherical"), + TransferFunction = asset.resource("../transferfunction.txt"), StepSize = 0.01, MinValue = 0, MaxValue = 1, diff --git a/data/assets/global/openspacebookmarks.asset b/data/assets/global/openspacebookmarks.asset index 90bf4bcbd0..d8770c2e20 100644 --- a/data/assets/global/openspacebookmarks.asset +++ b/data/assets/global/openspacebookmarks.asset @@ -2,7 +2,7 @@ local bookmarkHelper = asset.require("util/generate_bookmarks") local dataProvider = "http://data.openspaceproject.com/files/bookmarks/v1/bookmarks.csv" -local bookmarksCSV = asset.syncedResource({ +local bookmarksCSV = asset.resource({ Identifier = "openspace_bookmarks", Name = "OpenSpace Bookmarks", Type = "UrlSynchronization", diff --git a/data/assets/gui/images.asset b/data/assets/gui/images.asset index 97397155cf..e67cc96217 100644 --- a/data/assets/gui/images.asset +++ b/data/assets/gui/images.asset @@ -1,4 +1,4 @@ -asset.syncedResource({ +asset.resource({ Type = "UrlSynchronization", Name = "Icons", Identifier = "planet_icons", @@ -20,7 +20,7 @@ asset.syncedResource({ UseHash = false }) -asset.syncedResource({ +asset.resource({ Type = "UrlSynchronization", Name = "Stories", Identifier = "story_images", @@ -35,7 +35,7 @@ asset.syncedResource({ UseHash = false }) -asset.syncedResource({ +asset.resource({ Type = "UrlSynchronization", Name = "Instructions", Identifier = "images", diff --git a/data/assets/modules/exoplanets/exoplanets_data.asset b/data/assets/modules/exoplanets/exoplanets_data.asset index adc8290eac..839967411e 100644 --- a/data/assets/modules/exoplanets/exoplanets_data.asset +++ b/data/assets/modules/exoplanets/exoplanets_data.asset @@ -1,11 +1,11 @@ -local dataPath = asset.syncedResource({ +local dataPath = asset.resource({ Name = "Exoplanet Data Files", Type = "HttpSynchronization", Identifier = "exoplanets_data", Version = 5 }) -local colormaps = asset.syncedResource({ +local colormaps = asset.resource({ Name = "Stars Color Table", Type = "HttpSynchronization", Identifier = "stars_colormap", diff --git a/data/assets/modules/exoplanets/exoplanets_textures.asset b/data/assets/modules/exoplanets/exoplanets_textures.asset index 94258024f0..b8d4c63589 100644 --- a/data/assets/modules/exoplanets/exoplanets_textures.asset +++ b/data/assets/modules/exoplanets/exoplanets_textures.asset @@ -4,14 +4,14 @@ local habitableZoneTextures = asset.require( -local sunTextures = asset.syncedResource({ +local sunTextures = asset.resource({ Type = "HttpSynchronization", Name = "Sun textures", Identifier = "sun_textures", Version = 4 }) -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Exoplanet Textures", Type = "HttpSynchronization", Identifier = "exoplanets_textures", diff --git a/data/assets/modules/skybrowser/hover_circle.asset b/data/assets/modules/skybrowser/hover_circle.asset index efaa04368f..027c2a09cb 100644 --- a/data/assets/modules/skybrowser/hover_circle.asset +++ b/data/assets/modules/skybrowser/hover_circle.asset @@ -1,6 +1,6 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local imageFolder = asset.syncedResource({ +local imageFolder = asset.resource({ Name = "Hover Circle Image", Type = "HttpSynchronization", Identifier = "misc_ring_image", diff --git a/data/assets/nightsky/cardinal_directions.asset b/data/assets/nightsky/cardinal_directions.asset index c499cb0019..6f342cd7a1 100644 --- a/data/assets/nightsky/cardinal_directions.asset +++ b/data/assets/nightsky/cardinal_directions.asset @@ -2,7 +2,7 @@ local earthAsset = asset.require("scene/solarsystem/planets/earth/earth") -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Cardinal Directions Textures", Type = "HttpSynchronization", Identifier = "cardinal_directions_textures", diff --git a/data/assets/nightsky/ecliptic_band.asset b/data/assets/nightsky/ecliptic_band.asset index d46b6c2e0d..cfa8527cfe 100644 --- a/data/assets/nightsky/ecliptic_band.asset +++ b/data/assets/nightsky/ecliptic_band.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Ecliptic Band Textures", Type = "HttpSynchronization", Identifier = "ecliptic_band_textures", diff --git a/data/assets/nightsky/light_pollution.asset b/data/assets/nightsky/light_pollution.asset index 806a75fbee..6bcaef20c5 100644 --- a/data/assets/nightsky/light_pollution.asset +++ b/data/assets/nightsky/light_pollution.asset @@ -2,7 +2,7 @@ local earthAsset = asset.require("scene/solarsystem/planets/earth/earth") -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Light Pollution Textures", Type = "HttpSynchronization", Identifier = "light_pollution_textures", diff --git a/data/assets/nightsky/planets.asset b/data/assets/nightsky/planets.asset index 33d3ba205a..658b0ae4d5 100644 --- a/data/assets/nightsky/planets.asset +++ b/data/assets/nightsky/planets.asset @@ -6,7 +6,7 @@ local saturn = asset.require("scene/solarsystem/planets/saturn/transforms") -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Night Sky Planet Textures", Type = "HttpSynchronization", Identifier = "night_sky_planet_textures", diff --git a/data/assets/nightsky/zenith.asset b/data/assets/nightsky/zenith.asset index 0819e27ea5..d510f249d5 100644 --- a/data/assets/nightsky/zenith.asset +++ b/data/assets/nightsky/zenith.asset @@ -2,7 +2,7 @@ local earthAsset = asset.require("scene/solarsystem/planets/earth/earth") -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Zenith Textures", Type = "HttpSynchronization", Identifier = "zenith_textures", diff --git a/data/assets/scene/digitaluniverse/2dF.asset b/data/assets/scene/digitaluniverse/2dF.asset index ab705d3667..fca4597e97 100644 --- a/data/assets/scene/digitaluniverse/2dF.asset +++ b/data/assets/scene/digitaluniverse/2dF.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "2dF Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_2dF_textures", Version = 2 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "2dF Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_2dF_speck", diff --git a/data/assets/scene/digitaluniverse/2mass.asset b/data/assets/scene/digitaluniverse/2mass.asset index 71506f0dd2..da92e173fc 100644 --- a/data/assets/scene/digitaluniverse/2mass.asset +++ b/data/assets/scene/digitaluniverse/2mass.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "2MASS Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_2mass_textures", Version = 2 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "2MASS Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_2mass_speck", diff --git a/data/assets/scene/digitaluniverse/6dF.asset b/data/assets/scene/digitaluniverse/6dF.asset index 4d7ead66e5..34bdd92b3b 100644 --- a/data/assets/scene/digitaluniverse/6dF.asset +++ b/data/assets/scene/digitaluniverse/6dF.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "6dF Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_6dF_textures", Version = 2 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "6dF Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_6dF_speck", diff --git a/data/assets/scene/digitaluniverse/abell.asset b/data/assets/scene/digitaluniverse/abell.asset index fbbe0285a9..b7c5de498d 100644 --- a/data/assets/scene/digitaluniverse/abell.asset +++ b/data/assets/scene/digitaluniverse/abell.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Abell Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_abell_textures", Version = 2 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Abell Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_abell_speck", diff --git a/data/assets/scene/digitaluniverse/alternatestarlabels.asset b/data/assets/scene/digitaluniverse/alternatestarlabels.asset index d6237a0330..070e50eb7d 100644 --- a/data/assets/scene/digitaluniverse/alternatestarlabels.asset +++ b/data/assets/scene/digitaluniverse/alternatestarlabels.asset @@ -1,4 +1,4 @@ -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Alternate Star Labels Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_alternatestarlabels_speck", diff --git a/data/assets/scene/digitaluniverse/backgroundradiation.asset b/data/assets/scene/digitaluniverse/backgroundradiation.asset index 0fd43a12ea..efd33fb458 100644 --- a/data/assets/scene/digitaluniverse/backgroundradiation.asset +++ b/data/assets/scene/digitaluniverse/backgroundradiation.asset @@ -1,11 +1,11 @@ -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Background Radiation Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_backgroundradiation_speck", Version = 1 }) -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Background Radiation Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_backgroundradiation_textures", diff --git a/data/assets/scene/digitaluniverse/backgroundradiation_multiverse.asset b/data/assets/scene/digitaluniverse/backgroundradiation_multiverse.asset index 6633d975c9..8c9e729340 100644 --- a/data/assets/scene/digitaluniverse/backgroundradiation_multiverse.asset +++ b/data/assets/scene/digitaluniverse/backgroundradiation_multiverse.asset @@ -1,4 +1,4 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Background Radiation Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_backgroundradiation_textures", diff --git a/data/assets/scene/digitaluniverse/clusters.asset b/data/assets/scene/digitaluniverse/clusters.asset index 36687cd7b3..f266d6afb9 100644 --- a/data/assets/scene/digitaluniverse/clusters.asset +++ b/data/assets/scene/digitaluniverse/clusters.asset @@ -1,4 +1,4 @@ -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Clusters Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_clusters_speck", diff --git a/data/assets/scene/digitaluniverse/constellationbounds.asset b/data/assets/scene/digitaluniverse/constellationbounds.asset index e4d0f611b2..892b38b156 100644 --- a/data/assets/scene/digitaluniverse/constellationbounds.asset +++ b/data/assets/scene/digitaluniverse/constellationbounds.asset @@ -1,4 +1,4 @@ -local data = asset.syncedResource({ +local data = asset.resource({ Name = "Constellation Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_constellations_data", diff --git a/data/assets/scene/digitaluniverse/constellations.asset b/data/assets/scene/digitaluniverse/constellations.asset index b9fdcc55b2..301112a2ff 100644 --- a/data/assets/scene/digitaluniverse/constellations.asset +++ b/data/assets/scene/digitaluniverse/constellations.asset @@ -2,7 +2,7 @@ local constellations_helper = asset.require("util/constellations_helper") -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Constellation Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_constellations_data", diff --git a/data/assets/scene/digitaluniverse/deepsky.asset b/data/assets/scene/digitaluniverse/deepsky.asset index 83ac809645..371fd66ea1 100644 --- a/data/assets/scene/digitaluniverse/deepsky.asset +++ b/data/assets/scene/digitaluniverse/deepsky.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Deep Sky Objects Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_deepsky_textures", Version = 2 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Deep Sky Objects Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_deepsky_speck", diff --git a/data/assets/scene/digitaluniverse/dwarfs.asset b/data/assets/scene/digitaluniverse/dwarfs.asset index 6e789834d0..fe879a8ec6 100644 --- a/data/assets/scene/digitaluniverse/dwarfs.asset +++ b/data/assets/scene/digitaluniverse/dwarfs.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Brown Dwarf Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_dwarfs_textures", Version = 1 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Brown Dwarf Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_dwarfs_speck", diff --git a/data/assets/scene/digitaluniverse/exoplanets.asset b/data/assets/scene/digitaluniverse/exoplanets.asset index 2c1cface48..c20351cb17 100644 --- a/data/assets/scene/digitaluniverse/exoplanets.asset +++ b/data/assets/scene/digitaluniverse/exoplanets.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Exoplanets Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_exoplanets_textures", Version = 1 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Exoplanets Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_exoplanets_speck", diff --git a/data/assets/scene/digitaluniverse/exoplanets_candidates.asset b/data/assets/scene/digitaluniverse/exoplanets_candidates.asset index 0786bef147..5fa0436b7e 100644 --- a/data/assets/scene/digitaluniverse/exoplanets_candidates.asset +++ b/data/assets/scene/digitaluniverse/exoplanets_candidates.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Exoplanets Candidates Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_exoplanets_candidates_textures", Version = 1 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Exoplanets Candidates Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_exoplanets_candidates_speck", diff --git a/data/assets/scene/digitaluniverse/globularclusters.asset b/data/assets/scene/digitaluniverse/globularclusters.asset index 779002bc62..4e7095f8e4 100644 --- a/data/assets/scene/digitaluniverse/globularclusters.asset +++ b/data/assets/scene/digitaluniverse/globularclusters.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Globular Clusters Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_globularclusters_textures", Version = 1 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Globular Clusters Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_globularclusters_speck", diff --git a/data/assets/scene/digitaluniverse/grids.asset b/data/assets/scene/digitaluniverse/grids.asset index f37098eae8..65989fab4d 100644 --- a/data/assets/scene/digitaluniverse/grids.asset +++ b/data/assets/scene/digitaluniverse/grids.asset @@ -3,7 +3,7 @@ local earthTransforms = asset.require("scene/solarsystem/planets/earth/transform -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Grids Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_grids_speck", diff --git a/data/assets/scene/digitaluniverse/groups.asset b/data/assets/scene/digitaluniverse/groups.asset index 6279d5cbd1..03cb117c68 100644 --- a/data/assets/scene/digitaluniverse/groups.asset +++ b/data/assets/scene/digitaluniverse/groups.asset @@ -1,4 +1,4 @@ -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Galaxy Groups Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_groups_speck", diff --git a/data/assets/scene/digitaluniverse/h2regions.asset b/data/assets/scene/digitaluniverse/h2regions.asset index 30e7f29607..c5fb3baced 100644 --- a/data/assets/scene/digitaluniverse/h2regions.asset +++ b/data/assets/scene/digitaluniverse/h2regions.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "HII Regions Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_h2regions_textures", Version = 1 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "HII Regions Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_h2regions_speck", diff --git a/data/assets/scene/digitaluniverse/hdf.asset b/data/assets/scene/digitaluniverse/hdf.asset index 46416d9722..f34094b0c2 100644 --- a/data/assets/scene/digitaluniverse/hdf.asset +++ b/data/assets/scene/digitaluniverse/hdf.asset @@ -1,18 +1,18 @@ -local circle = asset.syncedResource({ +local circle = asset.resource({ Name = "Circle", Type = "HttpSynchronization", Identifier = "circle_image", Version = 1 }) -local HUDFSpeck = asset.syncedResource({ +local HUDFSpeck = asset.resource({ Name = "HUDF Speck", Type = "HttpSynchronization", Identifier = "digitaluniverse_hudf_speck", Version = 1 }) -local ColorMap = asset.syncedResource({ +local ColorMap = asset.resource({ Name = "HUDF color map", Type = "HttpSynchronization", Identifier = "digitaluniverse_hudf_textures", diff --git a/data/assets/scene/digitaluniverse/localdwarfs.asset b/data/assets/scene/digitaluniverse/localdwarfs.asset index e18fc4b7a7..7426659150 100644 --- a/data/assets/scene/digitaluniverse/localdwarfs.asset +++ b/data/assets/scene/digitaluniverse/localdwarfs.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Local Dwarfs Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_localdwarfs_textures", Version = 1 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Local Dwarfs Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_localdwarfs_speck", diff --git a/data/assets/scene/digitaluniverse/milkyway.asset b/data/assets/scene/digitaluniverse/milkyway.asset index 98544a780f..6e1445e36f 100644 --- a/data/assets/scene/digitaluniverse/milkyway.asset +++ b/data/assets/scene/digitaluniverse/milkyway.asset @@ -1,11 +1,11 @@ -local planeTextures = asset.syncedResource({ +local planeTextures = asset.resource({ Name = "Milky Way Plane Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_milkyway_textures", Version = 2 }) -local planeSpeck = asset.syncedResource({ +local planeSpeck = asset.resource({ Name = "Milky Way Plane Speck", Type = "HttpSynchronization", Identifier = "digitaluniverse_milkyway_speck", diff --git a/data/assets/scene/digitaluniverse/milkyway_arm_labels.asset b/data/assets/scene/digitaluniverse/milkyway_arm_labels.asset index 4ff17170e0..4961fc648a 100644 --- a/data/assets/scene/digitaluniverse/milkyway_arm_labels.asset +++ b/data/assets/scene/digitaluniverse/milkyway_arm_labels.asset @@ -1,11 +1,11 @@ -local planeTextures = asset.syncedResource({ +local planeTextures = asset.resource({ Name = "Milky Way Plane Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_milkyway_textures", Version = 2 }) -local planeSpeck = asset.syncedResource({ +local planeSpeck = asset.resource({ Name = "Milky Way Plane Speck", Type = "HttpSynchronization", Identifier = "digitaluniverse_milkyway_speck", diff --git a/data/assets/scene/digitaluniverse/milkyway_label.asset b/data/assets/scene/digitaluniverse/milkyway_label.asset index d4431cb0eb..c2098b14ff 100644 --- a/data/assets/scene/digitaluniverse/milkyway_label.asset +++ b/data/assets/scene/digitaluniverse/milkyway_label.asset @@ -1,4 +1,4 @@ -local homespeck = asset.syncedResource({ +local homespeck = asset.resource({ Name = "Home Speck File", Type = "HttpSynchronization", Identifier = "digitaluniverse_home_speck", diff --git a/data/assets/scene/digitaluniverse/milkyway_sphere.asset b/data/assets/scene/digitaluniverse/milkyway_sphere.asset index 1c4f51a7ad..ff91649fc0 100644 --- a/data/assets/scene/digitaluniverse/milkyway_sphere.asset +++ b/data/assets/scene/digitaluniverse/milkyway_sphere.asset @@ -1,4 +1,4 @@ -local sphereTextures = asset.syncedResource({ +local sphereTextures = asset.resource({ Name = "Milky Way Sphere Textures", Type = "HttpSynchronization", Identifier = "milkyway_textures", diff --git a/data/assets/scene/digitaluniverse/obassociations.asset b/data/assets/scene/digitaluniverse/obassociations.asset index 72f5c036e3..73644a8c82 100644 --- a/data/assets/scene/digitaluniverse/obassociations.asset +++ b/data/assets/scene/digitaluniverse/obassociations.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "OB Associations Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_obassociations_textures", Version = 1 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "OB Associations Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_obassociations_speck", diff --git a/data/assets/scene/digitaluniverse/openclusters.asset b/data/assets/scene/digitaluniverse/openclusters.asset index dd7197b1ca..e16a67dcbf 100644 --- a/data/assets/scene/digitaluniverse/openclusters.asset +++ b/data/assets/scene/digitaluniverse/openclusters.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Open Clusters Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_openclusters_textures", Version = 1 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Open Clusters Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_openclusters_speck", diff --git a/data/assets/scene/digitaluniverse/planetarynebulae.asset b/data/assets/scene/digitaluniverse/planetarynebulae.asset index afff444408..48837eac3d 100644 --- a/data/assets/scene/digitaluniverse/planetarynebulae.asset +++ b/data/assets/scene/digitaluniverse/planetarynebulae.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Planetary Nebulae Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_planetarynebulae_textures", Version = 1 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Planetary Nebulae Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_planetarynebulae_speck", diff --git a/data/assets/scene/digitaluniverse/pulsars.asset b/data/assets/scene/digitaluniverse/pulsars.asset index e08ea7dbeb..8118e80fe8 100644 --- a/data/assets/scene/digitaluniverse/pulsars.asset +++ b/data/assets/scene/digitaluniverse/pulsars.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Pulsars Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_pulsars_textures", Version = 1 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Pulsars Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_pulsars_speck", diff --git a/data/assets/scene/digitaluniverse/quasars.asset b/data/assets/scene/digitaluniverse/quasars.asset index d78ba9cc68..783b1b9b1b 100644 --- a/data/assets/scene/digitaluniverse/quasars.asset +++ b/data/assets/scene/digitaluniverse/quasars.asset @@ -1,18 +1,18 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Quasars Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_quasars_textures", Version = 2 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Quasars Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_quasars_speck", Version = 2 }) -local colormaps = asset.syncedResource({ +local colormaps = asset.resource({ Name = "Quasars Colormap", Type = "HttpSynchronization", Identifier = "digitaluniverse_quasars_colormap", diff --git a/data/assets/scene/digitaluniverse/sdss.asset b/data/assets/scene/digitaluniverse/sdss.asset index 36925c1b4c..b1159ddf92 100644 --- a/data/assets/scene/digitaluniverse/sdss.asset +++ b/data/assets/scene/digitaluniverse/sdss.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Sloan Digital Sky Survey Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_sloandss_textures", Version = 2 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Sloan Digital Sky Survey Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_sloandss_speck", diff --git a/data/assets/scene/digitaluniverse/starlabels.asset b/data/assets/scene/digitaluniverse/starlabels.asset index 052001c823..bd33b78b85 100644 --- a/data/assets/scene/digitaluniverse/starlabels.asset +++ b/data/assets/scene/digitaluniverse/starlabels.asset @@ -1,4 +1,4 @@ -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Star Labels Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_starlabels_speck", diff --git a/data/assets/scene/digitaluniverse/starorbits.asset b/data/assets/scene/digitaluniverse/starorbits.asset index b56ebcdc5f..a233d14146 100644 --- a/data/assets/scene/digitaluniverse/starorbits.asset +++ b/data/assets/scene/digitaluniverse/starorbits.asset @@ -3,7 +3,7 @@ local earth_transforms = asset.require("scene/solarsystem/planets/earth/transfor -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Grids Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_starorbits_speck", diff --git a/data/assets/scene/digitaluniverse/stars.asset b/data/assets/scene/digitaluniverse/stars.asset index dd818db75b..81ec0fa7d2 100644 --- a/data/assets/scene/digitaluniverse/stars.asset +++ b/data/assets/scene/digitaluniverse/stars.asset @@ -1,25 +1,25 @@ -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Stars Speck Files", Type = "HttpSynchronization", Identifier = "stars_du", Version = 5 }) -local sunspeck = asset.syncedResource({ +local sunspeck = asset.resource({ Name = "Stars Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_sunstar_speck", Version = 1 }) -local colormaps = asset.syncedResource({ +local colormaps = asset.resource({ Name = "Stars Color Table", Type = "HttpSynchronization", Identifier = "stars_colormap", Version = 3 }) -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Stars Textures", Type = "HttpSynchronization", Identifier = "stars_textures", diff --git a/data/assets/scene/digitaluniverse/superclusters.asset b/data/assets/scene/digitaluniverse/superclusters.asset index b40fe08b91..4959dc3c47 100644 --- a/data/assets/scene/digitaluniverse/superclusters.asset +++ b/data/assets/scene/digitaluniverse/superclusters.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Galaxy Superclusters Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_superclusters_textures", Version = 2 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Galaxy Superclusters Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_superclusters_speck", diff --git a/data/assets/scene/digitaluniverse/supernovaremnants.asset b/data/assets/scene/digitaluniverse/supernovaremnants.asset index c0909ccd2c..5332888150 100644 --- a/data/assets/scene/digitaluniverse/supernovaremnants.asset +++ b/data/assets/scene/digitaluniverse/supernovaremnants.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Supernova Remnants Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_supernovaremnants_textures", Version = 1 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Supernova Remnants Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_supernovaremnants_speck", diff --git a/data/assets/scene/digitaluniverse/tully.asset b/data/assets/scene/digitaluniverse/tully.asset index fe206f45bf..b4a20b1e4b 100644 --- a/data/assets/scene/digitaluniverse/tully.asset +++ b/data/assets/scene/digitaluniverse/tully.asset @@ -1,11 +1,11 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Tully Textures", Type = "HttpSynchronization", Identifier = "digitaluniverse_tully_textures", Version = 3 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Tully Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_tully_speck", diff --git a/data/assets/scene/digitaluniverse/voids.asset b/data/assets/scene/digitaluniverse/voids.asset index d8dedcca5b..6f38436ee0 100644 --- a/data/assets/scene/digitaluniverse/voids.asset +++ b/data/assets/scene/digitaluniverse/voids.asset @@ -1,4 +1,4 @@ -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Voids Speck Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_voids_speck", diff --git a/data/assets/scene/milkyway/constellations/constellation_art.asset b/data/assets/scene/milkyway/constellations/constellation_art.asset index f022e39395..d81539ee8a 100644 --- a/data/assets/scene/milkyway/constellations/constellation_art.asset +++ b/data/assets/scene/milkyway/constellations/constellation_art.asset @@ -1,17 +1,17 @@ -local constellationsCSV = asset.localResource("constellation_data.csv") +local constellationsCSV = asset.resource("constellation_data.csv") local transforms = asset.require("scene/solarsystem/sun/transforms") local constellations_helper = asset.require("util/constellations_helper") -local images = asset.syncedResource({ +local images = asset.resource({ Name = "Constellation Images", Type = "HttpSynchronization", Identifier = "constellation_images", Version = 4 }) -local data = asset.syncedResource({ +local data = asset.resource({ Name = "Constellation Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_constellations_data", diff --git a/data/assets/scene/milkyway/gaia/apogee.asset b/data/assets/scene/milkyway/gaia/apogee.asset index bdfd70d925..31a7fd0de8 100644 --- a/data/assets/scene/milkyway/gaia/apogee.asset +++ b/data/assets/scene/milkyway/gaia/apogee.asset @@ -1,18 +1,18 @@ -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Apogee Speck Files", Type = "HttpSynchronization", Identifier = "gaia_apogee", Version = 1 }) -local colormaps = asset.syncedResource({ +local colormaps = asset.resource({ Name = "Stars Color Table", Type = "HttpSynchronization", Identifier = "stars_colormap", Version = 3 }) -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Stars Textures", Type = "HttpSynchronization", Identifier = "stars_textures", diff --git a/data/assets/scene/milkyway/gaia/gaia_dr2_download_stars.asset b/data/assets/scene/milkyway/gaia/gaia_dr2_download_stars.asset index 1b23bf6ab6..0ea6813df0 100644 --- a/data/assets/scene/milkyway/gaia/gaia_dr2_download_stars.asset +++ b/data/assets/scene/milkyway/gaia/gaia_dr2_download_stars.asset @@ -1,7 +1,7 @@ -- Download a dataset of 618 million stars (28 GB), already preprocessed and stored in a binary octree. -- The octree was generated from the full DR2 by filtering away all stars with a parallax error higher than 0.5 -- Max Star Per Node = 50,000 and max distance = 500kpc -local gaia618Destination = asset.syncedResource({ +local gaia618Destination = asset.resource({ Name = "Gaia DR2 618M Octree", Type = "HttpSynchronization", Identifier = "gaia_stars_618M_octree", @@ -14,7 +14,7 @@ local gaia618DestinationExtracted = gaia618Destination .. "data" -- Download the full DR2 dataset with 24 values per star (preprocessed with theReadFitsTask (gaia_read.task) into 8 binary files). -- From these files new subsets can be created with the ConstructOctreeTask (gaia_octree.task). -- Total size of download is 151 GB. -local gaiaFull = asset.syncedResource({ +local gaiaFull = asset.resource({ Name = "Gaia DR2 Full Raw", Type = "HttpSynchronization", Identifier = "gaia_stars_dr2_raw", diff --git a/data/assets/scene/milkyway/gaia/gaiastars.asset b/data/assets/scene/milkyway/gaia/gaiastars.asset index 9e46a60b54..3123918b81 100644 --- a/data/assets/scene/milkyway/gaia/gaiastars.asset +++ b/data/assets/scene/milkyway/gaia/gaiastars.asset @@ -6,21 +6,21 @@ end -- Download a preprocessed binary octree of Radial Velocity subset values per star -- (preprocessed into 8 binary files). -local starsFolder = asset.syncedResource({ +local starsFolder = asset.resource({ Name = "Gaia Stars RV", Type = "HttpSynchronization", Identifier = "gaia_stars_rv_octree", Version = 1 }) -local colormaps = asset.syncedResource({ +local colormaps = asset.resource({ Name = "Stars Color Table", Type = "HttpSynchronization", Identifier = "stars_colormap", Version = 3 }) -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Stars Textures", Type = "HttpSynchronization", Identifier = "stars_textures", diff --git a/data/assets/scene/milkyway/gaia/galah.asset b/data/assets/scene/milkyway/gaia/galah.asset index 4ef21201e8..d232f4eb9a 100644 --- a/data/assets/scene/milkyway/gaia/galah.asset +++ b/data/assets/scene/milkyway/gaia/galah.asset @@ -1,18 +1,18 @@ -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Galah Speck Files", Type = "HttpSynchronization", Identifier = "gaia_galah", Version = 1 }) -local colormaps = asset.syncedResource({ +local colormaps = asset.resource({ Name = "Stars Color Table", Type = "HttpSynchronization", Identifier = "stars_colormap", Version = 3 }) -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Stars Textures", Type = "HttpSynchronization", Identifier = "stars_textures", diff --git a/data/assets/scene/milkyway/habitable_zones/habitable_zone_textures.asset b/data/assets/scene/milkyway/habitable_zones/habitable_zone_textures.asset index 1ace42d07d..b51e5f9767 100644 --- a/data/assets/scene/milkyway/habitable_zones/habitable_zone_textures.asset +++ b/data/assets/scene/milkyway/habitable_zones/habitable_zone_textures.asset @@ -1,4 +1,4 @@ -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Habitable Zone Textures", Type = "HttpSynchronization", Identifier = "habitable_zone_textures", diff --git a/data/assets/scene/milkyway/milkyway/eso.asset b/data/assets/scene/milkyway/milkyway/eso.asset index 47a51aee35..8d343964f0 100644 --- a/data/assets/scene/milkyway/milkyway/eso.asset +++ b/data/assets/scene/milkyway/milkyway/eso.asset @@ -1,4 +1,4 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "ESO Milky Way Textures", Type = "HttpSynchronization", Identifier = "milkyway-eso_textures", diff --git a/data/assets/scene/milkyway/milkyway/volume.asset b/data/assets/scene/milkyway/milkyway/volume.asset index b8959ed991..88b151040d 100644 --- a/data/assets/scene/milkyway/milkyway/volume.asset +++ b/data/assets/scene/milkyway/milkyway/volume.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local data = asset.syncedResource({ +local data = asset.resource({ Name = "Milkyway Volume Data", Type = "HttpSynchronization", Identifier = "milkyway_volume_data", diff --git a/data/assets/scene/milkyway/objects/orionnebula/cluster.asset b/data/assets/scene/milkyway/objects/orionnebula/cluster.asset index 169e2ae1b7..7b7b927925 100644 --- a/data/assets/scene/milkyway/objects/orionnebula/cluster.asset +++ b/data/assets/scene/milkyway/objects/orionnebula/cluster.asset @@ -2,7 +2,7 @@ local transforms = asset.require("./transforms") -local sync = asset.syncedResource({ +local sync = asset.resource({ Name = "Orion Nebula Star Cluster", Type = "HttpSynchronization", Identifier = "orion_nebula_star_cluster", diff --git a/data/assets/scene/milkyway/objects/orionnebula/nebula.asset b/data/assets/scene/milkyway/objects/orionnebula/nebula.asset index f7c4a66ab3..0845c6dfae 100644 --- a/data/assets/scene/milkyway/objects/orionnebula/nebula.asset +++ b/data/assets/scene/milkyway/objects/orionnebula/nebula.asset @@ -3,7 +3,7 @@ local transforms = asset.require("./transforms") -local sync = asset.syncedResource({ +local sync = asset.resource({ Name = "Orion Nebula Model", Type = "HttpSynchronization", Identifier = "orion_nebula_model", diff --git a/data/assets/scene/milkyway/stars/denver.asset b/data/assets/scene/milkyway/stars/denver.asset index a8924ad47e..e9a31d0592 100644 --- a/data/assets/scene/milkyway/stars/denver.asset +++ b/data/assets/scene/milkyway/stars/denver.asset @@ -1,18 +1,18 @@ -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Stars Textures", Type = "HttpSynchronization", Identifier = "stars-denver_textures", Version = 1 }) -local speck = asset.syncedResource({ +local speck = asset.resource({ Name = "Stars Speck Files", Type = "HttpSynchronization", Identifier = "stars-denver_speck", Version = 1 }) -local colorLUT = asset.syncedResource({ +local colorLUT = asset.resource({ Name = "Stars Color Table", Type = "HttpSynchronization", Identifier = "stars-denver_colormap", diff --git a/data/assets/scene/solarsystem/dwarf_planets/ceres/kernels.asset b/data/assets/scene/solarsystem/dwarf_planets/ceres/kernels.asset index 40f52766a5..bc0488e33f 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/ceres/kernels.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/ceres/kernels.asset @@ -1,4 +1,4 @@ -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Ceres Kernels", Type = "HttpSynchronization", Identifier = "ceres_kernels", diff --git a/data/assets/scene/solarsystem/dwarf_planets/ceres/layers/colorlayers/lamo.asset b/data/assets/scene/solarsystem/dwarf_planets/ceres/layers/colorlayers/lamo.asset index 794caa9382..7511aa0966 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/ceres/layers/colorlayers/lamo.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/ceres/layers/colorlayers/lamo.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "LAMO_Sweden", Name = "LAMO [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("lamo.wms") + FilePath = asset.resource("lamo.wms") } diff --git a/data/assets/scene/solarsystem/dwarf_planets/ceres/layers/colorlayers/lamo_local.asset b/data/assets/scene/solarsystem/dwarf_planets/ceres/layers/colorlayers/lamo_local.asset index 4bfd3e4e7d..762b2f69af 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/ceres/layers/colorlayers/lamo_local.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/ceres/layers/colorlayers/lamo_local.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../ceres") -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Ceres Textures", Type = "HttpSynchronization", Identifier = "ceres_textures", diff --git a/data/assets/scene/solarsystem/dwarf_planets/eris/planet.asset b/data/assets/scene/solarsystem/dwarf_planets/eris/planet.asset index 6f83956938..29248d81fd 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/eris/planet.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/eris/planet.asset @@ -3,7 +3,7 @@ local transforms = asset.require("./transforms") -local modelFolder = asset.syncedResource({ +local modelFolder = asset.resource({ Name = "Eris Model", Type = "HttpSynchronization", Identifier = "eris_model", diff --git a/data/assets/scene/solarsystem/dwarf_planets/haumea/planet.asset b/data/assets/scene/solarsystem/dwarf_planets/haumea/planet.asset index 6dbbaabdea..6f3acf92ff 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/haumea/planet.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/haumea/planet.asset @@ -3,7 +3,7 @@ local transforms = asset.require("./transforms") -local modelFolder = asset.syncedResource({ +local modelFolder = asset.resource({ Name = "Hamuea Model", Type = "HttpSynchronization", Identifier = "hamuea_model", diff --git a/data/assets/scene/solarsystem/dwarf_planets/makemake/planet.asset b/data/assets/scene/solarsystem/dwarf_planets/makemake/planet.asset index da89544973..22e1780f5b 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/makemake/planet.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/makemake/planet.asset @@ -3,7 +3,7 @@ local transforms = asset.require("./transforms") -local modelFolder = asset.syncedResource({ +local modelFolder = asset.resource({ Name = "Makemake Model", Type = "HttpSynchronization", Identifier = "makemake_model", 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 5b774f1bd9..9ecc4c16f6 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/charon/charon.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/charon/charon.asset @@ -4,7 +4,7 @@ asset.require("../trail") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Pluto Labels", Type = "HttpSynchronization", Identifier = "pluto_labels", diff --git a/data/assets/scene/solarsystem/dwarf_planets/pluto/kernels.asset b/data/assets/scene/solarsystem/dwarf_planets/pluto/kernels.asset index e96141f851..b4dfc571e6 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/kernels.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/kernels.asset @@ -1,4 +1,4 @@ -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Pluto Kernels", Type = "HttpSynchronization", Identifier = "pluto_kernels", diff --git a/data/assets/scene/solarsystem/dwarf_planets/pluto/pluto.asset b/data/assets/scene/solarsystem/dwarf_planets/pluto/pluto.asset index 67b23a287f..9b6125e14f 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/pluto.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/pluto.asset @@ -4,7 +4,7 @@ asset.require("./trail") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Pluto Labels", Type = "HttpSynchronization", Identifier = "pluto_labels", diff --git a/data/assets/scene/solarsystem/dwarf_planets/vesta/planet.asset b/data/assets/scene/solarsystem/dwarf_planets/vesta/planet.asset index 3e1bd8f547..25c6c13c16 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/vesta/planet.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/vesta/planet.asset @@ -3,7 +3,7 @@ local transforms = asset.require("./transforms") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Vesta Models", Type = "HttpSynchronization", Identifier = "vesta_model", 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 a80683ba5a..a7dbc5bcad 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 @@ -3,14 +3,14 @@ local transforms = asset.require("scene/solarsystem/planets/earth/magnetosphere/ -local transferFunctions = asset.syncedResource({ +local transferFunctions = asset.resource({ Name = "Fieldlines Transfer Functions", Type = "HttpSynchronization", Identifier = "sun_earth_event_july_2012-fieldlines_transferfunctions", Version = 2 }) -local fieldlineData = asset.syncedResource({ +local fieldlineData = asset.resource({ Name = "Fieldlines Data BATSRUS", Type = "HttpSynchronization", Identifier = "sun_earth_event_july_2012-batsrus", 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 3287299a88..65288f08ce 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 @@ -3,14 +3,14 @@ local transforms = asset.require("scene/solarsystem/sun/transforms_heliosphere") -local transferFunctions = asset.syncedResource({ +local transferFunctions = asset.resource({ Name = "Fieldlines Transfer Functions", Type = "HttpSynchronization", Identifier = "sun_earth_event_july_2012-fieldlines_transferfunctions", Version = 1 }) -local fieldlineData = asset.syncedResource({ +local fieldlineData = asset.resource({ Name = "Fieldlines Data ENLIL", Type = "HttpSynchronization", Identifier = "sun_earth_event_july_2012-enlil", 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 f3dc419f1e..271a84b9bb 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 @@ -2,14 +2,14 @@ local transforms = asset.require("scene/solarsystem/sun/transforms_heliosphere") -local transferFunctions = asset.syncedResource({ +local transferFunctions = asset.resource({ Name = "Fieldlines Transfer Functions", Type = "HttpSynchronization", Identifier = "sun_earth_event_july_2012-fieldlines_transferfunctions", Version = 1 }) -local fieldlineData = asset.syncedResource({ +local fieldlineData = asset.resource({ Name = "Fieldlines Data PFSS", Type = "HttpSynchronization", Identifier = "sun_earth_event_july_2012-pfss", diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/density_volume.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/density_volume.asset index bd70b8a781..de8e1848e3 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/density_volume.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/density_volume.asset @@ -4,7 +4,7 @@ local sunAsset = asset.require("scene/solarsystem/sun/sun") -local densityDirectory = asset.syncedResource({ +local densityDirectory = asset.resource({ Name = "Bastille Day MAS Density", Type = "HttpSynchronization", Identifier = "bastille_day_mas_density", @@ -36,7 +36,7 @@ local DensityVolume = { Type = "RenderableTimeVaryingVolume", StepSize = 0.004, Brightness = 0.3, - TransferFunction = asset.localResource("transferfunctions/mas-mhd-r-squared-old.txt"), + TransferFunction = asset.resource("transferfunctions/mas-mhd-r-squared-old.txt"), SourceDirectory = densityDirectory, GridType = "Spherical", SecondsBefore = 24 * 60 * 60, diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/fieldlines.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/fieldlines.asset index 6331867a88..104aa74034 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/fieldlines.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/fieldlines.asset @@ -4,7 +4,7 @@ local rot = asset.require("./carrington_to_heeq_rotation") -local fieldlinesDirectory = asset.syncedResource({ +local fieldlinesDirectory = asset.resource({ Name = "Bastille Day MAS Fieldlines", Type = "HttpSynchronization", Identifier = "bastille_day_mas_fieldlines", @@ -34,8 +34,8 @@ local Fieldlines = { AlphaBlendlingEnabled = false, InputFileType = "Osfls", ColorTablePaths = { - asset.localResource("transferfunctions/density-fieldlines.txt"), - asset.localResource("transferfunctions/velocity-fieldlines.txt") + asset.resource("transferfunctions/density-fieldlines.txt"), + asset.resource("transferfunctions/velocity-fieldlines.txt") }, ColorTableRanges = { { 0, 1000000 }, diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodes.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodes.asset index 283a18a4c9..fa63a907b4 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodes.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodes.asset @@ -4,7 +4,7 @@ local rot = asset.require("./carrington_to_heeq_rotation") -local fluxNodesBinaries = asset.syncedResource({ +local fluxNodesBinaries = asset.resource({ Name = "Bastille day Flux nodes binaries", Type = "HttpSynchronization", Identifier = "bastille_day_streamnodes_binaries", @@ -25,7 +25,7 @@ local Fluxnodes = { Renderable = { Type = "RenderableFluxNodes", SourceFolder = fluxNodesBinaries, - ColorTablePath = asset.localResource("transferfunctions/CMR.txt"), + ColorTablePath = asset.resource("transferfunctions/CMR.txt"), ColorTableRange = { -2.0, 4.0 } }, GUI = { diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodescutplane.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodescutplane.asset index bcda52593c..1952a84819 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodescutplane.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodescutplane.asset @@ -4,14 +4,14 @@ local rot = asset.require("./carrington_to_heeq_rotation") -local TexturesPathEquatorial = asset.syncedResource({ +local TexturesPathEquatorial = asset.resource({ Type = "HttpSynchronization", Name = "cutplanes_textures", Identifier = "cutplanes_textures", Version = 1 }) -local TexturesPathMeridial = asset.syncedResource({ +local TexturesPathMeridial = asset.resource({ Type = "HttpSynchronization", Name = "cutplane_meridial_textures", Identifier = "cutplane_meridial_textures", diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodeslegend.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodeslegend.asset index d9a3044da8..1f0fd9ede1 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodeslegend.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodeslegend.asset @@ -2,7 +2,7 @@ asset.require("spice/base") -local TexturesPath = asset.syncedResource({ +local TexturesPath = asset.resource({ Type = "HttpSynchronization", Name = "Streamnodes textures", Identifier = "streamnodes_legend", diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/magnetogram.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/magnetogram.asset index 8794ab4411..2027018b5c 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/magnetogram.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/magnetogram.asset @@ -1,4 +1,4 @@ -local TexturesPath = asset.syncedResource({ +local TexturesPath = asset.resource({ Name = "Bastille Day Magnetogram", Type = "HttpSynchronization", Identifier = "bastille_day_magnetogram", 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 0fc0acc793..aa41c39912 100644 --- a/data/assets/scene/solarsystem/interstellar/c-2019_q4_borisov.asset +++ b/data/assets/scene/solarsystem/interstellar/c-2019_q4_borisov.asset @@ -2,7 +2,7 @@ local sunTransforms = asset.require("scene/solarsystem/sun/transforms") -local trajectory = asset.syncedResource({ +local trajectory = asset.resource({ Name = "C-2019 Q4 Borisov Trajectory", Type = "HttpSynchronization", Identifier = "borisov_horizons", diff --git a/data/assets/scene/solarsystem/interstellar/oumuamua.asset b/data/assets/scene/solarsystem/interstellar/oumuamua.asset index 0f206ee77c..a94947803e 100644 --- a/data/assets/scene/solarsystem/interstellar/oumuamua.asset +++ b/data/assets/scene/solarsystem/interstellar/oumuamua.asset @@ -2,7 +2,7 @@ local sunTransforms = asset.require("scene/solarsystem/sun/transforms") -local trajectory = asset.syncedResource({ +local trajectory = asset.resource({ Name = "'Oumuamua Trajectory", Type = "HttpSynchronization", Identifier = "oumuamua_horizons", diff --git a/data/assets/scene/solarsystem/missions/apollo/11/apollo11.asset b/data/assets/scene/solarsystem/missions/apollo/11/apollo11.asset index f4f45209a0..288734c935 100644 --- a/data/assets/scene/solarsystem/missions/apollo/11/apollo11.asset +++ b/data/assets/scene/solarsystem/missions/apollo/11/apollo11.asset @@ -9,14 +9,14 @@ local kernels = asset.require("./kernels") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Apollo Models", Type = "HttpSynchronization", Identifier = "apollo_11_models", Version = 1 }) -local lemModel = asset.syncedResource({ +local lemModel = asset.resource({ Name = "Apollo Lem Models", Type = "HttpSynchronization", Identifier = "apollo_lem_model", diff --git a/data/assets/scene/solarsystem/missions/apollo/11/kernels.asset b/data/assets/scene/solarsystem/missions/apollo/11/kernels.asset index 3a38755977..819532dae2 100644 --- a/data/assets/scene/solarsystem/missions/apollo/11/kernels.asset +++ b/data/assets/scene/solarsystem/missions/apollo/11/kernels.asset @@ -1,4 +1,4 @@ -local kernelsFolder = asset.syncedResource({ +local kernelsFolder = asset.resource({ Name = "Apollo Kernels", Type = "HttpSynchronization", Identifier = "apollo_11_spice", diff --git a/data/assets/scene/solarsystem/missions/apollo/11/lem.asset b/data/assets/scene/solarsystem/missions/apollo/11/lem.asset index d88745f8b7..4be3fd6f8c 100644 --- a/data/assets/scene/solarsystem/missions/apollo/11/lem.asset +++ b/data/assets/scene/solarsystem/missions/apollo/11/lem.asset @@ -3,7 +3,7 @@ local moon_asset = asset.require("scene/solarsystem/planets/earth/moon/moon") -local lem_model = asset.syncedResource({ +local lem_model = asset.resource({ Name = "Apollo Lem Models", Type = "HttpSynchronization", Identifier = "apollo_lem_model", 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 a8f9f9d248..58f1aba6c4 100644 --- a/data/assets/scene/solarsystem/missions/apollo/11/lem_flipbook.asset +++ b/data/assets/scene/solarsystem/missions/apollo/11/lem_flipbook.asset @@ -9,7 +9,7 @@ local flipbookCount = 19 local flipbook = nil -local vrts = asset.syncedResource({ +local vrts = asset.resource({ Name = "Apollo 11 Flipbook", Type = "HttpSynchronization", Identifier = "apollo_11_flipbook", diff --git a/data/assets/scene/solarsystem/missions/apollo/15/apollo15.asset b/data/assets/scene/solarsystem/missions/apollo/15/apollo15.asset index d80e9bc775..8dfc61ccab 100644 --- a/data/assets/scene/solarsystem/missions/apollo/15/apollo15.asset +++ b/data/assets/scene/solarsystem/missions/apollo/15/apollo15.asset @@ -6,7 +6,7 @@ local kernels = asset.require("scene/solarsystem/missions/apollo/15/kernels") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Apollo Models", Type = "HttpSynchronization", Identifier = "apollo_models", diff --git a/data/assets/scene/solarsystem/missions/apollo/15/kernels.asset b/data/assets/scene/solarsystem/missions/apollo/15/kernels.asset index 6af820b829..0c6dacf3ff 100644 --- a/data/assets/scene/solarsystem/missions/apollo/15/kernels.asset +++ b/data/assets/scene/solarsystem/missions/apollo/15/kernels.asset @@ -1,4 +1,4 @@ -local folder = asset.syncedResource({ +local folder = asset.resource({ Name = "Apollo Kernels", Type = "HttpSynchronization", Identifier = "apollo_spice", diff --git a/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation2.asset b/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation2.asset index 899826a0de..a00bc27562 100644 --- a/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation2.asset +++ b/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation2.asset @@ -3,7 +3,7 @@ local moonAsset = asset.require("scene/solarsystem/planets/earth/moon/moon") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Apollo Boulders Models", Type = "HttpSynchronization", Identifier = "apollo_boulders", diff --git a/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation6.asset b/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation6.asset index ad31f48f21..3626401732 100644 --- a/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation6.asset +++ b/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation6.asset @@ -3,7 +3,7 @@ local moonAsset = asset.require("scene/solarsystem/planets/earth/moon/moon") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Apollo Boulders Models", Type = "HttpSynchronization", Identifier = "apollo_boulders", diff --git a/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation7.asset b/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation7.asset index 20b0b71409..bcaa71aa44 100644 --- a/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation7.asset +++ b/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation7.asset @@ -3,7 +3,7 @@ local moonAsset = asset.require("scene/solarsystem/planets/earth/moon/moon") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Apollo Boulders Models", Type = "HttpSynchronization", Identifier = "apollo_boulders", diff --git a/data/assets/scene/solarsystem/missions/apollo/17/lem.asset b/data/assets/scene/solarsystem/missions/apollo/17/lem.asset index af2be3ccc5..10a72ddd3c 100644 --- a/data/assets/scene/solarsystem/missions/apollo/17/lem.asset +++ b/data/assets/scene/solarsystem/missions/apollo/17/lem.asset @@ -3,7 +3,7 @@ local moonAsset = asset.require("scene/solarsystem/planets/earth/moon/moon") -local model = asset.syncedResource({ +local model = asset.resource({ Name = "Apollo Lem Models", Type = "HttpSynchronization", Identifier = "apollo_lem_model", diff --git a/data/assets/scene/solarsystem/missions/apollo/8/kernels.asset b/data/assets/scene/solarsystem/missions/apollo/8/kernels.asset index 9297926544..538effcfdf 100644 --- a/data/assets/scene/solarsystem/missions/apollo/8/kernels.asset +++ b/data/assets/scene/solarsystem/missions/apollo/8/kernels.asset @@ -1,4 +1,4 @@ -local kernelsFolder = asset.syncedResource({ +local kernelsFolder = asset.resource({ Name = "Apollo Kernels", Type = "HttpSynchronization", Identifier = "apollo_spice", diff --git a/data/assets/scene/solarsystem/missions/apollo/8/launch_model.asset b/data/assets/scene/solarsystem/missions/apollo/8/launch_model.asset index 374a029010..1fa667b234 100644 --- a/data/assets/scene/solarsystem/missions/apollo/8/launch_model.asset +++ b/data/assets/scene/solarsystem/missions/apollo/8/launch_model.asset @@ -4,7 +4,7 @@ local kernels = asset.require("./kernels") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Apollo Models", Type = "HttpSynchronization", Identifier = "apollo_models", diff --git a/data/assets/scene/solarsystem/missions/apollo/8/model.asset b/data/assets/scene/solarsystem/missions/apollo/8/model.asset index 93cb4aa90a..c93b47c34a 100644 --- a/data/assets/scene/solarsystem/missions/apollo/8/model.asset +++ b/data/assets/scene/solarsystem/missions/apollo/8/model.asset @@ -4,7 +4,7 @@ local kernels = asset.require("./kernels") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Apollo Models", Type = "HttpSynchronization", Identifier = "apollo_models", diff --git a/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset b/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset index 207ec3ed99..e5333e8134 100644 --- a/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset +++ b/data/assets/scene/solarsystem/missions/apollo/apollo_globebrowsing.asset @@ -5,28 +5,28 @@ local moon = asset.require("scene/solarsystem/planets/earth/moon/moon") asset.require("scene/solarsystem/planets/earth/moon/default_layers") -local heightmaps = asset.syncedResource({ +local heightmaps = asset.resource({ Name = "Apollo Globebrowsing Heightmaps", Type = "HttpSynchronization", Identifier = "apollo_globebrowsing_heightmaps", Version = 1 }) -local basemaps = asset.syncedResource({ +local basemaps = asset.resource({ Name = "Apollo Globebrowsing Basemaps", Type = "HttpSynchronization", Identifier = "apollo_globebrowsing_basemaps", Version = 1 }) -local naclighting = asset.syncedResource({ +local naclighting = asset.resource({ Name = "Apollo Globebrowsing NAC Lighting", Type = "HttpSynchronization", Identifier = "apollo_globebrowsing_naclighting", Version = 1 }) -local stations = asset.syncedResource({ +local stations = asset.resource({ Name = "Apollo 17 Globebrowsing Stations", Type = "HttpSynchronization", Identifier = "apollo_17_stations", diff --git a/data/assets/scene/solarsystem/missions/apollo/insignias_map.asset b/data/assets/scene/solarsystem/missions/apollo/insignias_map.asset index 0a3c9d7eb3..e6771b3c80 100644 --- a/data/assets/scene/solarsystem/missions/apollo/insignias_map.asset +++ b/data/assets/scene/solarsystem/missions/apollo/insignias_map.asset @@ -6,7 +6,7 @@ local moon = asset.require("scene/solarsystem/planets/earth/moon/moon") -local insigniasPath = asset.syncedResource({ +local insigniasPath = asset.resource({ Name = "Apollo Insignias", Type = "HttpSynchronization", Identifier = "apollo_insignias", diff --git a/data/assets/scene/solarsystem/missions/artemis/model.asset b/data/assets/scene/solarsystem/missions/artemis/model.asset index 1cd1625d95..8d7e8665df 100644 --- a/data/assets/scene/solarsystem/missions/artemis/model.asset +++ b/data/assets/scene/solarsystem/missions/artemis/model.asset @@ -3,7 +3,7 @@ local transforms = asset.require("./transforms") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Artemis Models", Type = "HttpSynchronization", Identifier = "artemis_1_models", diff --git a/data/assets/scene/solarsystem/missions/artemis/trail.asset b/data/assets/scene/solarsystem/missions/artemis/trail.asset index e4e66164aa..2077cc21f6 100644 --- a/data/assets/scene/solarsystem/missions/artemis/trail.asset +++ b/data/assets/scene/solarsystem/missions/artemis/trail.asset @@ -6,7 +6,7 @@ local moonTransforms = asset.require("scene/solarsystem/planets/earth/moon/moon" local ArtemisSpiceId = "-1023" -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Artemis Kernels", Type = "HttpSynchronization", Identifier = "artemis_1_kernels", diff --git a/data/assets/scene/solarsystem/missions/artemis/transforms.asset b/data/assets/scene/solarsystem/missions/artemis/transforms.asset index 6af48c6db4..59df655a91 100644 --- a/data/assets/scene/solarsystem/missions/artemis/transforms.asset +++ b/data/assets/scene/solarsystem/missions/artemis/transforms.asset @@ -3,7 +3,7 @@ local earthTransforms = asset.require("scene/solarsystem/planets/earth/transform -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Artemis Kernels", Type = "HttpSynchronization", Identifier = "artemis_1_kernels", diff --git a/data/assets/scene/solarsystem/missions/dawn/dawn.asset b/data/assets/scene/solarsystem/missions/dawn/dawn.asset index 535150e8df..b9c66b0ec6 100644 --- a/data/assets/scene/solarsystem/missions/dawn/dawn.asset +++ b/data/assets/scene/solarsystem/missions/dawn/dawn.asset @@ -4,21 +4,21 @@ local sun = asset.require("scene/solarsystem/sun/sun") -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Dawn Kernels", Type = "HttpSynchronization", Identifier = "dawn_kernels", Version = 3 }) -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Dawn Textures", Type = "HttpSynchronization", Identifier = "dawn_textures", Version = 1 }) -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Dawn Models", Type = "HttpSynchronization", Identifier = "dawn_model", diff --git a/data/assets/scene/solarsystem/missions/dawn/vesta.asset b/data/assets/scene/solarsystem/missions/dawn/vesta.asset index 9c0caeb690..a3bb63553a 100644 --- a/data/assets/scene/solarsystem/missions/dawn/vesta.asset +++ b/data/assets/scene/solarsystem/missions/dawn/vesta.asset @@ -2,28 +2,28 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Vesta Kernels", Type = "HttpSynchronization", Identifier = "vesta_kernels", Version = 1 }) -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Vesta Textures", Type = "HttpSynchronization", Identifier = "vesta_textures", Version = 1 }) -local images = asset.syncedResource({ +local images = asset.resource({ Name = "Vesta Images", Type = "HttpSynchronization", Identifier = "vesta_images", Version = 1 }) -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Vesta Models", Type = "HttpSynchronization", Identifier = "vesta_model", diff --git a/data/assets/scene/solarsystem/missions/insight/edl.asset b/data/assets/scene/solarsystem/missions/insight/edl.asset index 8f9154cfb1..41f0a9a093 100644 --- a/data/assets/scene/solarsystem/missions/insight/edl.asset +++ b/data/assets/scene/solarsystem/missions/insight/edl.asset @@ -6,14 +6,14 @@ local mars = asset.require("scene/solarsystem/planets/mars/mars") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Insight Models Chutes", Type = "HttpSynchronization", Identifier = "insight_models", Version = 2 }) -local ikernels = asset.syncedResource({ +local ikernels = asset.resource({ Name = "Insight Kernels", Type = "HttpSynchronization", Identifier = "insight_kernels", diff --git a/data/assets/scene/solarsystem/missions/juice/fieldlines.asset b/data/assets/scene/solarsystem/missions/juice/fieldlines.asset index 87c1a52555..c33e2af97a 100644 --- a/data/assets/scene/solarsystem/missions/juice/fieldlines.asset +++ b/data/assets/scene/solarsystem/missions/juice/fieldlines.asset @@ -2,7 +2,7 @@ local transforms = asset.require("./transforms") -local data = asset.syncedResource({ +local data = asset.resource({ Type = "HttpSynchronization", Name = "Ganymede Plane Simulations", Identifier = "juice_ganymede_fieldlines", @@ -21,7 +21,7 @@ local GanymedeMagnetosphere = { ColorMethod = "By Quantity", ColorQuantity = 0, ColorTableRanges = { { 62.556353386366766, 1665.5534182835445 } }, - ColorTablePaths = { asset.localResource("CMR-illuminance2.txt") }, + ColorTablePaths = { asset.resource("CMR-illuminance2.txt") }, Color = { 0.03, 0.0, 0.0, 1.0 }, ParticleSpacing = 42.0, ParticleSize = 30.0, diff --git a/data/assets/scene/solarsystem/missions/juice/kernels.asset b/data/assets/scene/solarsystem/missions/juice/kernels.asset index db17a3b901..8e83a877c4 100644 --- a/data/assets/scene/solarsystem/missions/juice/kernels.asset +++ b/data/assets/scene/solarsystem/missions/juice/kernels.asset @@ -1,4 +1,4 @@ -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "JUICE Kernels", Type = "HttpSynchronization", Identifier = "juice_kernels", diff --git a/data/assets/scene/solarsystem/missions/juice/model.asset b/data/assets/scene/solarsystem/missions/juice/model.asset index c6a25379f0..29ca6ccde6 100644 --- a/data/assets/scene/solarsystem/missions/juice/model.asset +++ b/data/assets/scene/solarsystem/missions/juice/model.asset @@ -3,7 +3,7 @@ local transforms = asset.require("./transforms") -local model = asset.syncedResource({ +local model = asset.resource({ Name = "JUICE Model", Type = "HttpSynchronization", Identifier = "juice_models", diff --git a/data/assets/scene/solarsystem/missions/juice/plane.asset b/data/assets/scene/solarsystem/missions/juice/plane.asset index 8ce670a85e..f7cccdf666 100644 --- a/data/assets/scene/solarsystem/missions/juice/plane.asset +++ b/data/assets/scene/solarsystem/missions/juice/plane.asset @@ -4,7 +4,7 @@ local transforms = asset.require("./transforms") -- Datasets created using the script found at: -- https://github.com/OpenSpace/scripts/tree/master/juice-gphio-image-conversion -local data = asset.syncedResource({ +local data = asset.resource({ Type = "HttpSynchronization", Name = "Ganymede Plane Simulations", Identifier = "juice_ganymede_plane_cuts", diff --git a/data/assets/scene/solarsystem/missions/juno/juno.asset b/data/assets/scene/solarsystem/missions/juno/juno.asset index 49e25abfd2..750f1c6e42 100644 --- a/data/assets/scene/solarsystem/missions/juno/juno.asset +++ b/data/assets/scene/solarsystem/missions/juno/juno.asset @@ -6,7 +6,7 @@ local kernels = asset.require("./kernels") -local model = asset.syncedResource({ +local model = asset.resource({ Name = "Juno Model", Type = "HttpSynchronization", Identifier = "juno_model", diff --git a/data/assets/scene/solarsystem/missions/juno/kernels.asset b/data/assets/scene/solarsystem/missions/juno/kernels.asset index 570b4fcc16..e21f711bcb 100644 --- a/data/assets/scene/solarsystem/missions/juno/kernels.asset +++ b/data/assets/scene/solarsystem/missions/juno/kernels.asset @@ -1,5 +1,5 @@ -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Juno Kernels", Type = "HttpSynchronization", Identifier = "juno_kernels", diff --git a/data/assets/scene/solarsystem/missions/messenger/kernels.asset b/data/assets/scene/solarsystem/missions/messenger/kernels.asset index 9be3910dc7..35920865e2 100644 --- a/data/assets/scene/solarsystem/missions/messenger/kernels.asset +++ b/data/assets/scene/solarsystem/missions/messenger/kernels.asset @@ -1,4 +1,4 @@ -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Messenger Kernels", Type = "HttpSynchronization", Identifier = "messenger_spice", diff --git a/data/assets/scene/solarsystem/missions/messenger/mercurymagnetosphere.asset b/data/assets/scene/solarsystem/missions/messenger/mercurymagnetosphere.asset index 2f5015562f..90973b583d 100644 --- a/data/assets/scene/solarsystem/missions/messenger/mercurymagnetosphere.asset +++ b/data/assets/scene/solarsystem/missions/messenger/mercurymagnetosphere.asset @@ -1,6 +1,6 @@ local mercuryTransforms = asset.require("scene/solarsystem/planets/mercury/transforms") -local localFolder = asset.syncedResource({ +local localFolder = asset.resource({ Name = "Mercury Magnetosphere", Type = "HttpSynchronization", Identifier = "mercury_magnetosphere", diff --git a/data/assets/scene/solarsystem/missions/messenger/messenger.asset b/data/assets/scene/solarsystem/missions/messenger/messenger.asset index 47e5850e97..8c47e7f462 100644 --- a/data/assets/scene/solarsystem/missions/messenger/messenger.asset +++ b/data/assets/scene/solarsystem/missions/messenger/messenger.asset @@ -4,7 +4,7 @@ local mercuryTransforms = asset.require("scene/solarsystem/planets/mercury/trans local kernels = asset.require("./kernels") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Messenger Models", Type = "HttpSynchronization", Identifier = "messenger_model", diff --git a/data/assets/scene/solarsystem/missions/newhorizons/charon.asset b/data/assets/scene/solarsystem/missions/newhorizons/charon.asset index e75ca41ad1..8c2c09ed59 100644 --- a/data/assets/scene/solarsystem/missions/newhorizons/charon.asset +++ b/data/assets/scene/solarsystem/missions/newhorizons/charon.asset @@ -3,7 +3,7 @@ local sunTransforms = asset.require("scene/solarsystem/sun/transforms") -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Charon Textures", Type = "HttpSynchronization", Identifier = "charon_textures", diff --git a/data/assets/scene/solarsystem/missions/newhorizons/kernels.asset b/data/assets/scene/solarsystem/missions/newhorizons/kernels.asset index 0b998693ab..435d5c9a49 100644 --- a/data/assets/scene/solarsystem/missions/newhorizons/kernels.asset +++ b/data/assets/scene/solarsystem/missions/newhorizons/kernels.asset @@ -1,4 +1,4 @@ -local Kernels = asset.syncedResource({ +local Kernels = asset.resource({ Name = "New Horizons Kernels", Type = "HttpSynchronization", Identifier = "newhorizons_kernels", diff --git a/data/assets/scene/solarsystem/missions/newhorizons/label.asset b/data/assets/scene/solarsystem/missions/newhorizons/label.asset index ba41511879..3d1ccfdd95 100644 --- a/data/assets/scene/solarsystem/missions/newhorizons/label.asset +++ b/data/assets/scene/solarsystem/missions/newhorizons/label.asset @@ -2,7 +2,7 @@ local NewHorizonsModel = asset.require("./model") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "New Horizons Model", Type = "HttpSynchronization", Identifier = "newhorizons_model", diff --git a/data/assets/scene/solarsystem/missions/newhorizons/model.asset b/data/assets/scene/solarsystem/missions/newhorizons/model.asset index 85abd73ebe..7805cd6674 100644 --- a/data/assets/scene/solarsystem/missions/newhorizons/model.asset +++ b/data/assets/scene/solarsystem/missions/newhorizons/model.asset @@ -3,7 +3,7 @@ local sun = asset.require("scene/solarsystem/sun/sun") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "New Horizons Model", Type = "HttpSynchronization", Identifier = "newhorizons_model", diff --git a/data/assets/scene/solarsystem/missions/newhorizons/othermoons.asset b/data/assets/scene/solarsystem/missions/newhorizons/othermoons.asset index 547b844a69..fca0413850 100644 --- a/data/assets/scene/solarsystem/missions/newhorizons/othermoons.asset +++ b/data/assets/scene/solarsystem/missions/newhorizons/othermoons.asset @@ -5,28 +5,28 @@ local Styx = asset.require("scene/solarsystem/dwarf_planets/pluto/minor/styx") -local hydraTextures = asset.syncedResource({ +local hydraTextures = asset.resource({ Name = "Hydra Textures", Type = "HttpSynchronization", Identifier = "hydra_textures", Version = 1 }) -local kerberosTextures = asset.syncedResource({ +local kerberosTextures = asset.resource({ Name = "Kerberos Textures", Type = "HttpSynchronization", Identifier = "kerberos_textures", Version = 1 }) -local nixTextures = asset.syncedResource({ +local nixTextures = asset.resource({ Name = "Nix Textures", Type = "HttpSynchronization", Identifier = "nix_textures", Version = 1 }) -local styxTextures = asset.syncedResource({ +local styxTextures = asset.resource({ Name = "Styx Textures", Type = "HttpSynchronization", Identifier = "styx_textures", diff --git a/data/assets/scene/solarsystem/missions/newhorizons/pluto.asset b/data/assets/scene/solarsystem/missions/newhorizons/pluto.asset index b2d33dfb94..040af9beef 100644 --- a/data/assets/scene/solarsystem/missions/newhorizons/pluto.asset +++ b/data/assets/scene/solarsystem/missions/newhorizons/pluto.asset @@ -4,28 +4,28 @@ local kernels = asset.require("./kernels") -local assets = asset.syncedResource({ +local assets = asset.resource({ Name = "Pluto Assets", Type = "HttpSynchronization", Identifier = "newhorizons_plutoencounter_pluto_assets", Version = 1 }) -local encounterTextures = asset.syncedResource({ +local encounterTextures = asset.resource({ Name = "Pluto Encounter Textures", Type = "HttpSynchronization", Identifier = "newhorizons_plutoencounter_pluto_textures", Version = 4 }) -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Pluto Textures", Type = "HttpSynchronization", Identifier = "pluto_textures", Version = 5 }) -local images = asset.syncedResource({ +local images = asset.resource({ Name = "Pluto Images", Type = "HttpSynchronization", Identifier = "newhorizons_plutoencounter_pluto_images", diff --git a/data/assets/scene/solarsystem/missions/osirisrex/bennu.asset b/data/assets/scene/solarsystem/missions/osirisrex/bennu.asset index 60e8a60bf6..264df9361e 100644 --- a/data/assets/scene/solarsystem/missions/osirisrex/bennu.asset +++ b/data/assets/scene/solarsystem/missions/osirisrex/bennu.asset @@ -3,7 +3,7 @@ local sun = asset.require("scene/solarsystem/sun/sun") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Bennu Models", Type = "HttpSynchronization", Identifier = "bennu_models", diff --git a/data/assets/scene/solarsystem/missions/osirisrex/bennu_projection.asset b/data/assets/scene/solarsystem/missions/osirisrex/bennu_projection.asset index 74f24bbd89..45b2c0b99d 100644 --- a/data/assets/scene/solarsystem/missions/osirisrex/bennu_projection.asset +++ b/data/assets/scene/solarsystem/missions/osirisrex/bennu_projection.asset @@ -3,21 +3,21 @@ local sunTransforms = asset.require("scene/solarsystem/sun/transforms") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Bennu Models", Type = "HttpSynchronization", Identifier = "bennu_models", Version = 2 }) -local images = asset.syncedResource({ +local images = asset.resource({ Name = "Bennu Images Approach", Type = "HttpSynchronization", Identifier = "osirisrex_bennu_images_approach", Version = 1 }) -local imagesA = asset.syncedResource({ +local imagesA = asset.resource({ Name = "Bennu Images A", Type = "HttpSynchronization", Identifier = "osirisrex_bennu_images_orbit_a", diff --git a/data/assets/scene/solarsystem/missions/osirisrex/imageplane.asset b/data/assets/scene/solarsystem/missions/osirisrex/imageplane.asset index 6dc8f08889..5c4f091058 100644 --- a/data/assets/scene/solarsystem/missions/osirisrex/imageplane.asset +++ b/data/assets/scene/solarsystem/missions/osirisrex/imageplane.asset @@ -2,7 +2,7 @@ local transforms = asset.require("./transforms") -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "Bennu Textures", Type = "HttpSynchronization", Identifier = "bennu_textures", diff --git a/data/assets/scene/solarsystem/missions/osirisrex/kernels.asset b/data/assets/scene/solarsystem/missions/osirisrex/kernels.asset index e3147a0153..ac9468e85b 100644 --- a/data/assets/scene/solarsystem/missions/osirisrex/kernels.asset +++ b/data/assets/scene/solarsystem/missions/osirisrex/kernels.asset @@ -1,4 +1,4 @@ -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Osiris Rex Kernels", Type = "HttpSynchronization", Identifier = "osirisrex_kernels", diff --git a/data/assets/scene/solarsystem/missions/osirisrex/model.asset b/data/assets/scene/solarsystem/missions/osirisrex/model.asset index 51f43d3b60..ed47b8928d 100644 --- a/data/assets/scene/solarsystem/missions/osirisrex/model.asset +++ b/data/assets/scene/solarsystem/missions/osirisrex/model.asset @@ -6,7 +6,7 @@ local kernels = asset.require("./kernels") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Osiris Rex Models", Type = "HttpSynchronization", Identifier = "osirisrex_models", diff --git a/data/assets/scene/solarsystem/missions/perseverance/model.asset b/data/assets/scene/solarsystem/missions/perseverance/model.asset index 35e044dca2..717ed59314 100644 --- a/data/assets/scene/solarsystem/missions/perseverance/model.asset +++ b/data/assets/scene/solarsystem/missions/perseverance/model.asset @@ -5,7 +5,7 @@ local spice = asset.require("./spice") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Perseverance Model", Type = "HttpSynchronization", Identifier = "perseverance_models", diff --git a/data/assets/scene/solarsystem/missions/perseverance/spice.asset b/data/assets/scene/solarsystem/missions/perseverance/spice.asset index 73d631ed94..dd0f679a9c 100644 --- a/data/assets/scene/solarsystem/missions/perseverance/spice.asset +++ b/data/assets/scene/solarsystem/missions/perseverance/spice.asset @@ -1,4 +1,4 @@ -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Mars 2020 Kernels", Type = "HttpSynchronization", Identifier = "perseverance_kernels", diff --git a/data/assets/scene/solarsystem/missions/pioneer/pioneer10.asset b/data/assets/scene/solarsystem/missions/pioneer/pioneer10.asset index d89b7809e3..c42dc91827 100644 --- a/data/assets/scene/solarsystem/missions/pioneer/pioneer10.asset +++ b/data/assets/scene/solarsystem/missions/pioneer/pioneer10.asset @@ -3,7 +3,7 @@ local model = asset.require("scene/solarsystem/missions/pioneer/pioneermodel") -local kernelsFolder = asset.syncedResource({ +local kernelsFolder = asset.resource({ Name = "Pioneer Kernels", Type = "HttpSynchronization", Identifier = "pioneer_10_spice", diff --git a/data/assets/scene/solarsystem/missions/pioneer/pioneer11.asset b/data/assets/scene/solarsystem/missions/pioneer/pioneer11.asset index 6b58a8e995..083552a11d 100644 --- a/data/assets/scene/solarsystem/missions/pioneer/pioneer11.asset +++ b/data/assets/scene/solarsystem/missions/pioneer/pioneer11.asset @@ -3,7 +3,7 @@ local model = asset.require("scene/solarsystem/missions/pioneer/pioneermodel") -local kernelsFolder = asset.syncedResource({ +local kernelsFolder = asset.resource({ Name = "Pioneer Kernels", Type = "HttpSynchronization", Identifier = "pioneer_11_spice", diff --git a/data/assets/scene/solarsystem/missions/pioneer/pioneermodel.asset b/data/assets/scene/solarsystem/missions/pioneer/pioneermodel.asset index bd138d8ee8..ce63f52782 100644 --- a/data/assets/scene/solarsystem/missions/pioneer/pioneermodel.asset +++ b/data/assets/scene/solarsystem/missions/pioneer/pioneermodel.asset @@ -2,7 +2,7 @@ local sun = asset.require("scene/solarsystem/sun/sun") -local modelFolder = asset.syncedResource({ +local modelFolder = asset.resource({ Name = "Pioneer 10/11 Models", Type = "HttpSynchronization", Identifier = "pioneer_10_11_model", diff --git a/data/assets/scene/solarsystem/missions/rosetta/67p.asset b/data/assets/scene/solarsystem/missions/rosetta/67p.asset index 131fc2e01b..d906c582a9 100644 --- a/data/assets/scene/solarsystem/missions/rosetta/67p.asset +++ b/data/assets/scene/solarsystem/missions/rosetta/67p.asset @@ -2,21 +2,21 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local textures = asset.syncedResource({ +local textures = asset.resource({ Name = "67P Textures", Type = "HttpSynchronization", Identifier = "67p_textures", Version = 2 }) -local models = asset.syncedResource({ +local models = asset.resource({ Name = "67P Models", Type = "HttpSynchronization", Identifier = "67p_models", Version = 1 }) -local images = asset.syncedResource({ +local images = asset.resource({ Name = "Rosetta Images", Type = "HttpSynchronization", Identifier = "rosettaimages", diff --git a/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset b/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset index 4db204dae8..9c85324cd9 100644 --- a/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset +++ b/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset @@ -4,14 +4,14 @@ local transforms = asset.require("./67p") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Rosetta Models", Type = "HttpSynchronization", Identifier = "rosetta_model", Version = 5 }) -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Rosetta Kernels", Type = "HttpSynchronization", Identifier = "rosetta_kernels", diff --git a/data/assets/scene/solarsystem/missions/voyager/voyager1.asset b/data/assets/scene/solarsystem/missions/voyager/voyager1.asset index a028e015e8..e9325eb7a9 100644 --- a/data/assets/scene/solarsystem/missions/voyager/voyager1.asset +++ b/data/assets/scene/solarsystem/missions/voyager/voyager1.asset @@ -3,14 +3,14 @@ local sunTransforms = asset.require("scene/solarsystem/sun/transforms") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Voyager Model", Type = "HttpSynchronization", Identifier = "voyager_model", Version = 1 }) -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Voyager 1 Kernels", Type = "HttpSynchronization", Identifier = "voyager1_spice", diff --git a/data/assets/scene/solarsystem/missions/voyager/voyager2.asset b/data/assets/scene/solarsystem/missions/voyager/voyager2.asset index 0655d269fa..8a06f6db83 100644 --- a/data/assets/scene/solarsystem/missions/voyager/voyager2.asset +++ b/data/assets/scene/solarsystem/missions/voyager/voyager2.asset @@ -3,14 +3,14 @@ local sunTransforms = asset.require("scene/solarsystem/sun/transforms") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "Voyager Model", Type = "HttpSynchronization", Identifier = "voyager_model", Version = 1 }) -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Voyager 2 Kernels", Type = "HttpSynchronization", Identifier = "voyager2_spice", diff --git a/data/assets/scene/solarsystem/missions/voyagerpioneer/voyager1_2__pioneer10_11.asset b/data/assets/scene/solarsystem/missions/voyagerpioneer/voyager1_2__pioneer10_11.asset index ba8948f0d9..fff6bbce10 100644 --- a/data/assets/scene/solarsystem/missions/voyagerpioneer/voyager1_2__pioneer10_11.asset +++ b/data/assets/scene/solarsystem/missions/voyagerpioneer/voyager1_2__pioneer10_11.asset @@ -1,11 +1,11 @@ -local voyager_horizons = asset.syncedResource({ +local voyager_horizons = asset.resource({ Name = "Voyager horizons", Type = "HttpSynchronization", Identifier = "voyager_horizons", Version = 1 }) -local pioneer_horizons = asset.syncedResource({ +local pioneer_horizons = asset.resource({ Name = "Pioneer horizons", Type = "HttpSynchronization", Identifier = "pioneer_horizons", diff --git a/data/assets/scene/solarsystem/planets/earth/earth.asset b/data/assets/scene/solarsystem/planets/earth/earth.asset index 103382bf2a..23c2ee9806 100644 --- a/data/assets/scene/solarsystem/planets/earth/earth.asset +++ b/data/assets/scene/solarsystem/planets/earth/earth.asset @@ -2,7 +2,7 @@ local transforms = asset.require("./transforms") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Earth Labels", Type = "HttpSynchronization", Identifier = "earth_labels", diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/corona/corona20170821.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/corona/corona20170821.asset index ca47bbc223..cfc13f6fe1 100644 --- a/data/assets/scene/solarsystem/planets/earth/eclipses/corona/corona20170821.asset +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/corona/corona20170821.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local videos = asset.syncedResource({ +local videos = asset.resource({ Name = "Eclipse Corona Video", Type = "HttpSynchronization", Identifier = "earth-eclipse-corona", diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular_data.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular_data.asset index e834107191..1a74b9beb5 100644 --- a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular_data.asset +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/annular_data.asset @@ -1,4 +1,4 @@ -local data = asset.syncedResource({ +local data = asset.resource({ Name = "Annular Eclipse Paths", Type = "HttpSynchronization", Identifier = "earth-eclipse-path-annular", diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid_data.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid_data.asset index e2ef0f9ffd..7c2f11f26d 100644 --- a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid_data.asset +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/hybrid_data.asset @@ -1,4 +1,4 @@ -local data = asset.syncedResource({ +local data = asset.resource({ Name = "Hybrid Eclipse Paths", Type = "HttpSynchronization", Identifier = "earth-eclipse-path-hybrid", diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total_data.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total_data.asset index 826632b191..ff5da00b86 100644 --- a/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total_data.asset +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/paths/total_data.asset @@ -1,4 +1,4 @@ -local data = asset.syncedResource({ +local data = asset.resource({ Name = "Total Eclipse Paths", Type = "HttpSynchronization", Identifier = "earth-eclipse-path-total", diff --git a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l1.asset b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l1.asset index 313853a4a5..d558c956f5 100644 --- a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l1.asset +++ b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l1.asset @@ -3,14 +3,14 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local circle = asset.syncedResource({ +local circle = asset.resource({ Name = "Circle", Type = "HttpSynchronization", Identifier = "circle_image", Version = 1 }) -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Lagrange Kernels", Type = "HttpSynchronization", Identifier = "earth_lagrange_kernels", diff --git a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l2.asset b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l2.asset index 3d165d1940..d819543680 100644 --- a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l2.asset +++ b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l2.asset @@ -4,14 +4,14 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local circle = asset.syncedResource({ +local circle = asset.resource({ Name = "Circle", Type = "HttpSynchronization", Identifier = "circle_image", Version = 1 }) -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Lagrange Kernels", Type = "HttpSynchronization", Identifier = "earth_lagrange_kernels", diff --git a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l4.asset b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l4.asset index ff370b3f89..6ac6259cf5 100644 --- a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l4.asset +++ b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l4.asset @@ -3,14 +3,14 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local circle = asset.syncedResource({ +local circle = asset.resource({ Name = "Circle", Type = "HttpSynchronization", Identifier = "circle_image", Version = 1 }) -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Lagrange Kernels", Type = "HttpSynchronization", Identifier = "earth_lagrange_kernels", diff --git a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l5.asset b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l5.asset index 66b90ffb49..b0368bd06c 100644 --- a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l5.asset +++ b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l5.asset @@ -3,14 +3,14 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local circle = asset.syncedResource({ +local circle = asset.resource({ Name = "Circle", Type = "HttpSynchronization", Identifier = "circle_image", Version = 1 }) -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Lagrange Kernels", Type = "HttpSynchronization", Identifier = "earth_lagrange_kernels", diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/blue_marble.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/blue_marble.asset index 886df1be13..10ac031e8e 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/blue_marble.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/blue_marble.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../earth") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Earth Textures", Type = "HttpSynchronization", Identifier = "earth_textures", diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_newyork.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_newyork.asset index a816a633c9..d8b2b24aef 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_newyork.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "BMNG_NewYork", Name = "BMNG [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("bmng_newyork.wms"), + FilePath = asset.resource("bmng_newyork.wms"), Description = [[Web loaded full resolution map of Blue Marble Next Generation. This map is hosted on the OpenSpace servers in New York]] } diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_sweden.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_sweden.asset index 3f71e1f649..039798cad7 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_sweden.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "BMNG_Sweden", Name = "BMNG [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("bmng_sweden.wms"), + FilePath = asset.resource("bmng_sweden.wms"), Description = [[Web loaded full resolution map of Blue Marble Next Generation. This map is hosted on the OpenSpace servers in Sweden]] } diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_utah.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_utah.asset index 71e07bc43a..746beb4da7 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_utah.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "BMNG_Utah", Name = "BMNG [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("bmng_utah.wms"), + FilePath = asset.resource("bmng_utah.wms"), Description = [[Web loaded full resolution map of Blue Marble Next Generation. This map is hosted on the OpenSpace servers in Utah]] } diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_noaa20_combo.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_noaa20_combo.asset index 82dbdcf012..ad00fcb6af 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_noaa20_combo.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_noaa20_combo.asset @@ -36,7 +36,7 @@ local Layer = { TileProvider = { Identifier = "ESRI_World_Imagery", Name = "ESRI World Imagery", - FilePath = asset.localResource("esri_world_imagery.wms"), + FilePath = asset.resource("esri_world_imagery.wms"), PadTiles = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_viirs_combo.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_viirs_combo.asset index 4449baadd4..9bf3296f8a 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_viirs_combo.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_viirs_combo.asset @@ -36,7 +36,7 @@ local Layer = { TileProvider = { Identifier = "ESRI_World_Imagery", Name = "ESRI World Imagery", - FilePath = asset.localResource("esri_world_imagery.wms"), + FilePath = asset.resource("esri_world_imagery.wms"), PadTiles = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_world_imagery.asset b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_world_imagery.asset index 25c3faf776..510d022f1c 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_world_imagery.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/esri_world_imagery.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "ESRI_World_Imagery", Name = "ESRI World Imagery", Enabled = asset.enabled, - FilePath = asset.localResource("esri_world_imagery.wms"), + FilePath = asset.resource("esri_world_imagery.wms"), Description = [[World Imagery provides one meter or better satellite and aerial imagery in many parts of the world and lower resolution satellite imagery worldwide. The map includes 15m TerraColor imagery at small and mid-scales diff --git a/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/blue_marble_height.asset b/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/blue_marble_height.asset index f6d07c0577..99fd5da004 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/blue_marble_height.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/blue_marble_height.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../earth") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Earth Textures", Type = "HttpSynchronization", Identifier = "earth_textures", diff --git a/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/terrain_tileset.asset b/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/terrain_tileset.asset index 40bb76d119..725438b659 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/terrain_tileset.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/heightlayers/terrain_tileset.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Terrain_tileset", Name = "Terrain tileset", Enabled = asset.enabled, - FilePath = asset.localResource("terrain_tileset.wms"), + FilePath = asset.resource("terrain_tileset.wms"), TilePixelSize = 129, Description = [[This globe layer presents elevation data at approximately 90m or 1km per pixel resolution for the world. The elevation data includes 90m Shuttle Radar diff --git a/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_at_night_2012.asset b/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_at_night_2012.asset index ab8a2062e7..bf5d210a4d 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_at_night_2012.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_at_night_2012.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Earth_at_Night_2012", Name = "Earth at Night 2012", Enabled = asset.enabled, - FilePath = asset.localResource("earth_at_night_2012.wms"), + FilePath = asset.resource("earth_at_night_2012.wms"), Description = [[The lights of cities and villages trace the outlines of civilization in this global view]] } diff --git a/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_night_texture.asset b/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_night_texture.asset index df716c1df8..87d1650b61 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_night_texture.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/nightlayers/earth_night_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../earth") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Earth Textures", Type = "HttpSynchronization", Identifier = "earth_textures", diff --git a/data/assets/scene/solarsystem/planets/earth/layers/overlays/coastlines.asset b/data/assets/scene/solarsystem/planets/earth/layers/overlays/coastlines.asset index 4a35585b02..73bdf4dbb9 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/overlays/coastlines.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/overlays/coastlines.asset @@ -4,7 +4,7 @@ local globe = asset.require("../../earth") local Layer = { Identifier = "Coastlines", - FilePath = asset.localResource("coastlines.wms"), + FilePath = asset.resource("coastlines.wms"), Enabled = asset.enabled } diff --git a/data/assets/scene/solarsystem/planets/earth/layers/overlays/reference_features.asset b/data/assets/scene/solarsystem/planets/earth/layers/overlays/reference_features.asset index 0e8f3d3ec8..732a417970 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/overlays/reference_features.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/overlays/reference_features.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Reference_Features", Name = "Reference Features", Enabled = asset.enabled, - FilePath = asset.localResource("reference_features.wms") + FilePath = asset.resource("reference_features.wms") } diff --git a/data/assets/scene/solarsystem/planets/earth/layers/overlays/reference_labels.asset b/data/assets/scene/solarsystem/planets/earth/layers/overlays/reference_labels.asset index 462b635511..44e0ba7299 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/overlays/reference_labels.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/overlays/reference_labels.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Reference_Labels", Name = "Reference Labels", Enabled = asset.enabled, - FilePath = asset.localResource("reference_labels.wms") + FilePath = asset.resource("reference_labels.wms") } diff --git a/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_newyork.asset b/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_newyork.asset index b961f411a6..83d6cca607 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_newyork.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Name = "Gebco [New York]", Identifier = "Gebco_NewYork", Enabled = asset.enabled, - FilePath = asset.localResource("gebco_newyork.wms") + FilePath = asset.resource("gebco_newyork.wms") } diff --git a/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_sweden.asset b/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_sweden.asset index 8b3c2e49d1..711be5ded2 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_sweden.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Name = "Gebco [Sweden]", Identifier = "Gebco_Sweden", Enabled = asset.enabled, - FilePath = asset.localResource("gebco_sweden.wms") + FilePath = asset.resource("gebco_sweden.wms") } diff --git a/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_utah.asset b/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_utah.asset index aa6ea8e5a0..245e08d926 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_utah.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_utah.asset @@ -6,7 +6,7 @@ local Layer = { Name = "Gebco [Utah]", Identifier = "Gebco_Utah", Enabled = asset.enabled, - FilePath = asset.localResource("gebco_utah.wms") + FilePath = asset.resource("gebco_utah.wms") } diff --git a/data/assets/scene/solarsystem/planets/earth/layers/watermasks/modis_water_mask.asset b/data/assets/scene/solarsystem/planets/earth/layers/watermasks/modis_water_mask.asset index 73f03a8c97..52b5b9ed9a 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/watermasks/modis_water_mask.asset +++ b/data/assets/scene/solarsystem/planets/earth/layers/watermasks/modis_water_mask.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "MODIS_Water_Mask", Name = "MODIS Water Mask", Enabled = asset.enabled, - FilePath = asset.localResource("modis_water_mask.wms") + FilePath = asset.resource("modis_water_mask.wms") } diff --git a/data/assets/scene/solarsystem/planets/earth/magnetosphere/magnetosphere.asset b/data/assets/scene/solarsystem/planets/earth/magnetosphere/magnetosphere.asset index 0d10b2134d..de8720ac4a 100644 --- a/data/assets/scene/solarsystem/planets/earth/magnetosphere/magnetosphere.asset +++ b/data/assets/scene/solarsystem/planets/earth/magnetosphere/magnetosphere.asset @@ -2,9 +2,9 @@ local transforms = asset.require("./transforms_magnetosphere") -local transferFunction = asset.localResource("CMR-illuminance2.txt") +local transferFunction = asset.resource("CMR-illuminance2.txt") -local fieldlinesDirectory = asset.syncedResource({ +local fieldlinesDirectory = asset.resource({ Name = "Magnetosphere 2012 event", Type = "HttpSynchronization", Identifier = "magnetosphere_2012_event", diff --git a/data/assets/scene/solarsystem/planets/earth/magnetosphere/transforms_magnetosphere.asset b/data/assets/scene/solarsystem/planets/earth/magnetosphere/transforms_magnetosphere.asset index 64b90d6b05..d13e5aed46 100644 --- a/data/assets/scene/solarsystem/planets/earth/magnetosphere/transforms_magnetosphere.asset +++ b/data/assets/scene/solarsystem/planets/earth/magnetosphere/transforms_magnetosphere.asset @@ -3,7 +3,7 @@ asset.require("spice/base") -local GSMKernel = asset.localResource("../kernels/GSM.ti") +local GSMKernel = asset.resource("../kernels/GSM.ti") local GSMReferenceFrame = { Identifier = "GSMReferenceFrame", diff --git a/data/assets/scene/solarsystem/planets/earth/markers.asset b/data/assets/scene/solarsystem/planets/earth/markers.asset index 04fe9c6f57..fd9ff9cde9 100644 --- a/data/assets/scene/solarsystem/planets/earth/markers.asset +++ b/data/assets/scene/solarsystem/planets/earth/markers.asset @@ -2,7 +2,7 @@ local transforms = asset.require("./transforms") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Earth Textures", Type = "HttpSynchronization", Identifier = "earth_textures", diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/apollo_15_metric_newyork.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/apollo_15_metric_newyork.asset index 0f04dd67e0..2dbb8b30d0 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/apollo_15_metric_newyork.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/apollo_15_metric_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Apollo15Metric_NewYork", Name = "Apollo 15 Metric Cam [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("apollo_15_metric_newyork.wms"), + FilePath = asset.resource("apollo_15_metric_newyork.wms"), Description = [[ The Apollo 15 Metric (Mapping) Camera obtained high-quality metric photographs, on black and white film, with high geometric precision of the lunar surface from lunar diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_newyork.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_newyork.asset index a6a076cd0f..2c5a74352f 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_newyork.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "ClemUvvis_NewYork", Name = "Clem Uvvis [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("clemuvvis_newyork.wms"), + FilePath = asset.resource("clemuvvis_newyork.wms"), Settings = { Gamma = 1.14, Multiplier = 1.4 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_sweden.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_sweden.asset index 8fed8d750a..b47dc00156 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_sweden.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "ClemUvvis_Sweden", Name = "Clem Uvvis [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("clemuvvis_sweden.wms"), + FilePath = asset.resource("clemuvvis_sweden.wms"), Settings = { Gamma = 1.14, Multiplier = 1.4 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_utah.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_utah.asset index b1d7a0e6fa..9af2387895 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_utah.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "ClemUvvis_Utah", Name = "Clem Uvvis [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("clemuvvis_utah.wms"), + FilePath = asset.resource("clemuvvis_utah.wms"), Settings = { Gamma = 1.14, Multiplier = 1.4 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_newyork.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_newyork.asset index 1e27e41394..5510619d20 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_newyork.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Kaguya_NewYork", Name = "Kaguya [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("kaguya_newyork.vrt"), + FilePath = asset.resource("kaguya_newyork.vrt"), Settings = { Gamma = 1.0, Multiplier = 1.23 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_sweden.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_sweden.asset index df22023c77..bdcf860861 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_sweden.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Kaguya_Sweden", Name = "Kaguya [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("kaguya_sweden.vrt"), + FilePath = asset.resource("kaguya_sweden.vrt"), Settings = { Gamma = 1.0, Multiplier = 1.23 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_utah.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_utah.asset index ccc6e1db1b..039f491c67 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_utah.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Kaguya_Utah", Name = "Kaguya [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("kaguya_utah.vrt"), + FilePath = asset.resource("kaguya_utah.vrt"), Settings = { Gamma = 1.0, Multiplier = 1.23 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lo_mr_mosaic_newyork.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lo_mr_mosaic_newyork.asset index ea8a0f12f2..32cf9e3350 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lo_mr_mosaic_newyork.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lo_mr_mosaic_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "LO_MR_Mosaic_NewYork", Name = "Moon Lunar Orbiter Digital Photographic Global Mosaic 59m v1 [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("lo_mr_mosaic_newyork.wms"), + FilePath = asset.resource("lo_mr_mosaic_newyork.wms"), Description = [[ This Lunar Orbiter (LO) mosaic of the Moon was constructed using photographs acquired by LO III, IV and V. Work towards constructing the global mosaic diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lo_mr_mosaic_sweden.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lo_mr_mosaic_sweden.asset index bdb6289b30..d29dda3b1e 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lo_mr_mosaic_sweden.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lo_mr_mosaic_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "LO_MR_Mosaic_Sweden", Name = "Moon Lunar Orbiter Digital Photographic Global Mosaic 59m v1 [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("lo_mr_mosaic_sweden.wms"), + FilePath = asset.resource("lo_mr_mosaic_sweden.wms"), Description = [[ This Lunar Orbiter (LO) mosaic of the Moon was constructed using photographs acquired by LO III, IV and V. Work towards constructing the global mosaic spanned over seven diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_newyork.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_newyork.asset index 6ec6420c62..e8637aaf32 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_newyork.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Lola_Clr_Shade_NewYork", Name = "LRO LOLA Color Shaded Relief 388m v4 [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("lola_clr_shade_newyork.wms"), + FilePath = asset.resource("lola_clr_shade_newyork.wms"), Description = [[This is a colorized shaded-relief of a original polar digital elevation model (DEM) from the Lunar Orbiter Laser Altimeter (LOLA; Smith et al., 2010), an instrument on the National Aeronautics and Space Agency (NASA) Lunar Reconnaissance diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_sweden.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_sweden.asset index 573f18aa71..24982ee682 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_sweden.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Lola_Clr_Shade_Sweden", Name = "LRO LOLA Color Shaded Relief 388m v4 [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("lola_clr_shade_sweden.wms"), + FilePath = asset.resource("lola_clr_shade_sweden.wms"), Description = [[This is a colorized shaded-relief of a original polar digital elevation model (DEM) from the Lunar Orbiter Laser Altimeter (LOLA; Smith et al., 2010), an instrument on the National Aeronautics and Space Agency (NASA) Lunar Reconnaissance diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_utah.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_utah.asset index bbd2185b61..d482bfc423 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_utah.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Lola_Clr_Shade_Utah", Name = "LRO LOLA Color Shaded Relief 388m v4 [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("lola_clr_shade_utah.wms"), + FilePath = asset.resource("lola_clr_shade_utah.wms"), Description = [[This is a colorized shaded-relief of a original polar digital elevation model (DEM) from the Lunar Orbiter Laser Altimeter (LOLA; Smith et al., 2010), an instrument on the National Aeronautics and Space Agency (NASA) Lunar Reconnaissance diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_newyork.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_newyork.asset index b7dfd05486..f7d0abd6ac 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_newyork.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Lola_Shade_NewYork", Name = "Lola Shade [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("lola_shade_newyork.wms"), + FilePath = asset.resource("lola_shade_newyork.wms"), Description = [[This is a shaded-relief of a original polar digital elevation model (DEM) from the Lunar Orbiter Laser Altimeter (LOLA; Smith et al., 2010), an instrument on the National Aeronautics and Space Agency (NASA) Lunar Reconnaissance Orbiter (LRO) diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_sweden.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_sweden.asset index 32febd2575..494aa6558c 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_sweden.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Lola_Shade_Sweden", Name = "Lola Shade [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("lola_shade_sweden.wms"), + FilePath = asset.resource("lola_shade_sweden.wms"), Description = [[This is a shaded-relief of a original polar digital elevation model (DEM) from the Lunar Orbiter Laser Altimeter (LOLA; Smith et al., 2010), an instrument on the National Aeronautics and Space Agency (NASA) Lunar Reconnaissance Orbiter (LRO) diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_utah.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_utah.asset index 98ede5bd6b..eb6ea2fcbd 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_utah.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Lola_Shade_Utah", Name = "Lola Shade [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("lola_shade_utah.wms"), + FilePath = asset.resource("lola_shade_utah.wms"), Description = [[This is a shaded-relief of a original polar digital elevation model (DEM) from the Lunar Orbiter Laser Altimeter (LOLA; Smith et al., 2010), an instrument on the National Aeronautics and Space Agency (NASA) Lunar Reconnaissance Orbiter (LRO) diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/moon_texture.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/moon_texture.asset index 35249206b2..4d1126830a 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/moon_texture.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/moon_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../moon") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Moon Textures", Type = "HttpSynchronization", Identifier = "moon_textures", diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_newyork.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_newyork.asset index 7a89103305..e115aa99cc 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_newyork.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "UvvisHybrid_NewYork", Name = "Uvvis Hybrid [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("uvvishybrid_newyork.wms"), + FilePath = asset.resource("uvvishybrid_newyork.wms"), Settings = { Gamma = 0.52, Multiplier = 0.65 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_sweden.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_sweden.asset index eba3c74b84..a614c22a97 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_sweden.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "UvvisHybrid_Sweden", Name = "Uvvis Hybrid [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("uvvishybrid_sweden.wms"), + FilePath = asset.resource("uvvishybrid_sweden.wms"), Settings = { Gamma = 0.52, Multiplier = 0.65 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_utah.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_utah.asset index 1fab137ebf..65178ebebf 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_utah.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "UvvisHybrid_Utah", Name = "Uvvis Hybrid [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("uvvishybrid_utah.wms"), + FilePath = asset.resource("uvvishybrid_utah.wms"), Settings = { Gamma = 0.52, Multiplier = 0.65 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_newyork.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_newyork.asset index c4416d5928..5c51f24967 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_newyork.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "WAC_NewYork", Name = "WAC [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("wac_newyork.wms"), + FilePath = asset.resource("wac_newyork.wms"), Settings = { Gamma = 0.84 }, Description = [[Lunar Reconnaissance Orbiter Camera (LROC) Wide Angle Camera (WAC) aboard the Lunar Reconnaissance Orbiter (LRO) has allowed the instrument team to diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_sweden.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_sweden.asset index cf28ca5bd3..11e95cdaa4 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_sweden.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "WAC_Sweden", Name = "WAC [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("wac_sweden.wms"), + FilePath = asset.resource("wac_sweden.wms"), Settings = { Gamma = 0.84 }, Description = [[Lunar Reconnaissance Orbiter Camera (LROC) Wide Angle Camera (WAC) aboard the Lunar Reconnaissance Orbiter (LRO) has allowed the instrument team to diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_utah.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_utah.asset index a5033b2521..2a5e3c8b91 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_utah.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "WAC_Utah", Name = "WAC [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("wac_utah.wms"), + FilePath = asset.resource("wac_utah.wms"), Settings = { Gamma = 0.84 }, Description = [[Lunar Reconnaissance Orbiter Camera (LROC) Wide Angle Camera (WAC) aboard the Lunar Reconnaissance Orbiter (LRO) has allowed the instrument team to diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_newyork.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_newyork.asset index c6619d72f9..fe3dff4f5e 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_newyork.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "WAC_V1_NewYork", Name = "WAC V1 [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("wac_v1_newyork.wms"), + FilePath = asset.resource("wac_v1_newyork.wms"), Settings = { Gamma = 0.84 }, Description = [[Lunar Reconnaissance Orbiter Camera (LROC) Wide Angle Camera (WAC) aboard the Lunar Reconnaissance Orbiter (LRO) has allowed the instrument team to diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_sweden.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_sweden.asset index eb0c4fad2a..8f78d2c428 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_sweden.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "WAC_V1_Sweden", Name = "WAC V1 [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("wac_v1_sweden.wms"), + FilePath = asset.resource("wac_v1_sweden.wms"), Settings = { Gamma = 0.84 }, Description = [[Lunar Reconnaissance Orbiter Camera (LROC) Wide Angle Camera (WAC) aboard the Lunar Reconnaissance Orbiter (LRO) has allowed the instrument team to diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_utah.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_utah.asset index bbeff64218..79e888a969 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_utah.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "WAC_V1_Utah", Name = "WAC V1 [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("wac_v1_utah.wms"), + FilePath = asset.resource("wac_v1_utah.wms"), Settings = { Gamma = 0.84 }, Description = [[Lunar Reconnaissance Orbiter Camera (LROC) Wide Angle Camera (WAC) aboard the Lunar Reconnaissance Orbiter (LRO) has allowed the instrument team to diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_newyork.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_newyork.asset index 2bb42cb75a..636261ef0a 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_newyork.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "LolaDem_NewYork", Name = "Lola DEM [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("loladem_newyork.wms"), + FilePath = asset.resource("loladem_newyork.wms"), TilePixelSize = 360, Settings = { Multiplier = 0.5 }, Description = [[This digital elevation model (DEM) is based on data from the Lunar diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_sweden.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_sweden.asset index 1f104ba1a7..1077329238 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_sweden.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "LolaDem_Sweden", Name = "Lola DEM [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("loladem_sweden.wms"), + FilePath = asset.resource("loladem_sweden.wms"), TilePixelSize = 360, Settings = { Multiplier = 0.5 } } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_utah.asset b/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_utah.asset index e71e47147e..126ba159e3 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_utah.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "LolaDem_Utah", Name = "Lola DEM [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("loladem_utah.wms"), + FilePath = asset.resource("loladem_utah.wms"), TilePixelSize = 360, Settings = { Multiplier = 0.5 }, Description = [[This digital elevation model (DEM) is based on data from the Lunar diff --git a/data/assets/scene/solarsystem/planets/earth/moon/markers.asset b/data/assets/scene/solarsystem/planets/earth/moon/markers.asset index e6fc604800..6a0e63ed03 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/markers.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/markers.asset @@ -2,7 +2,7 @@ local transforms = asset.require("./moon") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Moon Textures", Type = "HttpSynchronization", Identifier = "moon_textures", diff --git a/data/assets/scene/solarsystem/planets/earth/moon/moon.asset b/data/assets/scene/solarsystem/planets/earth/moon/moon.asset index 145d109c29..a2a23e1dff 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/moon.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/moon.asset @@ -5,7 +5,7 @@ local earthAsset = asset.require("../earth") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Moon Labels", Type = "HttpSynchronization", Identifier = "moon_labels", diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_15_Metric_Cam_DEM.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_15_Metric_Cam_DEM.asset index 964d2edc0e..035b0ddc0b 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_15_Metric_Cam_DEM.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_15_Metric_Cam_DEM.asset @@ -9,28 +9,28 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_Apollo15_MetricCam_ClrShade_Global_1024ppd = { Identifier = "Apollo15_MetricCam_ClrShade_Global_1024ppd", Name = [[Apollo 15 Metric Cam DEM, ColorHillshade]], - FilePath = asset.localResource("Apollo_15_Metric_Cam_DEM/ColorHillshade.vrt"), + FilePath = asset.resource("Apollo_15_Metric_Cam_DEM/ColorHillshade.vrt"), Description = [[]] } local treks_Apollo15_MetricCam_ClrConf_Global_1024ppd = { Identifier = "Apollo15_MetricCam_ClrConf_Global_1024ppd", Name = [[Apollo 15 Metric Cam DEM, Colorized Confidence]], - FilePath = asset.localResource("Apollo_15_Metric_Cam_DEM/Colorized_Confidence.vrt"), + FilePath = asset.resource("Apollo_15_Metric_Cam_DEM/Colorized_Confidence.vrt"), Description = [[]] } local treks_Apollo15_MetricCam_Gray_Global_1024ppd = { Identifier = "Apollo15_MetricCam_Gray_Global_1024ppd", Name = [[Apollo 15 Metric Cam DEM, Grayscale]], - FilePath = asset.localResource("Apollo_15_Metric_Cam_DEM/Grayscale.vrt"), + FilePath = asset.resource("Apollo_15_Metric_Cam_DEM/Grayscale.vrt"), Description = [[]] } local treks_Apollo15_MetricCam_Shade_Global_1024ppd = { Identifier = "Apollo15_MetricCam_Shade_Global_1024ppd", Name = [[Apollo 15 Metric Cam DEM, Hillshade]], - FilePath = asset.localResource("Apollo_15_Metric_Cam_DEM/Hillshade.vrt"), + FilePath = asset.resource("Apollo_15_Metric_Cam_DEM/Hillshade.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_15_Pan_Cam_DEM.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_15_Pan_Cam_DEM.asset index a55c41ca8c..4a982bc9af 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_15_Pan_Cam_DEM.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_15_Pan_Cam_DEM.asset @@ -9,21 +9,21 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_Apollo15_PanCam_ClrShade_25N311E_5mp = { Identifier = "Apollo15_PanCam_ClrShade_25N311E_5mp", Name = [[Apollo 15 Pan Cam DEM, Aristarchus Plateau 1, ColorHillshade]], - FilePath = asset.localResource("Apollo_15_Pan_Cam_DEM/Aristarchus_Plateau_1.vrt"), + FilePath = asset.resource("Apollo_15_Pan_Cam_DEM/Aristarchus_Plateau_1.vrt"), Description = [[]] } local treks_Apollo15_PanCam_ClrShade_28N307E_3mp = { Identifier = "Apollo15_PanCam_ClrShade_28N307E_3mp", Name = [[Apollo 15 Pan Cam DEM, Aristarchus Plateau 2, ColorHillshade]], - FilePath = asset.localResource("Apollo_15_Pan_Cam_DEM/Aristarchus_Plateau_2.vrt"), + FilePath = asset.resource("Apollo_15_Pan_Cam_DEM/Aristarchus_Plateau_2.vrt"), Description = [[]] } local treks_Apollo15_PanCam_ClrShade_19S129E_5mp = { Identifier = "Apollo15_PanCam_ClrShade_19S129E_5mp", Name = [[Apollo 15 Pan Cam DEM, Tsiolkovskiy Crater, ColorHillshade]], - FilePath = asset.localResource("Apollo_15_Pan_Cam_DEM/Tsiolkovskiy_Crater.vrt"), + FilePath = asset.resource("Apollo_15_Pan_Cam_DEM/Tsiolkovskiy_Crater.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_15_Pan_Cam_Image_Mosaic.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_15_Pan_Cam_Image_Mosaic.asset index a85f90fcb7..ce84cd9ef3 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_15_Pan_Cam_Image_Mosaic.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_15_Pan_Cam_Image_Mosaic.asset @@ -9,21 +9,21 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_Apollo15_PanCam_Mosaic_25N311E_150cmp = { Identifier = "Apollo15_PanCam_Mosaic_25N311E_150cmp", Name = [[Apollo 15 Pan Cam Image Mosaic, Aristarchus Plateau 1]], - FilePath = asset.localResource("Apollo_15_Pan_Cam_Image_Mosaic/Aristarchus_Plateau_1.vrt"), + FilePath = asset.resource("Apollo_15_Pan_Cam_Image_Mosaic/Aristarchus_Plateau_1.vrt"), Description = [[]] } local treks_Apollo15_PanCam_Mosaic_28N307E_1mp = { Identifier = "Apollo15_PanCam_Mosaic_28N307E_1mp", Name = [[Apollo 15 Pan Cam Image Mosaic, Aristarchus Plateau 2]], - FilePath = asset.localResource("Apollo_15_Pan_Cam_Image_Mosaic/Aristarchus_Plateau_2.vrt"), + FilePath = asset.resource("Apollo_15_Pan_Cam_Image_Mosaic/Aristarchus_Plateau_2.vrt"), Description = [[]] } local treks_Apollo15_PanCam_Mosaic_19S129E_2mp = { Identifier = "Apollo15_PanCam_Mosaic_19S129E_2mp", Name = [[Apollo 15 Pan Cam Image Mosaic, Tsiolkovskiy Crater]], - FilePath = asset.localResource("Apollo_15_Pan_Cam_Image_Mosaic/Tsiolkovskiy_Crater.vrt"), + FilePath = asset.resource("Apollo_15_Pan_Cam_Image_Mosaic/Tsiolkovskiy_Crater.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_16_Metric_Cam_DEM.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_16_Metric_Cam_DEM.asset index fb5b11d029..78188ee50a 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_16_Metric_Cam_DEM.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_16_Metric_Cam_DEM.asset @@ -9,21 +9,21 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_Apollo16_MetricCam_ClrConf_Global_1024ppd = { Identifier = "Apollo16_MetricCam_ClrConf_Global_1024ppd", Name = [[Apollo 16 Metric Cam DEM, Colorized Confidence]], - FilePath = asset.localResource("Apollo_16_Metric_Cam_DEM/Colorized_Confidence.vrt"), + FilePath = asset.resource("Apollo_16_Metric_Cam_DEM/Colorized_Confidence.vrt"), Description = [[]] } local treks_Apollo16_MetricCam_Gray_Global_1024ppd = { Identifier = "Apollo16_MetricCam_Gray_Global_1024ppd", Name = [[Apollo 16 Metric Cam DEM, Grayscale]], - FilePath = asset.localResource("Apollo_16_Metric_Cam_DEM/Grayscale.vrt"), + FilePath = asset.resource("Apollo_16_Metric_Cam_DEM/Grayscale.vrt"), Description = [[]] } local treks_Apollo16_MetricCam_Shade_Global_1024ppd = { Identifier = "Apollo16_MetricCam_Shade_Global_1024ppd", Name = [[Apollo 16 Metric Cam DEM, Hillshade]], - FilePath = asset.localResource("Apollo_16_Metric_Cam_DEM/Hillshade.vrt"), + FilePath = asset.resource("Apollo_16_Metric_Cam_DEM/Hillshade.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_17_Metric_Cam_DEM.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_17_Metric_Cam_DEM.asset index 2bf7517b6e..0fb53f33c8 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_17_Metric_Cam_DEM.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_17_Metric_Cam_DEM.asset @@ -9,14 +9,14 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_Apollo17_MetricCam_ClrShade_Global_1024ppd = { Identifier = "Apollo17_MetricCam_ClrShade_Global_1024ppd", Name = [[Apollo 17 Metric Cam DEM, ColorHillshade]], - FilePath = asset.localResource("Apollo_17_Metric_Cam_DEM/ColorHillshade.vrt"), + FilePath = asset.resource("Apollo_17_Metric_Cam_DEM/ColorHillshade.vrt"), Description = [[]] } local treks_Apollo17_MetricCam_Gray_Global_1024ppd = { Identifier = "Apollo17_MetricCam_Gray_Global_1024ppd", Name = [[Apollo 17 Metric Cam DEM, Grayscale]], - FilePath = asset.localResource("Apollo_17_Metric_Cam_DEM/Grayscale.vrt"), + FilePath = asset.resource("Apollo_17_Metric_Cam_DEM/Grayscale.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_Zone_Metric_Cam.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_Zone_Metric_Cam.asset index 0999b62972..ae5681787f 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_Zone_Metric_Cam.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_Zone_Metric_Cam.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_ApolloZone_MetricCam_Shade_Global_1024ppd = { Identifier = "ApolloZone_MetricCam_Shade_Global_1024ppd", Name = [[Apollo Zone Metric Cam, Hillshade]], - FilePath = asset.localResource("Apollo_Zone_Metric_Cam/Hillshade.vrt"), + FilePath = asset.resource("Apollo_Zone_Metric_Cam/Hillshade.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_Zone_Metric_Cam_DEM.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_Zone_Metric_Cam_DEM.asset index bd9c029f1e..b42db397d7 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_Zone_Metric_Cam_DEM.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Apollo_Zone_Metric_Cam_DEM.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_ApolloZone_MetricCam_ClrShade_Global_1024ppd = { Identifier = "ApolloZone_MetricCam_ClrShade_Global_1024ppd", Name = [[Apollo Zone Metric Cam DEM, ColorHillshade]], - FilePath = asset.localResource("Apollo_Zone_Metric_Cam_DEM/ColorHillshade.vrt"), + FilePath = asset.resource("Apollo_Zone_Metric_Cam_DEM/ColorHillshade.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Global.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Global.asset index 382f4693db..81130e1b68 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Global.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Global.asset @@ -9,119 +9,119 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_Apollo15_MetricCam_Mosaic_Global_4096ppd = { Identifier = "Apollo15_MetricCam_Mosaic_Global_4096ppd", Name = [[Apollo 15 Metric Cam Image Mosaic]], - FilePath = asset.localResource("Global/Apollo_15_Metric_Cam_Image_Mosaic.vrt"), + FilePath = asset.resource("Global/Apollo_15_Metric_Cam_Image_Mosaic.vrt"), Description = [[]] } local treks_Apollo17_MetricCam_Mosaic_Global_3033ppd = { Identifier = "Apollo17_MetricCam_Mosaic_Global_3033ppd", Name = [[Apollo 17 Metric Cam Image Mosaic]], - FilePath = asset.localResource("Global/Apollo_17_Metric_Cam_Image_Mosaic.vrt"), + FilePath = asset.resource("Global/Apollo_17_Metric_Cam_Image_Mosaic.vrt"), Description = [[]] } local treks_ApolloZone_MetricCam_Mosaic_Global_3033ppd = { Identifier = "ApolloZone_MetricCam_Mosaic_Global_3033ppd", Name = [[Apollo Zone Metric Cam Image Mosaic]], - FilePath = asset.localResource("Global/Apollo_Zone_Metric_Cam_Image_Mosaic.vrt"), + FilePath = asset.resource("Global/Apollo_Zone_Metric_Cam_Image_Mosaic.vrt"), Description = [[]] } local treks_Clem_UVVIS_FeO_Clr_Global_152ppd = { Identifier = "Clem_UVVIS_FeO_Clr_Global_152ppd", Name = [[Clementine UVVIS FeO Weight Percent]], - FilePath = asset.localResource("Global/Clementine_UVVIS_FeO_Weight_Percent.vrt"), + FilePath = asset.resource("Global/Clementine_UVVIS_FeO_Weight_Percent.vrt"), Description = [[]] } local treks_Clem_UVVIS_OpticalMaturity_Gray_Global_152ppd = { Identifier = "Clem_UVVIS_OpticalMaturity_Gray_Global_152ppd", Name = [[Clementine UVVIS Optical Maturity]], - FilePath = asset.localResource("Global/Clementine_UVVIS_Optical_Maturity.vrt"), + FilePath = asset.resource("Global/Clementine_UVVIS_Optical_Maturity.vrt"), Description = [[]] } local treks_Clem_UVVIS_TiO2_Clr_Global_152ppd = { Identifier = "Clem_UVVIS_TiO2_Clr_Global_152ppd", Name = [[Clementine UVVIS TiO2 Weight Percent]], - FilePath = asset.localResource("Global/Clementine_UVVIS_TiO2_Weight_Percent.vrt"), + FilePath = asset.resource("Global/Clementine_UVVIS_TiO2_Weight_Percent.vrt"), Description = [[]] } local treks_Kaguya_TCortho_Mosaic_Global_4096ppd = { Identifier = "Kaguya_TCortho_Mosaic_Global_4096ppd", Name = [[Kaguya TC Ortho Mosaic]], - FilePath = asset.localResource("Global/Kaguya_TC_Ortho_Mosaic.vrt"), + FilePath = asset.resource("Global/Kaguya_TC_Ortho_Mosaic.vrt"), Description = [[]] } local treks_LP_NS_H_Clr_Global_2ppd = { Identifier = "LP_NS_H_Clr_Global_2ppd", Name = [[LP NS H Abundance]], - FilePath = asset.localResource("Global/LP_NS_H_Abundance.vrt"), + FilePath = asset.resource("Global/LP_NS_H_Abundance.vrt"), Description = [[]] } local treks_LRO_Diviner_CF_NoFill_Global_8ppd = { Identifier = "LRO_Diviner_CF_NoFill_Global_8ppd", Name = [[LRO Diviner CF Mosaic]], - FilePath = asset.localResource("Global/LRO_Diviner_CF_Mosaic.vrt"), + FilePath = asset.resource("Global/LRO_Diviner_CF_Mosaic.vrt"), Description = [[]] } local treks_LRO_WAC_Mosaic_Global_303ppd = { Identifier = "LRO_WAC_Mosaic_Global_303ppd", Name = [[LRO LROC WAC Image Mosaic]], - FilePath = asset.localResource("Global/LRO_LROC_WAC_Image_Mosaic.vrt"), + FilePath = asset.resource("Global/LRO_LROC_WAC_Image_Mosaic.vrt"), Description = [[]] } local treks_LRO_MiniRF_S1_Gray_Global_128ppd = { Identifier = "LRO_MiniRF_S1_Gray_Global_128ppd", Name = [[LRO Mini-RF First Stokes Parameter]], - FilePath = asset.localResource("Global/LRO_Mini-RF_First_Stokes_Parameter.vrt"), + FilePath = asset.resource("Global/LRO_Mini-RF_First_Stokes_Parameter.vrt"), Description = [[]] } local treks_LRO_WAC_Mosaic_Global_303ppd_v02 = { Identifier = "LRO_WAC_Mosaic_Global_303ppd_v02", Name = [[LRO WAC Mosaic v2]], - FilePath = asset.localResource("Global/LRO_WAC_Mosaic_v2.vrt"), + FilePath = asset.resource("Global/LRO_WAC_Mosaic_v2.vrt"), Description = [[]] } local treks_SchrodingerCraterMareUnit_50cmV10eq = { Identifier = "SchrodingerCraterMareUnit_50cmV10eq", Name = [[LROC NAC Uncontrolled Mosaic of Mare Unit in Schrodinger Crater]], - FilePath = asset.localResource("Global/LROC_NAC_Uncontrolled_Mosaic_of_Mare_Unit_in_Schrodinger_Crater.vrt"), + FilePath = asset.resource("Global/LROC_NAC_Uncontrolled_Mosaic_of_Mare_Unit_in_Schrodinger_Crater.vrt"), Description = [[This is a 50cm/px uncontrolled visible image mosaic generated using Lunar Reconnaissance Orbiter Camera (LROC) Narrow Angle Camera (NAC) images from the Lunar Reconnaissance Orbiter mission. Each NAC image was registered horizontally to the LRO's Lunar Orbiter Laser Altimeter (LOLA) global DEM, and then mosaicked together and color balanced. ]] } local treks_SchrodingerCraterMassif_50cmV10eq = { Identifier = "SchrodingerCraterMassif_50cmV10eq", Name = [[LROC NAC Uncontrolled Mosaic of Massif in Schrodinger Crater]], - FilePath = asset.localResource("Global/LROC_NAC_Uncontrolled_Mosaic_of_Massif_in_Schrodinger_Crater.vrt"), + FilePath = asset.resource("Global/LROC_NAC_Uncontrolled_Mosaic_of_Massif_in_Schrodinger_Crater.vrt"), Description = [[This is a 50cm/px uncontrolled visible image mosaic generated using Lunar Reconnaissance Orbiter Camera (LROC) Narrow Angle Camera (NAC) images from the Lunar Reconnaissance Orbiter mission. Each NAC image was registered horizontally to the LRO's Lunar Orbiter Laser Altimeter (LOLA) global DEM, and then mosaicked together and color balanced. ]] } local treks_LRO_LOLAKaguya_ClrHillshade_60N60S_512ppd = { Identifier = "LRO_LOLAKaguya_ClrHillshade_60N60S_512ppd", Name = [[LRO LOLA and Kaguya TC Color Hillshade 512ppd]], - FilePath = asset.localResource("Global/LRO_LOLA_and_Kaguya_TC_Color_Hillshade_512ppd.vrt"), + FilePath = asset.resource("Global/LRO_LOLA_and_Kaguya_TC_Color_Hillshade_512ppd.vrt"), Description = [[This is a colorized shaded-relief representation of the Lunar surface generated from the LOLA and Kaguya merged DEM product. The LOLA and Kaguya Teams have created an improved lunar digital elevation model (DEM) covering latitudes within ±60°, at a horizontal resolution of 512 pixels per degree (∼59 m at the equator) and a typical vertical accuracy ∼3 to 4 m. This DEM is constructed from ∼4.5×109 geodetically-accurate topographic heights from the Lunar Orbiter Laser Altimeter (LOLA) onboard the Lunar Reconnaissance Orbiter, to which we co-registered 43,200 stereo-derived DEMs (each 1×1 degree) from the SELENE Terrain Camera (TC) (∼1010 pixels total). After co-registration, approximately 90% of the TC DEMs show root-mean-square vertical residuals with the LOLA data of <5 m compared to ∼50% prior to co-registration. We use the co-registered TC data to estimate and correct orbital and pointing geolocation errors from the LOLA altimetric profiles (typically amounting to <10 m horizontally and <1 m vertically). By combining both co-registered datasets, we obtain a near-global DEM with high geodetic accuracy, and without the need for surface interpolation. We evaluate the resulting LOLA + TC merged DEM (designated as “SLDEM2015”) with particular attention to quantifying seams and crossover errors. The legend coveys the mapping colors to elevation values (meters) and map values are referred to a radius of 1737400 m.]] } local treks_LRO_LOLAKaguya_Hillshade_60N60S_512ppd = { Identifier = "LRO_LOLAKaguya_Hillshade_60N60S_512ppd", Name = [[LRO LOLA and Kaguya TC Hillshade 512ppd]], - FilePath = asset.localResource("Global/LRO_LOLA_and_Kaguya_TC_Hillshade_512ppd.vrt"), + FilePath = asset.resource("Global/LRO_LOLA_and_Kaguya_TC_Hillshade_512ppd.vrt"), Description = [[This is a shaded-relief representation of the Lunar surface generated from the LOLA and Kaguya merged DEM product. The LOLA and Kaguya Teams have created an improved lunar digital elevation model (DEM) covering latitudes within ±60°, at a horizontal resolution of 512 pixels per degree (∼59 m at the equator) and a typical vertical accuracy ∼3 to 4 m. This DEM is constructed from ∼4.5×109 geodetically-accurate topographic heights from the Lunar Orbiter Laser Altimeter (LOLA) onboard the Lunar Reconnaissance Orbiter, to which we co-registered 43,200 stereo-derived DEMs (each 1×1 degree) from the SELENE Terrain Camera (TC) (∼1010 pixels total). After co-registration, approximately 90% of the TC DEMs show root-mean-square vertical residuals with the LOLA data of <5 m compared to ∼50% prior to co-registration. We use the co-registered TC data to estimate and correct orbital and pointing geolocation errors from the LOLA altimetric profiles (typically amounting to <10 m horizontally and <1 m vertically). By combining both co-registered datasets, we obtain a near-global DEM with high geodetic accuracy, and without the need for surface interpolation. We evaluate the resulting LOLA + TC merged DEM (designated as “SLDEM2015”) with particular attention to quantifying seams and crossover errors. Elevation values are in meters and map values are referred to a radius of 1737400 m.]] } local treks_Lunar_Clementine_UVVIS_Warp_ClrRatio_Global_200m = { Identifier = "Lunar_Clementine_UVVIS_Warp_ClrRatio_Global_200m", Name = [[Clementine UVVIS Warped Color Ratio]], - FilePath = asset.localResource("Global/Clementine_UVVIS_Warped_Color_Ratio.vrt"), + FilePath = asset.resource("Global/Clementine_UVVIS_Warped_Color_Ratio.vrt"), Description = [[This base represents the Clementine Ultraviolet/Visible (UVVIS) warped color-ratio mineral map. This was generated from the UVVIS mosaics using three spectral filters (415, 750, and 1000 nm) and which were previously warped (spatially adjusted) to the ULCN2005 control network. The mosaic is a composite in which the ratio of the 750/415nm bands is used for the red-channel brightness, 415/750nm for the blue channel, and the 750/1000nm ratio controls the green channel. Resolution of this mosaic is 200 meters per pixel (m). Color interpretations: @@ -134,14 +134,14 @@ For more information on how the color ratio was derived, please see Lucy et al., local treks_LRO_LOLA_Illumination_NPole65N_240m_EQ = { Identifier = "LRO_LOLA_Illumination_NPole65N_240m_EQ", Name = [[LOLA Permanently Shadowed Regions Northpole 240m]], - FilePath = asset.localResource("Global/LOLA_Permanently_Shadowed_Regions_Northpole_240m.vrt"), + FilePath = asset.resource("Global/LOLA_Permanently_Shadowed_Regions_Northpole_240m.vrt"), Description = [[This data product is a map of the permanently shadowed regions (PSRs) in the lunar North Pole. The map resolution is 240m/pix by 240m/pix, true at the pole in polar stereographic (spherical) projection. The calculations are based on the LOLA elevation map LDEM_75N_240M and are described in. The values are binary, indicating whether a pixel is in permanent shadow (1) or not (0, NoDATA).]] } local treks_LRO_LOLA_Illumination_SPole65S_240m_EQ = { Identifier = "LRO_LOLA_Illumination_SPole65S_240m_EQ", Name = [[LOLA Permanently Shadowed Regions Southpole 240m]], - FilePath = asset.localResource("Global/LOLA_Permanently_Shadowed_Regions_Southpole_240m.vrt"), + FilePath = asset.resource("Global/LOLA_Permanently_Shadowed_Regions_Southpole_240m.vrt"), Description = [[This data product is a map of the permanently shadowed regions (PSRs) in the lunar South Pole. The map resolution is 240m/pix by 240m/pix, true at the pole in polar stereographic (spherical) projection. The calculations are based on the LOLA elevation map LDEM_75S_240M and are described in. The values are binary, indicating whether a pixel is in permanent shadow (1) or not (0, NoDATA).]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Kaguya_LGM2011_Freeair_Gravity.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Kaguya_LGM2011_Freeair_Gravity.asset index 2042128903..ecb16dc40f 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Kaguya_LGM2011_Freeair_Gravity.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Kaguya_LGM2011_Freeair_Gravity.asset @@ -9,14 +9,14 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_Kaguya_LGM2011_FreeairGravity_Colorized_Global_mgal3m_20ppd = { Identifier = "Kaguya_LGM2011_FreeairGravity_Colorized_Global_mgal3m_20ppd", Name = [[Kaguya LGM2011 Freeair Gravity, Colorized]], - FilePath = asset.localResource("Kaguya_LGM2011_Freeair_Gravity/Colorized.vrt"), + FilePath = asset.resource("Kaguya_LGM2011_Freeair_Gravity/Colorized.vrt"), Description = [[]] } local treks_Kaguya_LGM2011_FreeairGravity_Gray_Global_mgal3m_20ppd = { Identifier = "Kaguya_LGM2011_FreeairGravity_Gray_Global_mgal3m_20ppd", Name = [[Kaguya LGM2011 Freeair Gravity, Greyscale]], - FilePath = asset.localResource("Kaguya_LGM2011_Freeair_Gravity/Greyscale.vrt"), + FilePath = asset.resource("Kaguya_LGM2011_Freeair_Gravity/Greyscale.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Kaguya_LGM2011_Surface_Gravity.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Kaguya_LGM2011_Surface_Gravity.asset index 0fa16b1f6c..6f91fd6335 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Kaguya_LGM2011_Surface_Gravity.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/Kaguya_LGM2011_Surface_Gravity.asset @@ -9,14 +9,14 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_Kaguya_LGM2011_SurfaceGravity_Colorized_Global_mgal3m_20ppd = { Identifier = "Kaguya_LGM2011_SurfaceGravity_Colorized_Global_mgal3m_20ppd", Name = [[Kaguya LGM2011 Surface Gravity, Colorized]], - FilePath = asset.localResource("Kaguya_LGM2011_Surface_Gravity/Colorized.vrt"), + FilePath = asset.resource("Kaguya_LGM2011_Surface_Gravity/Colorized.vrt"), Description = [[]] } local treks_Kaguya_LGM2011_SurfaceGravity_Gray_Global_mgal3m_20ppd = { Identifier = "Kaguya_LGM2011_SurfaceGravity_Gray_Global_mgal3m_20ppd", Name = [[Kaguya LGM2011 Surface Gravity, Greyscale]], - FilePath = asset.localResource("Kaguya_LGM2011_Surface_Gravity/Greyscale.vrt"), + FilePath = asset.resource("Kaguya_LGM2011_Surface_Gravity/Greyscale.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_Roughness_16ppd.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_Roughness_16ppd.asset index e78e82d395..9bcb27c76e 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_Roughness_16ppd.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_Roughness_16ppd.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_LOLA_ClrRoughness_Global_16ppd = { Identifier = "LRO_LOLA_ClrRoughness_Global_16ppd", Name = [[LOLA Roughness 16ppd, Colorized]], - FilePath = asset.localResource("LOLA_Roughness_16ppd/Colorized.vrt"), + FilePath = asset.resource("LOLA_Roughness_16ppd/Colorized.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_Slope_16ppd.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_Slope_16ppd.asset index 341af32a88..911e56f518 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_Slope_16ppd.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_Slope_16ppd.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_LOLA_ClrSlope_Global_16ppd = { Identifier = "LRO_LOLA_ClrSlope_Global_16ppd", Name = [[LOLA Slope 16ppd, Colorized]], - FilePath = asset.localResource("LOLA_Slope_16ppd/Colorized.vrt"), + FilePath = asset.resource("LOLA_Slope_16ppd/Colorized.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_Slope_Northpole_120m.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_Slope_Northpole_120m.asset index 5404d41424..19dd265fbf 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_Slope_Northpole_120m.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_Slope_Northpole_120m.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_LOLA_ClrSlope_NPole75N_120m_EQ = { Identifier = "LRO_LOLA_ClrSlope_NPole75N_120m_EQ", Name = [[LOLA Slope Northpole 120m, Colorized]], - FilePath = asset.localResource("LOLA_Slope_Northpole_120m/Colorized.vrt"), + FilePath = asset.resource("LOLA_Slope_Northpole_120m/Colorized.vrt"), Description = [[This is a colorized map of the original north polar surface slope of the Moon at a resolution of 16 m/pix by 16 m/pix, based on altimetry data acquired by the LOLA instrument. The LOLA Laser 1 and 2 data through mission phase LRO_SM_17 are the source for this data set. The bi-directional slope was calculated from a plane fit to three successive laser shots requiring n=5 to 15 profile returns. Depending on orbital velocity, probability of detection, and spacecraft altitude, the slope baseline may vary from 30 to 120 meters.]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_Slope_Southpole_120m.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_Slope_Southpole_120m.asset index 1087cf1b52..933ee335d4 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_Slope_Southpole_120m.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_Slope_Southpole_120m.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_LOLA_ClrSlope_SPole75S_120m_EQ = { Identifier = "LRO_LOLA_ClrSlope_SPole75S_120m_EQ", Name = [[LOLA Slope Southpole 120m, Colorized]], - FilePath = asset.localResource("LOLA_Slope_Southpole_120m/Colorized.vrt"), + FilePath = asset.resource("LOLA_Slope_Southpole_120m/Colorized.vrt"), Description = [[This is a colorized map of the original south polar surface slope of the Moon at a resolution of 16 m/pix by 16 m/pix, based on altimetry data acquired by the LOLA instrument. The LOLA Laser 1 and 2 data through mission phase LRO_SM_17 are the source for this data set. The bi-directional slope was calculated from a plane fit to three successive laser shots requiring n=5 to 15 profile returns. Depending on orbital velocity, probability of detection, and spacecraft altitude, the slope baseline may vary from 30 to 120 meters.]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_and_TC_Stereo_DEM_Merge_512ppd.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_and_TC_Stereo_DEM_Merge_512ppd.asset index fea4021887..793771bf60 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_and_TC_Stereo_DEM_Merge_512ppd.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LOLA_and_TC_Stereo_DEM_Merge_512ppd.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_LrocKaguya_Shade_60N60S_512ppd = { Identifier = "LRO_LrocKaguya_Shade_60N60S_512ppd", Name = [[LOLA and TC Stereo DEM Merge 512ppd, Shade]], - FilePath = asset.localResource("LOLA_and_TC_Stereo_DEM_Merge_512ppd/Shade.vrt"), + FilePath = asset.resource("LOLA_and_TC_Stereo_DEM_Merge_512ppd/Shade.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LROC_NAC_Uncontrolled_Mosaic_of_Region_Inside_Schrodinger_Crater.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LROC_NAC_Uncontrolled_Mosaic_of_Region_Inside_Schrodinger_Crater.asset index 9d6a545c91..e4f335c548 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LROC_NAC_Uncontrolled_Mosaic_of_Region_Inside_Schrodinger_Crater.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LROC_NAC_Uncontrolled_Mosaic_of_Region_Inside_Schrodinger_Crater.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_SchrodingerMareNortheq = { Identifier = "SchrodingerMareNortheq", Name = [[LROC NAC Uncontrolled Mosaic of Region Inside Schrodinger Crater, 50cm/px]], - FilePath = asset.localResource("LROC_NAC_Uncontrolled_Mosaic_of_Region_Inside_Schrodinger_Crater/50cmpx.vrt"), + FilePath = asset.resource("LROC_NAC_Uncontrolled_Mosaic_of_Region_Inside_Schrodinger_Crater/50cmpx.vrt"), Description = [[This is a 50cm/px uncontrolled visible image mosaic generated using Lunar Reconnaissance Orbiter Camera (LROC) Narrow Angle Camera (NAC) images from the Lunar Reconnaissance Orbiter mission. Each NAC image was registered horizontally to the LRO's Lunar Orbiter Laser Altimeter (LOLA) global DEM, and then mosaicked together and color balanced.]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LROC_NAC_Uncontrolled_Mosaic_of_Schrodinger_Crater.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LROC_NAC_Uncontrolled_Mosaic_of_Schrodinger_Crater.asset index 8dff440d2c..bb150794f5 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LROC_NAC_Uncontrolled_Mosaic_of_Schrodinger_Crater.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LROC_NAC_Uncontrolled_Mosaic_of_Schrodinger_Crater.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_allSchrodinger_10mV10eq = { Identifier = "allSchrodinger_10mV10eq", Name = [[LROC NAC Uncontrolled Mosaic of Schrodinger Crater, 10m/px]], - FilePath = asset.localResource("LROC_NAC_Uncontrolled_Mosaic_of_Schrodinger_Crater/10mpx.vrt"), + FilePath = asset.resource("LROC_NAC_Uncontrolled_Mosaic_of_Schrodinger_Crater/10mpx.vrt"), Description = [[This is a 10m/px uncontrolled visible image mosaic generated using Lunar Reconnaissance Orbiter Camera (LROC) Narrow Angle Camera (NAC) images from the Lunar Reconnaissance Orbiter mission. Each NAC image was registered horizontally to the LRO's Lunar Orbiter Laser Altimeter (LOLA) global DEM, and then mosaicked together and color balanced.]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_CF_Mosaic.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_CF_Mosaic.asset index 0a622dadbd..faeab9f096 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_CF_Mosaic.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_CF_Mosaic.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_Diviner_CF_Filled_Global_8ppd = { Identifier = "LRO_Diviner_CF_Filled_Global_8ppd", Name = [[LRO Diviner CF Mosaic, Filled]], - FilePath = asset.localResource("LRO_Diviner_CF_Mosaic/Filled.vrt"), + FilePath = asset.resource("LRO_Diviner_CF_Mosaic/Filled.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_CF_Mosaic_128ppd.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_CF_Mosaic_128ppd.asset index 303f210ab2..862059b9ab 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_CF_Mosaic_128ppd.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_CF_Mosaic_128ppd.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_DIVINER_ClrCF_Global_128ppd = { Identifier = "LRO_DIVINER_ClrCF_Global_128ppd", Name = [[LRO Diviner CF Mosaic 128ppd, Colorized]], - FilePath = asset.localResource("LRO_Diviner_CF_Mosaic_128ppd/Colorized.vrt"), + FilePath = asset.resource("LRO_Diviner_CF_Mosaic_128ppd/Colorized.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_Surface_Temp_Avg.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_Surface_Temp_Avg.asset index 9d9c1c917d..3da55102bb 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_Surface_Temp_Avg.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_Surface_Temp_Avg.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_Diviner_ST_Avg_Clr_Global_32ppd = { Identifier = "LRO_Diviner_ST_Avg_Clr_Global_32ppd", Name = [[LRO Diviner Surface Temp Avg, Color]], - FilePath = asset.localResource("LRO_Diviner_Surface_Temp_Avg/Color.vrt"), + FilePath = asset.resource("LRO_Diviner_Surface_Temp_Avg/Color.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_Surface_Temp_Normal_Avg.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_Surface_Temp_Normal_Avg.asset index 65a8a1fc58..0533a6b9b9 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_Surface_Temp_Normal_Avg.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_Surface_Temp_Normal_Avg.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_Diviner_STN_Avg_Clr_Global_32ppd = { Identifier = "LRO_Diviner_STN_Avg_Clr_Global_32ppd", Name = [[LRO Diviner Surface Temp Normal Avg, Color]], - FilePath = asset.localResource("LRO_Diviner_Surface_Temp_Normal_Avg/Color.vrt"), + FilePath = asset.resource("LRO_Diviner_Surface_Temp_Normal_Avg/Color.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_Surface_Temperature_Mosaic_128ppd.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_Surface_Temperature_Mosaic_128ppd.asset index fe69bd1bb0..67955e8b5d 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_Surface_Temperature_Mosaic_128ppd.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Diviner_Surface_Temperature_Mosaic_128ppd.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_DIVINER_ClrRockFreeSurfaceTemp_Global_128ppd = { Identifier = "LRO_DIVINER_ClrRockFreeSurfaceTemp_Global_128ppd", Name = [[LRO Diviner Surface Temperature Mosaic 128ppd, Colorized]], - FilePath = asset.localResource("LRO_Diviner_Surface_Temperature_Mosaic_128ppd/Colorized.vrt"), + FilePath = asset.resource("LRO_Diviner_Surface_Temperature_Mosaic_128ppd/Colorized.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LOLA_DEM.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LOLA_DEM.asset index b55b87c24c..6ed71a2476 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LOLA_DEM.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LOLA_DEM.asset @@ -9,49 +9,49 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_LOLA_ClrShade_Global_128ppd_v04 = { Identifier = "LRO_LOLA_ClrShade_Global_128ppd_v04", Name = [[LRO LOLA DEM, ColorHillshade]], - FilePath = asset.localResource("LRO_LOLA_DEM/ColorHillshade.vrt"), + FilePath = asset.resource("LRO_LOLA_DEM/ColorHillshade.vrt"), Description = [[]] } local treks_LRO_LOLA_ClrShade_Global_256ppd_v06 = { Identifier = "LRO_LOLA_ClrShade_Global_256ppd_v06", Name = [[LRO LOLA DEM, ColorHillshade v6]], - FilePath = asset.localResource("LRO_LOLA_DEM/ColorHillshade_v6.vrt"), + FilePath = asset.resource("LRO_LOLA_DEM/ColorHillshade_v6.vrt"), Description = [[]] } local treks_LRO_LOLA_Coverage_Global_128ppd_v04 = { Identifier = "LRO_LOLA_Coverage_Global_128ppd_v04", Name = [[LRO LOLA DEM, Coverage]], - FilePath = asset.localResource("LRO_LOLA_DEM/Coverage.vrt"), + FilePath = asset.resource("LRO_LOLA_DEM/Coverage.vrt"), Description = [[]] } local treks_LRO_LOLA_Shade_Global_256ppd_v06 = { Identifier = "LRO_LOLA_Shade_Global_256ppd_v06", Name = [[LRO LOLA DEM, Hillshade]], - FilePath = asset.localResource("LRO_LOLA_DEM/Hillshade.vrt"), + FilePath = asset.resource("LRO_LOLA_DEM/Hillshade.vrt"), Description = [[]] } local treks_LRO_LOLA_NoDataMask_Global_128ppd_v04 = { Identifier = "LRO_LOLA_NoDataMask_Global_128ppd_v04", Name = [[LRO LOLA DEM, No Data Mask]], - FilePath = asset.localResource("LRO_LOLA_DEM/No_Data_Mask.vrt"), + FilePath = asset.resource("LRO_LOLA_DEM/No_Data_Mask.vrt"), Description = [[]] } local treks_LRO_LOLA_ClrShade_NPole875_5mp_v04_EQ = { Identifier = "LRO_LOLA_ClrShade_NPole875_5mp_v04_EQ", Name = [[LRO LOLA DEM, N Pole, 87.5 deg, ColorHillshade]], - FilePath = asset.localResource("LRO_LOLA_DEM/N_Pole.vrt"), + FilePath = asset.resource("LRO_LOLA_DEM/N_Pole.vrt"), Description = [[This is version 4 of the LRO LOLA North Pole 87.5 deg DEM, ColorHillshade. This is a colorized shaded-relief of a original polar LOLA Digital Elevation Model (DEM). The DEM is a shape map (radius) of the Moon at a resolution 100 meters per pixel, based on altimetry data acquired through Spetember 2011 by the LOLA instrument. The ground tracks were interpolated using the Generic Mapping Tools programs "surface" and "grdblend". Map values are referred to a radius of 1737400 m.]] } local treks_LRO_LOLA_ClrShade_SPole875_5mp_v04_EQ = { Identifier = "LRO_LOLA_ClrShade_SPole875_5mp_v04_EQ", Name = [[LRO LOLA DEM, S Pole, 87.5 deg, ColorHillshade]], - FilePath = asset.localResource("LRO_LOLA_DEM/S_Pole.vrt"), + FilePath = asset.resource("LRO_LOLA_DEM/S_Pole.vrt"), Description = [[This is version 4 of the LRO LOLA South Pole 87.5 deg DEM, ColorHillshade. This is a colorized shaded-relief of a original polar LOLA Digital Elevation Model (DEM). The DEM is a shape map (radius) of the Moon at a resolution 100 meters per pixel, based on altimetry data acquired through Spetember 2011 by the LOLA instrument. The ground tracks were interpolated using the Generic Mapping Tools programs "surface" and "grdblend". Map values are referred to a radius of 1737400 m.]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Crater_Abundance.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Crater_Abundance.asset index 162ed62c7f..306ef4a4a7 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Crater_Abundance.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Crater_Abundance.asset @@ -9,161 +9,161 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_NAC_CratAbnd_17S173E_150cmp = { Identifier = "LRO_NAC_CratAbnd_17S173E_150cmp", Name = [[LRO LROC Crater Abundance, Aitken Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Aitken_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Aitken_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_13S358E_2mp = { Identifier = "LRO_NAC_CratAbnd_13S358E_2mp", Name = [[LRO LROC Crater Abundance, Alphonsus Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Alphonsus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Alphonsus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_73N350E_150cmp = { Identifier = "LRO_NAC_CratAbnd_73N350E_150cmp", Name = [[LRO LROC Crater Abundance, Anaxagoras Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Anaxagoras_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Anaxagoras_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_26N004E_150cmp = { Identifier = "LRO_NAC_CratAbnd_26N004E_150cmp", Name = [[LRO LROC Crater Abundance, Apollo 15]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Apollo_15.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Apollo_15.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_09S015E_150cmp = { Identifier = "LRO_NAC_CratAbnd_09S015E_150cmp", Name = [[LRO LROC Crater Abundance, Apollo 16]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Apollo_16.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Apollo_16.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_37S206E_150cmp = { Identifier = "LRO_NAC_CratAbnd_37S206E_150cmp", Name = [[LRO LROC Crater Abundance, Apollo Basin]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Apollo_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Apollo_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_25N311E_2mp = { Identifier = "LRO_NAC_CratAbnd_25N311E_2mp", Name = [[LRO LROC Crater Abundance, Aristarchus 1]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Aristarchus_1.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Aristarchus_1.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_28N307E_150cmp = { Identifier = "LRO_NAC_CratAbnd_28N307E_150cmp", Name = [[LRO LROC Crater Abundance, Aristarchus 2]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Aristarchus_2.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Aristarchus_2.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_19S070E_150cmp = { Identifier = "LRO_NAC_CratAbnd_19S070E_150cmp", Name = [[LRO LROC Crater Abundance, Balmer Basin]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Balmer_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Balmer_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_20S337E_400cmp = { Identifier = "LRO_NAC_CratAbnd_20S337E_400cmp", Name = [[LRO LROC Crater Abundance, Bullialdus Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Bullialdus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Bullialdus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_36N320E_2mp = { Identifier = "LRO_NAC_CratAbnd_36N320E_2mp", Name = [[LRO LROC Crater Abundance, Gruithuisen Domes]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Gruithuisen_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Gruithuisen_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_00N234E_150cmp = { Identifier = "LRO_NAC_CratAbnd_00N234E_150cmp", Name = [[LRO LROC Crater Abundance, Hertzsprung]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Hertzsprung.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Hertzsprung.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_08N332E_2mp = { Identifier = "LRO_NAC_CratAbnd_08N332E_2mp", Name = [[LRO LROC Crater Abundance, Hortensius Domes]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Hortensius_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Hortensius_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_06N120E_200cmp = { Identifier = "LRO_NAC_CratAbnd_06N120E_200cmp", Name = [[LRO LROC Crater Abundance, King Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/King_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/King_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_32N292E_2mp = { Identifier = "LRO_NAC_CratAbnd_32N292E_2mp", Name = [[LRO LROC Crater Abundance, Lichtenberg Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Lichtenberg_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Lichtenberg_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_10N058E_150cmp = { Identifier = "LRO_NAC_CratAbnd_10N058E_150cmp", Name = [[LRO LROC Crater Abundance, Mare Crisium]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Mare_Crisium.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Mare_Crisium.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_16S041E_150cmp = { Identifier = "LRO_NAC_CratAbnd_16S041E_150cmp", Name = [[LRO LROC Crater Abundance, Montes Pyrenaeus]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Montes_Pyrenaeus.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Montes_Pyrenaeus.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_26S265E_200cmp = { Identifier = "LRO_NAC_CratAbnd_26S265E_200cmp", Name = [[LRO LROC Crater Abundance, Orientale 1]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Orientale_1.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Orientale_1.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_53N354E_150cmp = { Identifier = "LRO_NAC_CratAbnd_53N354E_150cmp", Name = [[LRO LROC Crater Abundance, Plato Ejecta]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Plato_Ejecta.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Plato_Ejecta.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_60S200E_150cmp = { Identifier = "LRO_NAC_CratAbnd_60S200E_150cmp", Name = [[LRO LROC Crater Abundance, South Pole-Aitken Basin Interior]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/South_Pole-Aitken_Basin_Interior.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/South_Pole-Aitken_Basin_Interior.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_02S167E_150cmp = { Identifier = "LRO_NAC_CratAbnd_02S167E_150cmp", Name = [[LRO LROC Crater Abundance, Stratton (Dewar) High Fe Anomaly]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Stratton_Dewar_High_Fe_Anomaly.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Stratton_Dewar_High_Fe_Anomaly.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_20N010E_2mp = { Identifier = "LRO_NAC_CratAbnd_20N010E_2mp", Name = [[LRO LROC Crater Abundance, Sulpicius Gallus]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Sulpicius_Gallus.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Sulpicius_Gallus.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbnd_43S349E_150cmp = { Identifier = "LRO_NAC_CratAbnd_43S349E_150cmp", Name = [[LRO LROC Crater Abundance, Tycho Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance/Tycho_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance/Tycho_Crater.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Crater_Abundance_Hazard.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Crater_Abundance_Hazard.asset index 5e7ada8659..6d409b350c 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Crater_Abundance_Hazard.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Crater_Abundance_Hazard.asset @@ -9,161 +9,161 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_NAC_CratAbndHaz_17S173E_150cmp = { Identifier = "LRO_NAC_CratAbndHaz_17S173E_150cmp", Name = [[LRO LROC Crater Abundance Hazard, Aitken Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Aitken_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Aitken_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_13S358E_2mp = { Identifier = "LRO_NAC_CratAbndHaz_13S358E_2mp", Name = [[LRO LROC Crater Abundance Hazard, Alphonsus Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Alphonsus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Alphonsus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_73N350E_150cmp = { Identifier = "LRO_NAC_CratAbndHaz_73N350E_150cmp", Name = [[LRO LROC Crater Abundance Hazard, Anaxagoras Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Anaxagoras_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Anaxagoras_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_26N004E_150cmp = { Identifier = "LRO_NAC_CratAbndHaz_26N004E_150cmp", Name = [[LRO LROC Crater Abundance Hazard, Apollo 15]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Apollo_15.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Apollo_15.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_09S015E_150cmp = { Identifier = "LRO_NAC_CratAbndHaz_09S015E_150cmp", Name = [[LRO LROC Crater Abundance Hazard, Apollo 16]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Apollo_16.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Apollo_16.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_37S206E_150cmp = { Identifier = "LRO_NAC_CratAbndHaz_37S206E_150cmp", Name = [[LRO LROC Crater Abundance Hazard, Apollo Basin]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Apollo_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Apollo_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_25N311E_2mp = { Identifier = "LRO_NAC_CratAbndHaz_25N311E_2mp", Name = [[LRO LROC Crater Abundance Hazard, Aristarchus 1]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Aristarchus_1.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Aristarchus_1.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_28N307E_150cmp = { Identifier = "LRO_NAC_CratAbndHaz_28N307E_150cmp", Name = [[LRO LROC Crater Abundance Hazard, Aristarchus 2]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Aristarchus_2.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Aristarchus_2.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_19S070E_150cmp = { Identifier = "LRO_NAC_CratAbndHaz_19S070E_150cmp", Name = [[LRO LROC Crater Abundance Hazard, Balmer Basin]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Balmer_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Balmer_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_20S337E_400cmp = { Identifier = "LRO_NAC_CratAbndHaz_20S337E_400cmp", Name = [[LRO LROC Crater Abundance Hazard, Bullialdus Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Bullialdus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Bullialdus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_36N320E_2mp = { Identifier = "LRO_NAC_CratAbndHaz_36N320E_2mp", Name = [[LRO LROC Crater Abundance Hazard, Gruithuisen Domes]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Gruithuisen_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Gruithuisen_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_00N234E_150cmp = { Identifier = "LRO_NAC_CratAbndHaz_00N234E_150cmp", Name = [[LRO LROC Crater Abundance Hazard, Hertzsprung]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Hertzsprung.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Hertzsprung.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_08N332E_2mp = { Identifier = "LRO_NAC_CratAbndHaz_08N332E_2mp", Name = [[LRO LROC Crater Abundance Hazard, Hortensius Domes]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Hortensius_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Hortensius_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_06N120E_200cmp = { Identifier = "LRO_NAC_CratAbndHaz_06N120E_200cmp", Name = [[LRO LROC Crater Abundance Hazard, King Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/King_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/King_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_32N292E_2mp = { Identifier = "LRO_NAC_CratAbndHaz_32N292E_2mp", Name = [[LRO LROC Crater Abundance Hazard, Lichtenberg Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Lichtenberg_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Lichtenberg_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_10N058E_150cmp = { Identifier = "LRO_NAC_CratAbndHaz_10N058E_150cmp", Name = [[LRO LROC Crater Abundance Hazard, Mare Crisium]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Mare_Crisium.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Mare_Crisium.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_16S041E_150cmp = { Identifier = "LRO_NAC_CratAbndHaz_16S041E_150cmp", Name = [[LRO LROC Crater Abundance Hazard, Montes Pyrenaeus]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Montes_Pyrenaeus.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Montes_Pyrenaeus.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_26S265E_200cmp = { Identifier = "LRO_NAC_CratAbndHaz_26S265E_200cmp", Name = [[LRO LROC Crater Abundance Hazard, Orientale 1]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Orientale_1.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Orientale_1.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_53N354E_150cmp = { Identifier = "LRO_NAC_CratAbndHaz_53N354E_150cmp", Name = [[LRO LROC Crater Abundance Hazard, Plato Ejecta]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Plato_Ejecta.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Plato_Ejecta.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_60S200E_150cmp = { Identifier = "LRO_NAC_CratAbndHaz_60S200E_150cmp", Name = [[LRO LROC Crater Abundance Hazard, South Pole-Aitken Basin Interior]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/South_Pole-Aitken_Basin_Interior.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/South_Pole-Aitken_Basin_Interior.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_02S167E_150cmp = { Identifier = "LRO_NAC_CratAbndHaz_02S167E_150cmp", Name = [[LRO LROC Crater Abundance Hazard, Stratton (Dewar) High Fe Anomaly]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Stratton_Dewar_High_Fe_Anomaly.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Stratton_Dewar_High_Fe_Anomaly.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_20N010E_2mp = { Identifier = "LRO_NAC_CratAbndHaz_20N010E_2mp", Name = [[LRO LROC Crater Abundance Hazard, Sulpicius Gallus]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Sulpicius_Gallus.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Sulpicius_Gallus.vrt"), Description = [[]] } local treks_LRO_NAC_CratAbndHaz_43S349E_150cmp = { Identifier = "LRO_NAC_CratAbndHaz_43S349E_150cmp", Name = [[LRO LROC Crater Abundance Hazard, Tycho Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Abundance_Hazard/Tycho_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Abundance_Hazard/Tycho_Crater.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Crater_Density.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Crater_Density.asset index db4800754b..17ed43885a 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Crater_Density.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Crater_Density.asset @@ -9,161 +9,161 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_NAC_CratDen_17S173E_150cmp = { Identifier = "LRO_NAC_CratDen_17S173E_150cmp", Name = [[LRO LROC Crater Density, Aitken Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Aitken_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Aitken_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_13S358E_2mp = { Identifier = "LRO_NAC_CratDen_13S358E_2mp", Name = [[LRO LROC Crater Density, Alphonsus Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Alphonsus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Alphonsus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_73N350E_150cmp = { Identifier = "LRO_NAC_CratDen_73N350E_150cmp", Name = [[LRO LROC Crater Density, Anaxagoras Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Anaxagoras_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Anaxagoras_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_26N004E_150cmp = { Identifier = "LRO_NAC_CratDen_26N004E_150cmp", Name = [[LRO LROC Crater Density, Apollo 15]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Apollo_15.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Apollo_15.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_09S015E_150cmp = { Identifier = "LRO_NAC_CratDen_09S015E_150cmp", Name = [[LRO LROC Crater Density, Apollo 16]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Apollo_16.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Apollo_16.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_37S206E_150cmp = { Identifier = "LRO_NAC_CratDen_37S206E_150cmp", Name = [[LRO LROC Crater Density, Apollo Basin]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Apollo_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Apollo_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_25N311E_2mp = { Identifier = "LRO_NAC_CratDen_25N311E_2mp", Name = [[LRO LROC Crater Density, Aristarchus 1]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Aristarchus_1.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Aristarchus_1.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_28N307E_150cmp = { Identifier = "LRO_NAC_CratDen_28N307E_150cmp", Name = [[LRO LROC Crater Density, Aristarchus 2]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Aristarchus_2.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Aristarchus_2.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_19S070E_150cmp = { Identifier = "LRO_NAC_CratDen_19S070E_150cmp", Name = [[LRO LROC Crater Density, Balmer Basin]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Balmer_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Balmer_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_20S337E_400cmp = { Identifier = "LRO_NAC_CratDen_20S337E_400cmp", Name = [[LRO LROC Crater Density, Bullialdus Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Bullialdus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Bullialdus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_36N320E_2mp = { Identifier = "LRO_NAC_CratDen_36N320E_2mp", Name = [[LRO LROC Crater Density, Gruithuisen Domes]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Gruithuisen_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Gruithuisen_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_00N234E_150cmp = { Identifier = "LRO_NAC_CratDen_00N234E_150cmp", Name = [[LRO LROC Crater Density, Hertzsprung]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Hertzsprung.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Hertzsprung.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_08N332E_2mp = { Identifier = "LRO_NAC_CratDen_08N332E_2mp", Name = [[LRO LROC Crater Density, Hortensius Domes]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Hortensius_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Hortensius_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_06N120E_200cmp = { Identifier = "LRO_NAC_CratDen_06N120E_200cmp", Name = [[LRO LROC Crater Density, King Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/King_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/King_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_32N292E_2mp = { Identifier = "LRO_NAC_CratDen_32N292E_2mp", Name = [[LRO LROC Crater Density, Lichtenberg Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Lichtenberg_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Lichtenberg_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_10N058E_150cmp = { Identifier = "LRO_NAC_CratDen_10N058E_150cmp", Name = [[LRO LROC Crater Density, Mare Crisium]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Mare_Crisium.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Mare_Crisium.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_16S041E_150cmp = { Identifier = "LRO_NAC_CratDen_16S041E_150cmp", Name = [[LRO LROC Crater Density, Montes Pyrenaeus]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Montes_Pyrenaeus.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Montes_Pyrenaeus.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_26S265E_200cmp = { Identifier = "LRO_NAC_CratDen_26S265E_200cmp", Name = [[LRO LROC Crater Density, Orientale 1]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Orientale_1.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Orientale_1.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_53N354E_150cmp = { Identifier = "LRO_NAC_CratDen_53N354E_150cmp", Name = [[LRO LROC Crater Density, Plato Ejecta]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Plato_Ejecta.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Plato_Ejecta.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_60S200E_150cmp = { Identifier = "LRO_NAC_CratDen_60S200E_150cmp", Name = [[LRO LROC Crater Density, South Pole-Aitken Basin Interior]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/South_Pole-Aitken_Basin_Interior.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/South_Pole-Aitken_Basin_Interior.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_02S167E_150cmp = { Identifier = "LRO_NAC_CratDen_02S167E_150cmp", Name = [[LRO LROC Crater Density, Stratton (Dewar) High Fe Anomaly]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Stratton_Dewar_High_Fe_Anomaly.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Stratton_Dewar_High_Fe_Anomaly.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_20N010E_2mp = { Identifier = "LRO_NAC_CratDen_20N010E_2mp", Name = [[LRO LROC Crater Density, Sulpicius Gallus]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Sulpicius_Gallus.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Sulpicius_Gallus.vrt"), Description = [[]] } local treks_LRO_NAC_CratDen_43S349E_150cmp = { Identifier = "LRO_NAC_CratDen_43S349E_150cmp", Name = [[LRO LROC Crater Density, Tycho Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Density/Tycho_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density/Tycho_Crater.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Crater_Density_Hazard.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Crater_Density_Hazard.asset index 544eef27c0..f4ad36cb2c 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Crater_Density_Hazard.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Crater_Density_Hazard.asset @@ -9,161 +9,161 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_NAC_CratDenHaz_17S173E_150cmp = { Identifier = "LRO_NAC_CratDenHaz_17S173E_150cmp", Name = [[LRO LROC Crater Density Hazard, Aitken Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Aitken_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Aitken_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_13S358E_2mp = { Identifier = "LRO_NAC_CratDenHaz_13S358E_2mp", Name = [[LRO LROC Crater Density Hazard, Alphonsus Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Alphonsus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Alphonsus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_73N350E_150cmp = { Identifier = "LRO_NAC_CratDenHaz_73N350E_150cmp", Name = [[LRO LROC Crater Density Hazard, Anaxagoras Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Anaxagoras_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Anaxagoras_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_26N004E_150cmp = { Identifier = "LRO_NAC_CratDenHaz_26N004E_150cmp", Name = [[LRO LROC Crater Density Hazard, Apollo 15]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Apollo_15.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Apollo_15.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_09S015E_150cmp = { Identifier = "LRO_NAC_CratDenHaz_09S015E_150cmp", Name = [[LRO LROC Crater Density Hazard, Apollo 16]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Apollo_16.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Apollo_16.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_37S206E_150cmp = { Identifier = "LRO_NAC_CratDenHaz_37S206E_150cmp", Name = [[LRO LROC Crater Density Hazard, Apollo Basin]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Apollo_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Apollo_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_25N311E_2mp = { Identifier = "LRO_NAC_CratDenHaz_25N311E_2mp", Name = [[LRO LROC Crater Density Hazard, Aristarchus 1]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Aristarchus_1.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Aristarchus_1.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_28N307E_150cmp = { Identifier = "LRO_NAC_CratDenHaz_28N307E_150cmp", Name = [[LRO LROC Crater Density Hazard, Aristarchus 2]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Aristarchus_2.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Aristarchus_2.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_19S070E_150cmp = { Identifier = "LRO_NAC_CratDenHaz_19S070E_150cmp", Name = [[LRO LROC Crater Density Hazard, Balmer Basin]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Balmer_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Balmer_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_20S337E_400cmp = { Identifier = "LRO_NAC_CratDenHaz_20S337E_400cmp", Name = [[LRO LROC Crater Density Hazard, Bullialdus Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Bullialdus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Bullialdus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_36N320E_2mp = { Identifier = "LRO_NAC_CratDenHaz_36N320E_2mp", Name = [[LRO LROC Crater Density Hazard, Gruithuisen Domes]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Gruithuisen_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Gruithuisen_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_00N234E_150cmp = { Identifier = "LRO_NAC_CratDenHaz_00N234E_150cmp", Name = [[LRO LROC Crater Density Hazard, Hertzsprung]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Hertzsprung.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Hertzsprung.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_08N332E_2mp = { Identifier = "LRO_NAC_CratDenHaz_08N332E_2mp", Name = [[LRO LROC Crater Density Hazard, Hortensius Domes]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Hortensius_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Hortensius_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_06N120E_200cmp = { Identifier = "LRO_NAC_CratDenHaz_06N120E_200cmp", Name = [[LRO LROC Crater Density Hazard, King Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/King_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/King_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_32N292E_2mp = { Identifier = "LRO_NAC_CratDenHaz_32N292E_2mp", Name = [[LRO LROC Crater Density Hazard, Lichtenberg Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Lichtenberg_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Lichtenberg_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_10N058E_150cmp = { Identifier = "LRO_NAC_CratDenHaz_10N058E_150cmp", Name = [[LRO LROC Crater Density Hazard, Mare Crisium]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Mare_Crisium.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Mare_Crisium.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_16S041E_150cmp = { Identifier = "LRO_NAC_CratDenHaz_16S041E_150cmp", Name = [[LRO LROC Crater Density Hazard, Montes Pyrenaeus]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Montes_Pyrenaeus.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Montes_Pyrenaeus.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_26S265E_200cmp = { Identifier = "LRO_NAC_CratDenHaz_26S265E_200cmp", Name = [[LRO LROC Crater Density Hazard, Orientale 1]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Orientale_1.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Orientale_1.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_53N354E_150cmp = { Identifier = "LRO_NAC_CratDenHaz_53N354E_150cmp", Name = [[LRO LROC Crater Density Hazard, Plato Ejecta]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Plato_Ejecta.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Plato_Ejecta.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_60S200E_150cmp = { Identifier = "LRO_NAC_CratDenHaz_60S200E_150cmp", Name = [[LRO LROC Crater Density Hazard, South Pole-Aitken Basin Interior]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/South_Pole-Aitken_Basin_Interior.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/South_Pole-Aitken_Basin_Interior.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_02S167E_150cmp = { Identifier = "LRO_NAC_CratDenHaz_02S167E_150cmp", Name = [[LRO LROC Crater Density Hazard, Stratton (Dewar) High Fe Anomaly]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Stratton_Dewar_High_Fe_Anomaly.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Stratton_Dewar_High_Fe_Anomaly.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_20N010E_2mp = { Identifier = "LRO_NAC_CratDenHaz_20N010E_2mp", Name = [[LRO LROC Crater Density Hazard, Sulpicius Gallus]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Sulpicius_Gallus.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Sulpicius_Gallus.vrt"), Description = [[]] } local treks_LRO_NAC_CratDenHaz_43S349E_150cmp = { Identifier = "LRO_NAC_CratDenHaz_43S349E_150cmp", Name = [[LRO LROC Crater Density Hazard, Tycho Crater]], - FilePath = asset.localResource("LRO_LROC_Crater_Density_Hazard/Tycho_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Crater_Density_Hazard/Tycho_Crater.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_DEM.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_DEM.asset index fcdef25339..2f0a72b7a6 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_DEM.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_DEM.asset @@ -9,301 +9,301 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_NAC_ClrRoughness_15m_17S173E_150cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_17S173E_150cmp", Name = [[LRO LROC DEM, Aitken Crater, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Aitken_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Aitken_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_13S358E_2mp = { Identifier = "LRO_NAC_ClrRoughness_15m_13S358E_2mp", Name = [[LRO LROC DEM, Alphonsus Crater, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Alphonsus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Alphonsus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_13S358E_200cmp = { Identifier = "LRO_NAC_ClrShade_13S358E_200cmp", Name = [[LRO LROC DEM, Alphonsus, ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/Alphonsus.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Alphonsus.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_73N350E_150cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_73N350E_150cmp", Name = [[LRO LROC DEM, Anaxagoras Crater, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Anaxagoras_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Anaxagoras_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_26N004E_150cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_26N004E_150cmp", Name = [[LRO LROC DEM, Apollo 15, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Apollo_15.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Apollo_15.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_09S015E_150cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_09S015E_150cmp", Name = [[LRO LROC DEM, Apollo 16, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Apollo_16.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Apollo_16.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_37S206E_150cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_37S206E_150cmp", Name = [[LRO LROC DEM, Apollo Basin, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Apollo_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Apollo_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_25N311E_2mp = { Identifier = "LRO_NAC_ClrRoughness_15m_25N311E_2mp", Name = [[LRO LROC DEM, Aristarchus 1, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Aristarchus_1.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Aristarchus_1.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_28N307E_150cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_28N307E_150cmp", Name = [[LRO LROC DEM, Aristarchus 2, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Aristarchus_2.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Aristarchus_2.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_19S070E_150cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_19S070E_150cmp", Name = [[LRO LROC DEM, Balmer Basin, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Balmer_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Balmer_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_20S337E_400cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_20S337E_400cmp", Name = [[LRO LROC DEM, Bullialdus Crater, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Bullialdus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Bullialdus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_61N099E_150cmp = { Identifier = "LRO_NAC_ClrShade_61N099E_150cmp", Name = [[LRO LROC DEM, Compton Belkovich Th Anomaly, ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/Compton_Belkovich_Th_Anomaly.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Compton_Belkovich_Th_Anomaly.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_26N178E_150cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_26N178E_150cmp", Name = [[LRO LROC DEM, Dante Crater, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Dante_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Dante_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_02S317E_150cmp = { Identifier = "LRO_NAC_ClrShade_02S317E_150cmp", Name = [[LRO LROC DEM, Flamsteed Crater, ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/Flamsteed_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Flamsteed_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_03N280E_2m = { Identifier = "LRO_NAC_ClrShade_03N280E_2m", Name = [[LRO LROC DEM, Fresh Crater East of Lents, ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/Fresh_Crater_East_of_Lents.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Fresh_Crater_East_of_Lents.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_36N320E_2mp = { Identifier = "LRO_NAC_ClrRoughness_15m_36N320E_2mp", Name = [[LRO LROC DEM, Gruithuisen Domes, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Gruithuisen_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Gruithuisen_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_00N234E_150cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_00N234E_150cmp", Name = [[LRO LROC DEM, Hertzsprung, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Hertzsprung.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Hertzsprung.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_08N332E_2mp = { Identifier = "LRO_NAC_ClrRoughness_15m_08N332E_2mp", Name = [[LRO LROC DEM, Hortensius Domes, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Hortensius_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Hortensius_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_55N077E_200cmp = { Identifier = "LRO_NAC_ClrShade_55N077E_200cmp", Name = [[LRO LROC DEM, Humboldtianum Basin, ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/Humboldtianum_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Humboldtianum_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_19N005E_2mp = { Identifier = "LRO_NAC_ClrShade_19N005E_2mp", Name = [[LRO LROC DEM, Ina (D-Caldera), ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/Ina_D-Caldera.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Ina_D-Caldera.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_06N120E_200cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_06N120E_200cmp", Name = [[LRO LROC DEM, King Crater, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/King_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/King_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_32N292E_2mp = { Identifier = "LRO_NAC_ClrRoughness_15m_32N292E_2mp", Name = [[LRO LROC DEM, Lichtenberg Crater, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Lichtenberg_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Lichtenberg_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_10N58E_150cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_10N58E_150cmp", Name = [[LRO LROC DEM, Mare Crisium, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Mare_Crisium.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Mare_Crisium.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_36S164E_2mp = { Identifier = "LRO_NAC_ClrShade_36S164E_2mp", Name = [[LRO LROC DEM, Mare Ingenii, ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/Mare_Ingenii.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Mare_Ingenii.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_26N150E_200cmp = { Identifier = "LRO_NAC_ClrShade_26N150E_200cmp", Name = [[LRO LROC DEM, Mare Moscoviense, ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/Mare_Moscoviense.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Mare_Moscoviense.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_02N085E_150cmp = { Identifier = "LRO_NAC_ClrShade_02N085E_150cmp", Name = [[LRO LROC DEM, Mare Smythii, ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/Mare_Smythii.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Mare_Smythii.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_07N022E_150cmp = { Identifier = "LRO_NAC_ClrShade_07N022E_150cmp", Name = [[LRO LROC DEM, Mare Tranquillitatis, ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/Mare_Tranquillitatis.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Mare_Tranquillitatis.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_14N304E_2mp = { Identifier = "LRO_NAC_ClrShade_14N304E_2mp", Name = [[LRO LROC DEM, Marius Hills, ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/Marius_Hills.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Marius_Hills.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_16S041E_150cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_16S041E_150cmp", Name = [[LRO LROC DEM, Montes Pyrenaeus, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Montes_Pyrenaeus.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Montes_Pyrenaeus.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_05N000E_150cmp = { Identifier = "LRO_NAC_ClrShade_05N000E_150cmp", Name = [[LRO LROC DEM, Murchison Crater, ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/Murchison_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Murchison_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_26S265E_200cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_26S265E_200cmp", Name = [[LRO LROC DEM, Orientale 1, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Orientale_1.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Orientale_1.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_53N354E_150cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_53N354E_150cmp", Name = [[LRO LROC DEM, Plato Ejecta, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Plato_Ejecta.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Plato_Ejecta.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_07N301E_2mp = { Identifier = "LRO_NAC_ClrShade_07N301E_2mp", Name = [[LRO LROC DEM, Reiner Gamma, ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/Reiner_Gamma.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Reiner_Gamma.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_03S286E_150cmp = { Identifier = "LRO_NAC_ClrShade_03S286E_150cmp", Name = [[LRO LROC DEM, Riccioli Crater, ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/Riccioli_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Riccioli_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_13N356E_150cmp = { Identifier = "LRO_NAC_ClrShade_13N356E_150cmp", Name = [[LRO LROC DEM, Rima Bode, ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/Rima_Bode.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Rima_Bode.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_27N318E_150cmp = { Identifier = "LRO_NAC_ClrShade_27N318E_150cmp", Name = [[LRO LROC DEM, Rimae Prinz, ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/Rimae_Prinz.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Rimae_Prinz.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_60S200E_150cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_60S200E_150cmp", Name = [[LRO LROC DEM, South Pole-Aitken Basin Interior, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/South_Pole-Aitken_Basin_Interior.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/South_Pole-Aitken_Basin_Interior.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_51S171E_2mp = { Identifier = "LRO_NAC_ClrShade_51S171E_2mp", Name = [[LRO LROC DEM, South Pole-Aitken Rim, ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/South_Pole-Aitken_Rim.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/South_Pole-Aitken_Rim.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_02S167E_150cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_02S167E_150cmp", Name = [[LRO LROC DEM, Stratton (Dewar) High Fe Anomaly, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Stratton_Dewar_High_Fe_Anomaly.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Stratton_Dewar_High_Fe_Anomaly.vrt"), Description = [[]] } local treks_LRO_NAC_ClrShade_02S167E_150cmp = { Identifier = "LRO_NAC_ClrShade_02S167E_150cmp", Name = [[LRO LROC DEM, Stratton (Dewar), ColorHillshade]], - FilePath = asset.localResource("LRO_LROC_DEM/Stratton_Dewar.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Stratton_Dewar.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_20N010E_2mp = { Identifier = "LRO_NAC_ClrRoughness_15m_20N010E_2mp", Name = [[LRO LROC DEM, Sulpicius Gallus, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Sulpicius_Gallus.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Sulpicius_Gallus.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_19S129E_150cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_19S129E_150cmp", Name = [[LRO LROC DEM, Tsiolkovskiy Crater, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Tsiolkovskiy_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Tsiolkovskiy_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_ClrRoughness_15m_43S349E_150cmp = { Identifier = "LRO_NAC_ClrRoughness_15m_43S349E_150cmp", Name = [[LRO LROC DEM, Tycho Crater, 15m Color Roughness]], - FilePath = asset.localResource("LRO_LROC_DEM/Tycho_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_DEM/Tycho_Crater.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Image_Mosaic.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Image_Mosaic.asset index bc910b1954..759197bb9b 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Image_Mosaic.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Image_Mosaic.asset @@ -9,238 +9,238 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_NAC_Mosaic_17S173E_50cmp = { Identifier = "LRO_NAC_Mosaic_17S173E_50cmp", Name = [[LRO LROC Image Mosaic, Aitken Crater]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Aitken_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Aitken_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_13S358E_50cmp = { Identifier = "LRO_NAC_Mosaic_13S358E_50cmp", Name = [[LRO LROC Image Mosaic, Alphonsus]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Alphonsus.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Alphonsus.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_26N004E_50cmp = { Identifier = "LRO_NAC_Mosaic_26N004E_50cmp", Name = [[LRO LROC Image Mosaic, Apollo 15]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Apollo_15.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Apollo_15.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_09S015E_50cmp = { Identifier = "LRO_NAC_Mosaic_09S015E_50cmp", Name = [[LRO LROC Image Mosaic, Apollo 16]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Apollo_16.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Apollo_16.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_25N311E_50cmp = { Identifier = "LRO_NAC_Mosaic_25N311E_50cmp", Name = [[LRO LROC Image Mosaic, Aristarchus 1]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Aristarchus_1.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Aristarchus_1.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_28N307E_50cmp = { Identifier = "LRO_NAC_Mosaic_28N307E_50cmp", Name = [[LRO LROC Image Mosaic, Aristarchus 2]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Aristarchus_2.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Aristarchus_2.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_19S070E_50cmp = { Identifier = "LRO_NAC_Mosaic_19S070E_50cmp", Name = [[LRO LROC Image Mosaic, Balmer Basin]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Balmer_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Balmer_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_61N099E_50cmp = { Identifier = "LRO_NAC_Mosaic_61N099E_50cmp", Name = [[LRO LROC Image Mosaic, Compton Belkovich Th Anomaly]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Compton_Belkovich_Th_Anomaly.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Compton_Belkovich_Th_Anomaly.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_02S317E_50cmp = { Identifier = "LRO_NAC_Mosaic_02S317E_50cmp", Name = [[LRO LROC Image Mosaic, Flamsteed Crater]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Flamsteed_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Flamsteed_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_36N320E_50cmp = { Identifier = "LRO_NAC_Mosaic_36N320E_50cmp", Name = [[LRO LROC Image Mosaic, Gruithuisen Domes]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Gruithuisen_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Gruithuisen_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_00N234E_50cmp = { Identifier = "LRO_NAC_Mosaic_00N234E_50cmp", Name = [[LRO LROC Image Mosaic, Hertzsprung]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Hertzsprung.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Hertzsprung.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_08N332E_50cmp = { Identifier = "LRO_NAC_Mosaic_08N332E_50cmp", Name = [[LRO LROC Image Mosaic, Hortensius Domes]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Hortensius_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Hortensius_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_55N077E_50cmp = { Identifier = "LRO_NAC_Mosaic_55N077E_50cmp", Name = [[LRO LROC Image Mosaic, Humboldtianum Basin]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Humboldtianum_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Humboldtianum_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_19N005E_50cmp = { Identifier = "LRO_NAC_Mosaic_19N005E_50cmp", Name = [[LRO LROC Image Mosaic, Ina D-Caldera]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Ina_D-Caldera.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Ina_D-Caldera.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_06N120E_50cmp = { Identifier = "LRO_NAC_Mosaic_06N120E_50cmp", Name = [[LRO LROC Image Mosaic, King Crater]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/King_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/King_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_32N292E_50cmp = { Identifier = "LRO_NAC_Mosaic_32N292E_50cmp", Name = [[LRO LROC Image Mosaic, Lichtenberg Crater]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Lichtenberg_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Lichtenberg_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_36S164E_70cmp = { Identifier = "LRO_NAC_Mosaic_36S164E_70cmp", Name = [[LRO LROC Image Mosaic, Mare Ingenii]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Mare_Ingenii.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Mare_Ingenii.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_26N150E_50cmp = { Identifier = "LRO_NAC_Mosaic_26N150E_50cmp", Name = [[LRO LROC Image Mosaic, Mare Moscoviense]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Mare_Moscoviense.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Mare_Moscoviense.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_02N085E_50cmp = { Identifier = "LRO_NAC_Mosaic_02N085E_50cmp", Name = [[LRO LROC Image Mosaic, Mare Smythii]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Mare_Smythii.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Mare_Smythii.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_07N022E_50cmp = { Identifier = "LRO_NAC_Mosaic_07N022E_50cmp", Name = [[LRO LROC Image Mosaic, Mare Tranquillitatis]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Mare_Tranquillitatis.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Mare_Tranquillitatis.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_14N304E_50cmp = { Identifier = "LRO_NAC_Mosaic_14N304E_50cmp", Name = [[LRO LROC Image Mosaic, Marius Hills]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Marius_Hills.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Marius_Hills.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_16S041E_50cmp = { Identifier = "LRO_NAC_Mosaic_16S041E_50cmp", Name = [[LRO LROC Image Mosaic, Montes Pyrenaeus]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Montes_Pyrenaeus.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Montes_Pyrenaeus.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_05N000E_50cmp = { Identifier = "LRO_NAC_Mosaic_05N000E_50cmp", Name = [[LRO LROC Image Mosaic, Murchison Crater]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Murchison_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Murchison_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_26S265E_50cmp = { Identifier = "LRO_NAC_Mosaic_26S265E_50cmp", Name = [[LRO LROC Image Mosaic, Orientale 1]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Orientale_1.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Orientale_1.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_07N301E_50cmp = { Identifier = "LRO_NAC_Mosaic_07N301E_50cmp", Name = [[LRO LROC Image Mosaic, Reiner Gamma]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Reiner_Gamma.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Reiner_Gamma.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_03S286E_50cmp = { Identifier = "LRO_NAC_Mosaic_03S286E_50cmp", Name = [[LRO LROC Image Mosaic, Riccioli Crater]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Riccioli_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Riccioli_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_13N356E_50cmp = { Identifier = "LRO_NAC_Mosaic_13N356E_50cmp", Name = [[LRO LROC Image Mosaic, Rima Bode]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Rima_Bode.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Rima_Bode.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_27N318E_50cmp = { Identifier = "LRO_NAC_Mosaic_27N318E_50cmp", Name = [[LRO LROC Image Mosaic, Rimae Prinz]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Rimae_Prinz.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Rimae_Prinz.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_60S200E_50cmp = { Identifier = "LRO_NAC_Mosaic_60S200E_50cmp", Name = [[LRO LROC Image Mosaic, South Pole-Aitken Basin Interior]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/South_Pole-Aitken_Basin_Interior.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/South_Pole-Aitken_Basin_Interior.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_51S171E_60cmp = { Identifier = "LRO_NAC_Mosaic_51S171E_60cmp", Name = [[LRO LROC Image Mosaic, South Pole-Aitken Rim]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/South_Pole-Aitken_Rim.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/South_Pole-Aitken_Rim.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_02S167E_50cmp = { Identifier = "LRO_NAC_Mosaic_02S167E_50cmp", Name = [[LRO LROC Image Mosaic, Stratton (Dewar)]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Stratton_Dewar.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Stratton_Dewar.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_20N010E_60cmp = { Identifier = "LRO_NAC_Mosaic_20N010E_60cmp", Name = [[LRO LROC Image Mosaic, Sulpicius Gallus]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Sulpicius_Gallus.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Sulpicius_Gallus.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_19S129E_50cmp = { Identifier = "LRO_NAC_Mosaic_19S129E_50cmp", Name = [[LRO LROC Image Mosaic, Tsiolkovskiy Crater]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Tsiolkovskiy_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Tsiolkovskiy_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_Mosaic_43S349E_50cmp = { Identifier = "LRO_NAC_Mosaic_43S349E_50cmp", Name = [[LRO LROC Image Mosaic, Tycho Crater]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic/Tycho_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic/Tycho_Crater.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Image_Mosaic_26cm.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Image_Mosaic_26cm.asset index 30c20963ce..53f7ac725d 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Image_Mosaic_26cm.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Image_Mosaic_26cm.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_apollo11_26cm_mosaic_byte_geo_1_2_highContrast = { Identifier = "apollo11_26cm_mosaic_byte_geo_1_2_highContrast", Name = [[LRO LROC Image Mosaic 26cm, Apollo 11]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic_26cm/Apollo_11.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic_26cm/Apollo_11.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Image_Mosaic_28cm.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Image_Mosaic_28cm.asset index f86537c2f3..f97b47c66e 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Image_Mosaic_28cm.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Image_Mosaic_28cm.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_apollo14_28cm_mosaic_byte_geo_1_2_highContrast = { Identifier = "apollo14_28cm_mosaic_byte_geo_1_2_highContrast", Name = [[LRO LROC Image Mosaic 28cm, Apollo 14]], - FilePath = asset.localResource("LRO_LROC_Image_Mosaic_28cm/Apollo_14.vrt"), + FilePath = asset.resource("LRO_LROC_Image_Mosaic_28cm/Apollo_14.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Mosaic.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Mosaic.asset index b5e8d0ec54..d53822c253 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Mosaic.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Mosaic.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_NAC_Mosaic_03N280E_70cm = { Identifier = "LRO_NAC_Mosaic_03N280E_70cm", Name = [[LRO LROC Mosaic, Fresh Crater East of Lents]], - FilePath = asset.localResource("LRO_LROC_Mosaic/Fresh_Crater_East_of_Lents.vrt"), + FilePath = asset.resource("LRO_LROC_Mosaic/Fresh_Crater_East_of_Lents.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_NAC_Image_Mosaic.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_NAC_Image_Mosaic.asset index 1e92e14ced..ad356b216c 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_NAC_Image_Mosaic.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_NAC_Image_Mosaic.asset @@ -9,14 +9,14 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_NAC_AvgMosaic_NPole855_1mp_EQ = { Identifier = "LRO_NAC_AvgMosaic_NPole855_1mp_EQ", Name = [[LRO LROC NAC Image Mosaic, N Pole, Avg Merge]], - FilePath = asset.localResource("LRO_LROC_NAC_Image_Mosaic/N_Pole.vrt"), + FilePath = asset.resource("LRO_LROC_NAC_Image_Mosaic/N_Pole.vrt"), Description = [[This is a visible image mosaic generated using Lunar Reconnaissance Orbiter Camera (LROC) Narrow Angle Camera (NAC) images from the Lunar Reconnaissance Orbiter mission. The images were orthorectified using LRO's Lunar Orbiter Laser Altimeter (LOLA) polar 5 meter/pixel DEM. The mosaic is generated at half the resolution at which the individual LROC NAC images were gathered, which is approximately 0.5 meters/pixel. The mosaic was registered horizontally to the LOLA global DEM.]] } local treks_LRO_NAC_AvgMosaic_SPole855_1mp_EQ = { Identifier = "LRO_NAC_AvgMosaic_SPole855_1mp_EQ", Name = [[LRO LROC NAC Image Mosaic, S Pole, Avg Merge]], - FilePath = asset.localResource("LRO_LROC_NAC_Image_Mosaic/S_Pole.vrt"), + FilePath = asset.resource("LRO_LROC_NAC_Image_Mosaic/S_Pole.vrt"), Description = [[This is a visible image mosaic generated using Lunar Reconnaissance Orbiter Camera (LROC) Narrow Angle Camera (NAC) images from the Lunar Reconnaissance Orbiter mission. The images were orthorectified using LRO's Lunar Orbiter Laser Altimeter (LOLA) polar 5 meter/pixel DEM. The mosaic is generated at half the resolution at which the individual LROC NAC images were gathered, which is approximately 0.5 meters/pixel. The mosaic was registered horizontally to the LOLA global DEM.]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Rock_Abundance.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Rock_Abundance.asset index d0a7610fad..f5335fc558 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Rock_Abundance.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Rock_Abundance.asset @@ -9,161 +9,161 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_NAC_RockAbnd_17S173E_150cmp = { Identifier = "LRO_NAC_RockAbnd_17S173E_150cmp", Name = [[LRO LROC Rock Abundance, Aitken Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Aitken_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Aitken_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_13S358E_2mp = { Identifier = "LRO_NAC_RockAbnd_13S358E_2mp", Name = [[LRO LROC Rock Abundance, Alphonsus Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Alphonsus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Alphonsus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_73N350E_150cmp = { Identifier = "LRO_NAC_RockAbnd_73N350E_150cmp", Name = [[LRO LROC Rock Abundance, Anaxagoras Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Anaxagoras_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Anaxagoras_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_26N004E_150cmp = { Identifier = "LRO_NAC_RockAbnd_26N004E_150cmp", Name = [[LRO LROC Rock Abundance, Apollo 15]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Apollo_15.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Apollo_15.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_09S015E_150cmp = { Identifier = "LRO_NAC_RockAbnd_09S015E_150cmp", Name = [[LRO LROC Rock Abundance, Apollo 16]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Apollo_16.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Apollo_16.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_37S206E_150cmp = { Identifier = "LRO_NAC_RockAbnd_37S206E_150cmp", Name = [[LRO LROC Rock Abundance, Apollo Basin]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Apollo_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Apollo_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_25N311E_2mp = { Identifier = "LRO_NAC_RockAbnd_25N311E_2mp", Name = [[LRO LROC Rock Abundance, Aristarchus 1]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Aristarchus_1.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Aristarchus_1.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_28N307E_150cmp = { Identifier = "LRO_NAC_RockAbnd_28N307E_150cmp", Name = [[LRO LROC Rock Abundance, Aristarchus 2]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Aristarchus_2.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Aristarchus_2.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_19S070E_150cmp = { Identifier = "LRO_NAC_RockAbnd_19S070E_150cmp", Name = [[LRO LROC Rock Abundance, Balmer Basin]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Balmer_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Balmer_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_20S337E_400cmp = { Identifier = "LRO_NAC_RockAbnd_20S337E_400cmp", Name = [[LRO LROC Rock Abundance, Bullialdus Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Bullialdus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Bullialdus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_36N320E_2mp = { Identifier = "LRO_NAC_RockAbnd_36N320E_2mp", Name = [[LRO LROC Rock Abundance, Gruithuisen Domes]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Gruithuisen_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Gruithuisen_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_00N234E_150cmp = { Identifier = "LRO_NAC_RockAbnd_00N234E_150cmp", Name = [[LRO LROC Rock Abundance, Hertzsprung]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Hertzsprung.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Hertzsprung.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_08N332E_2mp = { Identifier = "LRO_NAC_RockAbnd_08N332E_2mp", Name = [[LRO LROC Rock Abundance, Hortensius Domes]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Hortensius_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Hortensius_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_06N120E_200cmp = { Identifier = "LRO_NAC_RockAbnd_06N120E_200cmp", Name = [[LRO LROC Rock Abundance, King Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/King_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/King_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_32N292E_2mp = { Identifier = "LRO_NAC_RockAbnd_32N292E_2mp", Name = [[LRO LROC Rock Abundance, Lichtenberg Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Lichtenberg_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Lichtenberg_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_10N058E_150cmp = { Identifier = "LRO_NAC_RockAbnd_10N058E_150cmp", Name = [[LRO LROC Rock Abundance, Mare Crisium]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Mare_Crisium.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Mare_Crisium.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_16S041E_150cmp = { Identifier = "LRO_NAC_RockAbnd_16S041E_150cmp", Name = [[LRO LROC Rock Abundance, Montes Pyrenaeus]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Montes_Pyrenaeus.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Montes_Pyrenaeus.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_26S265E_200cmp = { Identifier = "LRO_NAC_RockAbnd_26S265E_200cmp", Name = [[LRO LROC Rock Abundance, Orientale 1]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Orientale_1.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Orientale_1.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_53N354E_150cmp = { Identifier = "LRO_NAC_RockAbnd_53N354E_150cmp", Name = [[LRO LROC Rock Abundance, Plato Ejecta]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Plato_Ejecta.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Plato_Ejecta.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_60S200E_150cmp = { Identifier = "LRO_NAC_RockAbnd_60S200E_150cmp", Name = [[LRO LROC Rock Abundance, South Pole-Aitken Basin Interior]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/South_Pole-Aitken_Basin_Interior.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/South_Pole-Aitken_Basin_Interior.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_02S167E_150cmp = { Identifier = "LRO_NAC_RockAbnd_02S167E_150cmp", Name = [[LRO LROC Rock Abundance, Stratton (Dewar) High Fe Anomaly]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Stratton_Dewar_High_Fe_Anomaly.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Stratton_Dewar_High_Fe_Anomaly.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_20N010E_2mp = { Identifier = "LRO_NAC_RockAbnd_20N010E_2mp", Name = [[LRO LROC Rock Abundance, Sulpicius Gallus]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Sulpicius_Gallus.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Sulpicius_Gallus.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbnd_43S349E_150cmp = { Identifier = "LRO_NAC_RockAbnd_43S349E_150cmp", Name = [[LRO LROC Rock Abundance, Tycho Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance/Tycho_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance/Tycho_Crater.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Rock_Abundance_Hazard.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Rock_Abundance_Hazard.asset index 164674befb..e038350169 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Rock_Abundance_Hazard.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Rock_Abundance_Hazard.asset @@ -9,161 +9,161 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_NAC_RockAbndHaz_17S173E_150cmp = { Identifier = "LRO_NAC_RockAbndHaz_17S173E_150cmp", Name = [[LRO LROC Rock Abundance Hazard, Aitken Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Aitken_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Aitken_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_13S358E_2mp = { Identifier = "LRO_NAC_RockAbndHaz_13S358E_2mp", Name = [[LRO LROC Rock Abundance Hazard, Alphonsus Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Alphonsus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Alphonsus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_73N350E_150cmp = { Identifier = "LRO_NAC_RockAbndHaz_73N350E_150cmp", Name = [[LRO LROC Rock Abundance Hazard, Anaxagoras Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Anaxagoras_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Anaxagoras_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_26N004E_150cmp = { Identifier = "LRO_NAC_RockAbndHaz_26N004E_150cmp", Name = [[LRO LROC Rock Abundance Hazard, Apollo 15]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Apollo_15.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Apollo_15.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_09S015E_150cmp = { Identifier = "LRO_NAC_RockAbndHaz_09S015E_150cmp", Name = [[LRO LROC Rock Abundance Hazard, Apollo 16]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Apollo_16.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Apollo_16.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_37S206E_150cmp = { Identifier = "LRO_NAC_RockAbndHaz_37S206E_150cmp", Name = [[LRO LROC Rock Abundance Hazard, Apollo Basin]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Apollo_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Apollo_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_25N311E_2mp = { Identifier = "LRO_NAC_RockAbndHaz_25N311E_2mp", Name = [[LRO LROC Rock Abundance Hazard, Aristarchus 1]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Aristarchus_1.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Aristarchus_1.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_28N307E_150cmp = { Identifier = "LRO_NAC_RockAbndHaz_28N307E_150cmp", Name = [[LRO LROC Rock Abundance Hazard, Aristarchus 2]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Aristarchus_2.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Aristarchus_2.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_19S070E_150cmp = { Identifier = "LRO_NAC_RockAbndHaz_19S070E_150cmp", Name = [[LRO LROC Rock Abundance Hazard, Balmer Basin]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Balmer_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Balmer_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_20S337E_400cmp = { Identifier = "LRO_NAC_RockAbndHaz_20S337E_400cmp", Name = [[LRO LROC Rock Abundance Hazard, Bullialdus Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Bullialdus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Bullialdus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_36N320E_2mp = { Identifier = "LRO_NAC_RockAbndHaz_36N320E_2mp", Name = [[LRO LROC Rock Abundance Hazard, Gruithuisen Domes]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Gruithuisen_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Gruithuisen_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_00N234E_150cmp = { Identifier = "LRO_NAC_RockAbndHaz_00N234E_150cmp", Name = [[LRO LROC Rock Abundance Hazard, Hertzsprung]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Hertzsprung.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Hertzsprung.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_08N332E_2mp = { Identifier = "LRO_NAC_RockAbndHaz_08N332E_2mp", Name = [[LRO LROC Rock Abundance Hazard, Hortensius Domes]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Hortensius_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Hortensius_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_06N120E_200cmp = { Identifier = "LRO_NAC_RockAbndHaz_06N120E_200cmp", Name = [[LRO LROC Rock Abundance Hazard, King Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/King_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/King_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_32N292E_2mp = { Identifier = "LRO_NAC_RockAbndHaz_32N292E_2mp", Name = [[LRO LROC Rock Abundance Hazard, Lichtenberg Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Lichtenberg_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Lichtenberg_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_10N058E_150cmp = { Identifier = "LRO_NAC_RockAbndHaz_10N058E_150cmp", Name = [[LRO LROC Rock Abundance Hazard, Mare Crisium]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Mare_Crisium.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Mare_Crisium.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_16S041E_150cmp = { Identifier = "LRO_NAC_RockAbndHaz_16S041E_150cmp", Name = [[LRO LROC Rock Abundance Hazard, Montes Pyrenaeus]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Montes_Pyrenaeus.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Montes_Pyrenaeus.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_26S265E_200cmp = { Identifier = "LRO_NAC_RockAbndHaz_26S265E_200cmp", Name = [[LRO LROC Rock Abundance Hazard, Orientale 1]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Orientale_1.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Orientale_1.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_53N354E_150cmp = { Identifier = "LRO_NAC_RockAbndHaz_53N354E_150cmp", Name = [[LRO LROC Rock Abundance Hazard, Plato Ejecta]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Plato_Ejecta.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Plato_Ejecta.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_60S200E_150cmp = { Identifier = "LRO_NAC_RockAbndHaz_60S200E_150cmp", Name = [[LRO LROC Rock Abundance Hazard, South Pole-Aitken Basin Interior]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/South_Pole-Aitken_Basin_Interior.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/South_Pole-Aitken_Basin_Interior.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_02S167E_150cmp = { Identifier = "LRO_NAC_RockAbndHaz_02S167E_150cmp", Name = [[LRO LROC Rock Abundance Hazard, Stratton (Dewar) High Fe Anomaly]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Stratton_Dewar_High_Fe_Anomaly.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Stratton_Dewar_High_Fe_Anomaly.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_20N010E_2mp = { Identifier = "LRO_NAC_RockAbndHaz_20N010E_2mp", Name = [[LRO LROC Rock Abundance Hazard, Sulpicius Gallus]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Sulpicius_Gallus.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Sulpicius_Gallus.vrt"), Description = [[]] } local treks_LRO_NAC_RockAbndHaz_43S349E_150cmp = { Identifier = "LRO_NAC_RockAbndHaz_43S349E_150cmp", Name = [[LRO LROC Rock Abundance Hazard, Tycho Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Abundance_Hazard/Tycho_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Abundance_Hazard/Tycho_Crater.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Rock_Density.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Rock_Density.asset index f24a52ba9f..75a5f16111 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Rock_Density.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Rock_Density.asset @@ -9,168 +9,168 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_NAC_RockDen_17S173E_150cmp = { Identifier = "LRO_NAC_RockDen_17S173E_150cmp", Name = [[LRO LROC Rock Density, Aitken Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Aitken_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Aitken_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_13S358E_2mp = { Identifier = "LRO_NAC_RockDen_13S358E_2mp", Name = [[LRO LROC Rock Density, Alphonsus Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Alphonsus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Alphonsus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_73N350E_150cmp = { Identifier = "LRO_NAC_RockDen_73N350E_150cmp", Name = [[LRO LROC Rock Density, Anaxagoras Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Anaxagoras_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Anaxagoras_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_26N004E_150cmp = { Identifier = "LRO_NAC_RockDen_26N004E_150cmp", Name = [[LRO LROC Rock Density, Apollo 15]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Apollo_15.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Apollo_15.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_09S015E_150cmp = { Identifier = "LRO_NAC_RockDen_09S015E_150cmp", Name = [[LRO LROC Rock Density, Apollo 16]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Apollo_16.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Apollo_16.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_37S206E_150cmp = { Identifier = "LRO_NAC_RockDen_37S206E_150cmp", Name = [[LRO LROC Rock Density, Apollo Basin]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Apollo_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Apollo_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_25N311E_2mp = { Identifier = "LRO_NAC_RockDen_25N311E_2mp", Name = [[LRO LROC Rock Density, Aristarchus 1]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Aristarchus_1.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Aristarchus_1.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_28N307E_150cmp = { Identifier = "LRO_NAC_RockDen_28N307E_150cmp", Name = [[LRO LROC Rock Density, Aristarchus 2]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Aristarchus_2.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Aristarchus_2.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_19S070E_150cmp = { Identifier = "LRO_NAC_RockDen_19S070E_150cmp", Name = [[LRO LROC Rock Density, Balmer Basin]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Balmer_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Balmer_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_20S337E_400cmp = { Identifier = "LRO_NAC_RockDen_20S337E_400cmp", Name = [[LRO LROC Rock Density, Bullialdus Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Bullialdus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Bullialdus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_36N320E_2mp = { Identifier = "LRO_NAC_RockDen_36N320E_2mp", Name = [[LRO LROC Rock Density, Gruithuisen Domes]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Gruithuisen_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Gruithuisen_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_17S173E_150cmp = { Identifier = "LRO_NAC_RockDenHaz_17S173E_150cmp", Name = [[LRO LROC Rock Density, Hazard Aitken Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Hazard_Aitken_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Hazard_Aitken_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_00N234E_150cmp = { Identifier = "LRO_NAC_RockDen_00N234E_150cmp", Name = [[LRO LROC Rock Density, Hertzsprung]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Hertzsprung.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Hertzsprung.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_08N332E_2mp = { Identifier = "LRO_NAC_RockDen_08N332E_2mp", Name = [[LRO LROC Rock Density, Hortensius Domes]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Hortensius_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Hortensius_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_06N120E_200cmp = { Identifier = "LRO_NAC_RockDen_06N120E_200cmp", Name = [[LRO LROC Rock Density, King Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/King_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/King_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_32N292E_2mp = { Identifier = "LRO_NAC_RockDen_32N292E_2mp", Name = [[LRO LROC Rock Density, Lichtenberg Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Lichtenberg_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Lichtenberg_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_10N058E_150cmp = { Identifier = "LRO_NAC_RockDen_10N058E_150cmp", Name = [[LRO LROC Rock Density, Mare Crisium]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Mare_Crisium.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Mare_Crisium.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_16S041E_150cmp = { Identifier = "LRO_NAC_RockDen_16S041E_150cmp", Name = [[LRO LROC Rock Density, Montes Pyrenaeus]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Montes_Pyrenaeus.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Montes_Pyrenaeus.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_26S265E_200cmp = { Identifier = "LRO_NAC_RockDen_26S265E_200cmp", Name = [[LRO LROC Rock Density, Orientale 1]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Orientale_1.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Orientale_1.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_53N354E_150cmp = { Identifier = "LRO_NAC_RockDen_53N354E_150cmp", Name = [[LRO LROC Rock Density, Plato Ejecta]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Plato_Ejecta.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Plato_Ejecta.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_60S200E_150cmp = { Identifier = "LRO_NAC_RockDen_60S200E_150cmp", Name = [[LRO LROC Rock Density, South Pole-Aitken Basin Interior]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/South_Pole-Aitken_Basin_Interior.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/South_Pole-Aitken_Basin_Interior.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_02S167E_150cmp = { Identifier = "LRO_NAC_RockDen_02S167E_150cmp", Name = [[LRO LROC Rock Density, Stratton (Dewar) High Fe Anomaly]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Stratton_Dewar_High_Fe_Anomaly.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Stratton_Dewar_High_Fe_Anomaly.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_20N010E_2mp = { Identifier = "LRO_NAC_RockDen_20N010E_2mp", Name = [[LRO LROC Rock Density, Sulpicius Gallus]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Sulpicius_Gallus.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Sulpicius_Gallus.vrt"), Description = [[]] } local treks_LRO_NAC_RockDen_43S349E_150cmp = { Identifier = "LRO_NAC_RockDen_43S349E_150cmp", Name = [[LRO LROC Rock Density, Tycho Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Density/Tycho_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density/Tycho_Crater.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Rock_Density_Hazard.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Rock_Density_Hazard.asset index fdc01e0b65..9a1c107cc8 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Rock_Density_Hazard.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_LROC_Rock_Density_Hazard.asset @@ -9,154 +9,154 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_NAC_RockDenHaz_13S358E_2mp = { Identifier = "LRO_NAC_RockDenHaz_13S358E_2mp", Name = [[LRO LROC Rock Density Hazard, Alphonsus Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Alphonsus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Alphonsus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_73N350E_150cmp = { Identifier = "LRO_NAC_RockDenHaz_73N350E_150cmp", Name = [[LRO LROC Rock Density Hazard, Anaxagoras Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Anaxagoras_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Anaxagoras_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_26N004E_150cmp = { Identifier = "LRO_NAC_RockDenHaz_26N004E_150cmp", Name = [[LRO LROC Rock Density Hazard, Apollo 15]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Apollo_15.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Apollo_15.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_09S015E_150cmp = { Identifier = "LRO_NAC_RockDenHaz_09S015E_150cmp", Name = [[LRO LROC Rock Density Hazard, Apollo 16]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Apollo_16.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Apollo_16.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_37S206E_150cmp = { Identifier = "LRO_NAC_RockDenHaz_37S206E_150cmp", Name = [[LRO LROC Rock Density Hazard, Apollo Basin]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Apollo_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Apollo_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_25N311E_2mp = { Identifier = "LRO_NAC_RockDenHaz_25N311E_2mp", Name = [[LRO LROC Rock Density Hazard, Aristarchus 1]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Aristarchus_1.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Aristarchus_1.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_28N307E_150cmp = { Identifier = "LRO_NAC_RockDenHaz_28N307E_150cmp", Name = [[LRO LROC Rock Density Hazard, Aristarchus 2]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Aristarchus_2.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Aristarchus_2.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_19S070E_150cmp = { Identifier = "LRO_NAC_RockDenHaz_19S070E_150cmp", Name = [[LRO LROC Rock Density Hazard, Balmer Basin]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Balmer_Basin.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Balmer_Basin.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_20S337E_400cmp = { Identifier = "LRO_NAC_RockDenHaz_20S337E_400cmp", Name = [[LRO LROC Rock Density Hazard, Bullialdus Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Bullialdus_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Bullialdus_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_36N320E_2mp = { Identifier = "LRO_NAC_RockDenHaz_36N320E_2mp", Name = [[LRO LROC Rock Density Hazard, Gruithuisen Domes]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Gruithuisen_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Gruithuisen_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_00N234E_150cmp = { Identifier = "LRO_NAC_RockDenHaz_00N234E_150cmp", Name = [[LRO LROC Rock Density Hazard, Hertzsprung]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Hertzsprung.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Hertzsprung.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_08N332E_2mp = { Identifier = "LRO_NAC_RockDenHaz_08N332E_2mp", Name = [[LRO LROC Rock Density Hazard, Hortensius Domes]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Hortensius_Domes.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Hortensius_Domes.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_06N120E_200cmp = { Identifier = "LRO_NAC_RockDenHaz_06N120E_200cmp", Name = [[LRO LROC Rock Density Hazard, King Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/King_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/King_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_32N292E_2mp = { Identifier = "LRO_NAC_RockDenHaz_32N292E_2mp", Name = [[LRO LROC Rock Density Hazard, Lichtenberg Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Lichtenberg_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Lichtenberg_Crater.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_10N058E_150cmp = { Identifier = "LRO_NAC_RockDenHaz_10N058E_150cmp", Name = [[LRO LROC Rock Density Hazard, Mare Crisium]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Mare_Crisium.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Mare_Crisium.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_16S041E_150cmp = { Identifier = "LRO_NAC_RockDenHaz_16S041E_150cmp", Name = [[LRO LROC Rock Density Hazard, Montes Pyrenaeus]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Montes_Pyrenaeus.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Montes_Pyrenaeus.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_26S265E_200cmp = { Identifier = "LRO_NAC_RockDenHaz_26S265E_200cmp", Name = [[LRO LROC Rock Density Hazard, Orientale 1]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Orientale_1.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Orientale_1.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_53N354E_150cmp = { Identifier = "LRO_NAC_RockDenHaz_53N354E_150cmp", Name = [[LRO LROC Rock Density Hazard, Plato Ejecta]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Plato_Ejecta.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Plato_Ejecta.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_60S200E_150cmp = { Identifier = "LRO_NAC_RockDenHaz_60S200E_150cmp", Name = [[LRO LROC Rock Density Hazard, South Pole-Aitken Basin Interior]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/South_Pole-Aitken_Basin_Interior.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/South_Pole-Aitken_Basin_Interior.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_02S167E_150cmp = { Identifier = "LRO_NAC_RockDenHaz_02S167E_150cmp", Name = [[LRO LROC Rock Density Hazard, Stratton (Dewar) High Fe Anomaly]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Stratton_Dewar_High_Fe_Anomaly.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Stratton_Dewar_High_Fe_Anomaly.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_20N010E_2mp = { Identifier = "LRO_NAC_RockDenHaz_20N010E_2mp", Name = [[LRO LROC Rock Density Hazard, Sulpicius Gallus]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Sulpicius_Gallus.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Sulpicius_Gallus.vrt"), Description = [[]] } local treks_LRO_NAC_RockDenHaz_43S349E_150cmp = { Identifier = "LRO_NAC_RockDenHaz_43S349E_150cmp", Name = [[LRO LROC Rock Density Hazard, Tycho Crater]], - FilePath = asset.localResource("LRO_LROC_Rock_Density_Hazard/Tycho_Crater.vrt"), + FilePath = asset.resource("LRO_LROC_Rock_Density_Hazard/Tycho_Crater.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Laser_Altimeter.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Laser_Altimeter.asset index 189254ff5d..dc5205175f 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Laser_Altimeter.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Laser_Altimeter.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_ldam_10 = { Identifier = "ldam_10", Name = [[LRO Laser Altimeter, Albedo Global]], - FilePath = asset.localResource("LRO_Laser_Altimeter/Albedo_Global.vrt"), + FilePath = asset.resource("LRO_Laser_Altimeter/Albedo_Global.vrt"), Description = [[The Lunar Orbiter Laser Altimeter (LOLA) experiment on Lunar Reconnaissance Orbiter (LRO) is a laser altimeter that also measures the strength of the return pulse from the lunar surface. These data have been used to estimate the reflectance (albedo) of the lunar surface, including regions lacking direct solar illumination. A new calibration of these data was used to generate a 2016 albedo map that features lower uncertainties overall and more consistent results in the polar regions than the previous 2014 version. (Improved calibration of reflectance data from the LRO Lunar Orbiter Laser Altimeter (LOLA) and implications for space weathering; M. Lemelin, P.G. Lucey, G.A. Neumann, E.M. Mazarico, M.K. Barker, A. Kakazu, D. Trang, D.E. Smith, M.T. Zuber; Icarus, Volume 273, 15 July 2016, Pages 315-328)]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Mini-RF_Circular_Polarization_Ratio.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Mini-RF_Circular_Polarization_Ratio.asset index e9225827bf..4f2d601e87 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Mini-RF_Circular_Polarization_Ratio.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Mini-RF_Circular_Polarization_Ratio.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_MiniRF_CPR_Gray_Global_128ppd = { Identifier = "LRO_MiniRF_CPR_Gray_Global_128ppd", Name = [[LRO Mini-RF Circular Polarization Ratio, Grayscale]], - FilePath = asset.localResource("LRO_Mini-RF_Circular_Polarization_Ratio/Grayscale.vrt"), + FilePath = asset.resource("LRO_Mini-RF_Circular_Polarization_Ratio/Grayscale.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_ColorHillshade.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_ColorHillshade.asset index fd7ce6346f..fe834d704b 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_ColorHillshade.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_ColorHillshade.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_20191118demmoseqccolorhillshade = { Identifier = "20191118demmoseqccolorhillshade", Name = [[LRO NAC ColorHillshade, Lacus Mortis]], - FilePath = asset.localResource("LRO_NAC_ColorHillshade/Lacus_Mortis.vrt"), + FilePath = asset.resource("LRO_NAC_ColorHillshade/Lacus_Mortis.vrt"), Description = [[TBD]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_Mosaic.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_Mosaic.asset index a9eb29d17d..fd87dc86c8 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_Mosaic.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_Mosaic.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_20200415_lacusmortis_orthomos_filled_8bit_lzw = { Identifier = "20200415_lacusmortis_orthomos_filled_8bit_lzw", Name = [[LRO NAC Mosaic, Lacus Mortis, Extended Version]], - FilePath = asset.localResource("LRO_NAC_Mosaic/Lacus_Mortis.vrt"), + FilePath = asset.resource("LRO_NAC_Mosaic/Lacus_Mortis.vrt"), Description = [[This is an orthoimage mosaic produced by combining LROC NAC images, for the southwestern area of Lacus Mortis, including Rimae Bürg and the Lacus Mortis Pit. The images are projected onto a DEM mosaic produced by stereo reconstructions in which each of the images is paired with another LROC NAC.]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_Mosaic_0.5mpp.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_Mosaic_0.5mpp.asset index a60559a59f..29881f42cb 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_Mosaic_0.5mpp.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_Mosaic_0.5mpp.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_NAC_Mosaic_50cmpp_VonKarman_v2 = { Identifier = "LRO_NAC_Mosaic_50cmpp_VonKarman_v2", Name = [[LRO NAC Mosaic 0.5mpp, Von Karman]], - FilePath = asset.localResource("LRO_NAC_Mosaic_0.5mpp/Von_Karman.vrt"), + FilePath = asset.resource("LRO_NAC_Mosaic_0.5mpp/Von_Karman.vrt"), Description = [[This is an orthorectified NAC mosaic of the Von Karman Crater region for the south pole of the Moon. This mosaic includes a total of 370 orthorectified NAC images: 252 sampled at 0.5 m/px and 118 sampled at 1 m/px. NAC orthoimages have been constructed from EDRs downloaded from the Planetary Data System (PDS) and subsequent USGS-ISIS processing. This mosaic has been coaligned to Chang'e-2 20 m/px DEM which has been coaligned to the USGS 59 m/px LOLA-SELENE DEM using ENVI (v5.6.2) patented auto-coreg. Most of the area used stereo-photogrammetrically processing of LROC-NAC stereo-pairs with the UCL CASPGO 3D mapping system, CASP-GO is described in Tao, Y., Muller, J.-P. et al. (2018) Massive Stereo-based DTM Production for Mars on Cloud Computers. Planetary Space Science 154, 30-58 (2018). doi: 10.1016/j.pss.2018.02.012 and CASP-GO is now integrated into ASP (https://stereopipeline.readthedocs.io/en/latest/experimental.html?highlight=casp-go#the-casp-go-stereo-processing-system) as part of the NASA PDART program. Individual NAC orthoimages mosaicked together using ArcGIS Pro (v2.9.2). A color balancing algorithm has been applied to roughly correct for color differences at the seams of NAC images. This data has been made available by and should be credited to: Yu Tao and Jan-Peter Muller, Imaging Group, Mullard Space Science Laboratory, University College London.]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_Mosaic_1mpp.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_Mosaic_1mpp.asset index b42b2bf72b..6ae7ed873e 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_Mosaic_1mpp.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_Mosaic_1mpp.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_NAC_Mosaic_1mpp = { Identifier = "LRO_NAC_Mosaic_1mpp", Name = [[LRO NAC Mosaic 1mpp, Von Karman]], - FilePath = asset.localResource("LRO_NAC_Mosaic_1mpp/Von_Karman.vrt"), + FilePath = asset.resource("LRO_NAC_Mosaic_1mpp/Von_Karman.vrt"), Description = [[This is an orthorectified NAC mosaic of the Von Karman Crater region for the south pole of the Moon. This mosaic includes 118 individual orthorectified NAC images sampled at 1 m/px. NAC orthoimages have been constructed from EDRs downloaded from the Planetary Data System (PDS) and subsequent USGS-ISIS processing. This mosaic has been coaligned to Chang’e 2 20 m/px DEM which has been coaligned to the USGS 59 m/px LOLA-SELENE DEM using ENVI (v5.6.2) patented auto-coreg. Individual NAC orthoimages have been mosaicked together using ArcGIS Pro (v2.9.0). A color balancing algorithm has been applied to roughly correct for color differences at the seams of NAC images. This data has been made available by and should be credited to: Yu Tao and Jan-Peter Muller, Imaging Group, Mullard Space Science Laboratory, University College London.]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_PSR_Mosaic_20mpp.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_PSR_Mosaic_20mpp.asset index d0ca877f5b..fa1a1071ae 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_PSR_Mosaic_20mpp.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_PSR_Mosaic_20mpp.asset @@ -9,14 +9,14 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_NAC_POLE_PSR_NORTH_STRETCH_EQ = { Identifier = "NAC_POLE_PSR_NORTH_STRETCH_EQ", Name = [[LRO NAC PSR Mosaic 20mpp, N Pole]], - FilePath = asset.localResource("LRO_NAC_PSR_Mosaic_20mpp/N_Pole.vrt"), + FilePath = asset.resource("LRO_NAC_PSR_Mosaic_20mpp/N_Pole.vrt"), Description = [[This is an uncontrolled mosaic generated from images taken by the Narrow Angle Camera (NAC) onboard the Lunar Reconnaissance Orbiter (LRO) for the North Pole region of the Moon. The NAC mosaics have been trimmed to the Permanently Shadowed Region (PSR) shapefile, providing visible NAC image coverage of the PSRs only. Acquisition of NAC PSR observations were optimized over several campaigns to maximize signal-to-noise ratio (SNR), resulting in a comprehensive dataset that is systematically reviewed and analyzed. Observations are acquired at a variety of pixel scales (2 to 20 m/px). The final PSR mosaics are assembled from re-sampled images to 20 m/px, and ordering of images is based on image quality and areal coverage of individual PSRs. A total of 550 NAC images were used to create a North Pole PSR mosaic at 20 m/px, 90° to 80° latitude, and -180° to 180° longitude. This mosaic has been merged with the existing LROC NAC North Pole RDR product to replace over-saturated illuminated polar areas.]] } local treks_NAC_POLE_PSR_SOUTH_STRETCH_EQ = { Identifier = "NAC_POLE_PSR_SOUTH_STRETCH_EQ", Name = [[LRO NAC PSR Mosaic 20mpp, S Pole]], - FilePath = asset.localResource("LRO_NAC_PSR_Mosaic_20mpp/S_Pole.vrt"), + FilePath = asset.resource("LRO_NAC_PSR_Mosaic_20mpp/S_Pole.vrt"), Description = [[This is an uncontrolled mosaic generated from images taken by the Narrow Angle Camera (NAC) onboard the Lunar Reconnaissance Orbiter (LRO) for the South Pole region of the Moon. The NAC mosaics have been trimmed to the Permanently Shadowed Region (PSR) shapefile, providing visible NAC image coverage of the PSRs only. Acquisition of NAC PSR observations were optimized over several campaigns to maximize signal-to-noise ratio (SNR), resulting in a comprehensive dataset that is systematically reviewed and analyzed. Observations are acquired at a variety of pixel scales (2 to 20 m/px). The final PSR mosaics are assembled from re-sampled images to 20 m/px, and ordering of images is based on image quality and areal coverage of individual PSRs. A total of 550 NAC images were used to create a South Pole PSR mosaic at 20 m/px, 90° to 80° latitude, and -180° to 180° longitude. This mosaic has been merged with the existing LROC NAC South Pole RDR product to replace over-saturated illuminated polar areas.]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_and_CE-2_CCD_Mosaic_1mpp.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_and_CE-2_CCD_Mosaic_1mpp.asset index a815a0aa32..5fd4fee268 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_and_CE-2_CCD_Mosaic_1mpp.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_NAC_and_CE-2_CCD_Mosaic_1mpp.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_NAC_CE2_Mosaic_1mpp = { Identifier = "LRO_NAC_CE2_Mosaic_1mpp", Name = [[LRO NAC and CE-2 CCD Mosaic 1mpp, Von Karman]], - FilePath = asset.localResource("LRO_NAC_and_CE-2_CCD_Mosaic_1mpp/Von_Karman.vrt"), + FilePath = asset.resource("LRO_NAC_and_CE-2_CCD_Mosaic_1mpp/Von_Karman.vrt"), Description = [[This is an orthorectified NAC and Chang’e-2 mosaic of the Von Karman Crater region for the south pole of the Moon. This mosaic includes 118 individual orthorectified NAC images sampled at 1 m/px and has been mosaicked on top of the respective Chang’e 7 m/px orthomosaic. NAC orthoimages have been constructed from EDRs downloaded from the Planetary Data System (PDS) and subsequent USGS-ISIS processing. This mosaic has been coaligned to Chang’e-2 20 m/px DEM which has been coaligned to the USGS 59 m/px LOLA-SELENE DEM using ENVI (v5.6.2) patented auto-coreg. Individual NAC orthoimages and the underlying Chang’e ortho product have been mosaicked together using ArcGIS Pro (v2.9.0). A color balancing algorithm has been applied to roughly correct for color differences at the seams of NAC images. This data has been made available by and should be credited to: Yu Tao and Jan-Peter Muller, Imaging Group, Mullard Space Science Laboratory, University College London.]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Narrow_Angle_Camera.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Narrow_Angle_Camera.asset index 6cce87ea53..78de5ec0a9 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Narrow_Angle_Camera.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_Narrow_Angle_Camera.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_NAC_Apollo11_Mosaic_p = { Identifier = "LRO_NAC_Apollo11_Mosaic_p", Name = [[LRO Narrow Angle Camera, Apollo 11 Landing Site]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Apollo_11_Landing_Site.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Apollo_11_Landing_Site.vrt"), Description = [[This is the site where American astronauts Neil Armstrong and Edwin “Buzz” Aldrin made the first human landing on the Moon on July 20, 1969. Armstrong and Aldrin landed here aboard the lunar module Eagle, while Michael Collins remained in orbit around the Moon in the command module Columbia. Armstrong and Aldrin conducted one EVA on the lunar surface lasting 2 hours, 31 minutes 40 seconds, remaining within 60 meters of the lunar module. They collected 21.55 kg of lunar sample material for return to the Earth. In this LRO NAC view of the landing site, the descent stage of the Eagle is the largest man-made object visible. The dark tracks of the astronauts' footprints extend out from it clustered primarily in 3 directions. To the northwest, the tracks extend to the location where the astronauts set up a TV camera. To the south, tracks extend to where a Lunar Ranging Retroreflector and the Passive Seismic Experiment Package were deployed. To the east, the tracks extend to the rim of Little West Crater. @@ -21,7 +21,7 @@ The landing site, located at 0.67416 N, 23.47314 E, is in the southwest part of local treks_LRO_NAC_Apollo12_Mosaic_p = { Identifier = "LRO_NAC_Apollo12_Mosaic_p", Name = [[LRO Narrow Angle Camera, Apollo 12 Landing Site]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Apollo_12_Landing_Site.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Apollo_12_Landing_Site.vrt"), Description = [[This is the site where American astronauts Charles “Pete” Conrad and Alan Bean made the second human landing on the Moon on November 19, 1969. Conrad and Bean landed here aboard the lunar module Intrepid, while Richard Gordon remained in orbit around the Moon in the command module Yankee Clipper. Apollo 12 demonstrated the key capability of a precision landing, with Intrepid touching down less than 200 meters from the site where the Surveyor 3 probe had landed on April 20, 1967. Conrad and Bean conducted 2 EVAs on the lunar surface. The first, lasting 3 hours, 56 minutes, extended to the northwest for deployment of the ALSEP instrument package, and the continued to the rim of a 350-meter diameter crater dubbed Middle Crescent. The second EVA, lasting 3 hours, 49 minutes, was a loop trip of 1.5 km around several craters to the south, including retrieval of a camera from Surveyor 3. They collected 34.35 kilograms of lunar sample material for return to the Earth. In this LRO NAC view of the landing site, the descent stage of the Intrepid is the largest man-made object visible. The dark tracks of the astronauts' footprints extend out from it. To the northwest, the tracks extend about 130 meters to were components of the ALSEP can be seen. About 160 meters to the southeast of Intrepid, Surveyor 3 is visible with a dense cluster of footprints around it. @@ -33,7 +33,7 @@ The landing site, located at 3.0138 S N, 23.4219 W, is in the southern part of O local treks_LRO_NAC_Apollo14_Mosaic_p = { Identifier = "LRO_NAC_Apollo14_Mosaic_p", Name = [[LRO Narrow Angle Camera, Apollo 14 Landing Site]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Apollo_14_Landing_Site.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Apollo_14_Landing_Site.vrt"), Description = [[This is the site where American astronauts Alan Shepard and Edgar Mitchell made the third human landing on the Moon on February 5, 1971. Shepard and Mitchell landed here aboard the lunar module Antares, while Stuart Roosa remained in orbit around the Moon in the command module Kitty Hawk. Shephard and Mitchell conducted 2 EVAs on the lunar surface. The first, lasting 4 hours, 47 minutes, 50 seconds, extended to the west for deployment of the ALSEP instrument package, included collection of a contingency sample, and covered a total distance of about 550 meters. The second EVA, lasting 4 hours, 34 minutes, 41 seconds, was intended to visit Cone Crater, 370 meters in diameter and located approximately 1.2 kilometers to the northeast. To help transport the load of equipment and retrieved samples on this EVA, the astronauts were equipped with a hand-pulled cart, the Modular Equipment Transporter (MET). The rough, hummocky terrain made navigation difficult during the second EVA, and the astronauts were not able to identify the rim of Cone Crater, though later imagery showed that they reached a point about 20 meters south of the crater rim. Shepard and Mitchell collected 42.80 kilograms of lunar sample material for return to the Earth. In this LRO NAC view of the landing site, the descent stage of the Antares is the largest man-made object visible. The dark tracks of the astronauts' footprints from the first EVA extend to the west, where components of the ALSEP are visible. Extending to the northeast of Antares' landing site, the track of the astronauts' footprints and the tracks of the MET's wheels can be traced toward Cone Crater. @@ -44,7 +44,7 @@ The landing site, located at 3.64589 S, 17.47194 W, was selected largely with th local treks_LRO_NAC_Apollo15_Mosaic_p = { Identifier = "LRO_NAC_Apollo15_Mosaic_p", Name = [[LRO Narrow Angle Camera, Apollo 15 Landing Site]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Apollo_15_Landing_Site.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Apollo_15_Landing_Site.vrt"), Description = [[This is the site where American astronauts David Scott and James Irwin made the fourth human landing on the Moon on July 30, 1971. Scott and Irwin landed here aboard the lunar module Falcon, while Alfred Worden remained in orbit around the Moon in the command module Endeavour. This was the first of the Apollo J missions. These featured a greater emphasis on conducting science on the Moon along with longer stays on the lunar surface. The J missions also included a lunar rover which allowed the astronauts to drive across the lunar surface, covering far greater areas, and carrying back more sample material. Scott first conducted a 33-minute stand-up EVA, surveying and imaging the local terrain through the upper hatch of the lunar module. Scott and Irwin then conducted 3 surface EVAs. The first, lasting 6 hours, 32 minutes, 42 seconds, involved deploying the Lunar Rover, and driving in it on a 10.3-km geological traverse. They drove southwest to the edge of Hadley Rille and then continued south along the edge of the rille. At the end of the first surface EVA, they deployed the Apollo Lunar Surface Experiments Package (ALSEP) approximately 110 meters north-northwest of the lunar module. The second surface EVA, lasting 7 hours, 12 minutes, 14 seconds, featured a 12.5-kilometer lunar rover traverse southeast across the mare and along the base of the Apennine Mountains. The third surface EVA, lasting 4 hours, 49 minutes, 50 seconds, had the astronauts making a 5.1-kilometer traverse west to Hadley Rille northwest along the edge of the rille, and east across the mare back to the lunar module. Scott and Irwin collected 77 kilograms of lunar sample material for return to the Earth. In this LRO NAC view of the landing site, the descent stage of the Falcon is the largest man-made object visible. The dark markings of the astronauts' footprints and rover tire tracks are visible around the landing site, especially extending to the north-northwest, where components of the ALSEP are visible. @@ -56,7 +56,7 @@ The landing site, located at 26.13239 N, 3.63330 E, was selected to provide acce local treks_LRO_NAC_Apollo16_Mosaic_p = { Identifier = "LRO_NAC_Apollo16_Mosaic_p", Name = [[LRO Narrow Angle Camera, Apollo 16 Landing Site]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Apollo_16_Landing_Site.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Apollo_16_Landing_Site.vrt"), Description = [[This is the site where American astronauts John Young and Charles Duke made the fifth human landing on the Moon on April 21, 1972. Young and Duke landed here aboard the lunar module Orion, while Ken Mattingly remained in orbit around the Moon in the command module Casper. Young and Duke conducted 3 surface EVAs. The first, lasting 7 hours, 11 minutes, 2 seconds, included deploying the Apollo Lunar Surface Experiments Package (ALSEP) approximately 95 meters southwest of the lunar module, and conducting a geologic traverse using the lunar rover to a couple of small craters within about 1,400 meters to the west of the landing site. The second surface EVA, lasting 7 hours, 23 minutes, 9 seconds, featured an 11.1-kilometer lunar rover drive south to the Cinco Crater area of Stone Mountain, making stops at 6 stations along the way. across the mare and along the base of the Apennine Mountains. The third surface EVA, lasting 5 hours, 40 minutes, 3 seconds, had the astronauts making a 11.4-kilometer traverse north to North Ray Crater. Young and Duke collected 95.71 kilograms of lunar sample material for return to the Earth. In this LRO NAC view of the landing site, the descent stage of the Orion is the largest man-made object visible, within a dark halo on the western rim of a ~30-meter crater. The dark markings of the astronauts' footprints and rover tire tracks are visible around the landing site, especially extending to the southwest, where components of the ALSEP are visible. @@ -68,63 +68,63 @@ With the previous Apollo landings having focused on the low, flat, basaltic terr local treks_NAC_DTM_APOLLO17_CLRSHADE = { Identifier = "NAC_DTM_APOLLO17_CLRSHADE", Name = [[LRO Narrow Angle Camera, ColorHillShade Apollo 17]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/ColorHillShade_Apollo_17.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/ColorHillShade_Apollo_17.vrt"), Description = [[Color-coded topography draped over the shaded relief from a 5m Digital Terrain Model (DTM) of the Apollo 17 landing site created with Narrow Angle Camera (NAC) stereo image pairs from the Lunar Reconnaissance Orbiter Camera (LROC) aboard the Lunar Reconnaissance Orbiter (LRO). The shaded relief image was generated with the sun azimuth of 315 degrees (northwest) and sun altitude of 45 degrees. ]] } local treks_NAC_DTM_APOLLO17_SHADE = { Identifier = "NAC_DTM_APOLLO17_SHADE", Name = [[LRO Narrow Angle Camera, HillShade Apollo 17]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/HillShade_Apollo_17.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/HillShade_Apollo_17.vrt"), Description = [[This is a shaded-relief derived from a 5m Digital Terrain Model (DTM) of the Apollo 17 landing site created with Narrow Angle Camera (NAC) stereo image pairs from the Lunar Reconnaissance Orbiter Camera (LROC) aboard the Lunar Reconnaissance Orbiter (LRO). The shaded relief image was generated with the sun azimuth of 315 degrees (northwest) and sun altitude of 45 degrees. Image is a TIFF image, 8 bits/sample, 1 samples/pixel in single image plane configuration.]] } local treks_A11_60x60kmeq = { Identifier = "A11_60x60kmeq", Name = [[LRO Narrow Angle Camera, Mosaic Apollo 11]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Mosaic_Apollo_11.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Mosaic_Apollo_11.vrt"), Description = [[This is a Lunar Reconnaisance Orbiter (LRO) Narrow Angle Camera (NAC) mosaic centered at the Apollo 11 landing site with an extent of 60x60km. Each NAC image was processed in ISIS3 at a resolution of 50cm pixel, color balanced, and synthesized into a single output.]] } local treks_A12_60x60km0_3eq = { Identifier = "A12_60x60km0_3eq", Name = [[LRO Narrow Angle Camera, Mosaic Apollo 12]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Mosaic_Apollo_12.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Mosaic_Apollo_12.vrt"), Description = [[This is a Lunar Reconnaissance Orbiter (LRO) Narrow Angle Camera (NAC) mosaic centered at the Apollo 12 landing site with an extent of 60x60km. Each NAC image was processed in ISIS3 at a resolution of 50cm pixel, color balanced, and synthesized into a single output. Apollo 12 was second crewed mission to land on the surface of the Moon. The mission launched on November 14th 1969, and landed five days later at the Ocean of Storms within walking distance of the Surveyor 3 spacecraft.]] } local treks_A14_60x60km0_3eq = { Identifier = "A14_60x60km0_3eq", Name = [[LRO Narrow Angle Camera, Mosaic Apollo 14]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Mosaic_Apollo_14.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Mosaic_Apollo_14.vrt"), Description = [[This is a Lunar Reconnaissance Orbiter (LRO) Narrow Angle Camera (NAC) mosaic centered at the Apollo 14 landing site with an extent of 60x60km. Each NAC image was processed in ISIS3 at a resolution of 50cm pixel, color balanced, and synthesized into a single output. Apollo 14 landed on the Moon February 15th 1971.]] } local treks_A15_60x60km0_2eq = { Identifier = "A15_60x60km0_2eq", Name = [[LRO Narrow Angle Camera, Mosaic Apollo 15]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Mosaic_Apollo_15.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Mosaic_Apollo_15.vrt"), Description = [[This is a Lunar Reconnaisance Orbiter (LRO) Narrow Angle Camera (NAC) mosaic centered at the Apollo 15 landing site with an extent of 60x60km. Each NAC image was processed in ISIS3 at a resolution of 50cm pixel, color balanced, and synthesized into a single output.]] } local treks_A16_60x60kmeq = { Identifier = "A16_60x60kmeq", Name = [[LRO Narrow Angle Camera, Mosaic Apollo 16]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Mosaic_Apollo_16.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Mosaic_Apollo_16.vrt"), Description = [[This is a Lunar Reconnaisance Orbiter (LRO) Narrow Angle Camera (NAC) mosaic centered at the Apollo 16 landing site with an extent of 60x60km. Each NAC image was processed in ISIS3 at a resolution of 50cm pixel, color balanced, and synthesized into a single output.]] } local treks_A17_60x60kmeq = { Identifier = "A17_60x60kmeq", Name = [[LRO Narrow Angle Camera, Mosaic Apollo 17]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Mosaic_Apollo_17.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Mosaic_Apollo_17.vrt"), Description = [[This is a Lunar Reconnaisance Orbiter (LRO) Narrow Angle Camera (NAC) mosaic centered at the Apollo 17 landing site with an extent of 60x60km. Each NAC image was processed in ISIS3 at a resolution of 50cm pixel, color balanced, and synthesized into a single output.]] } local treks_M129086118ndgcs = { Identifier = "M129086118ndgcs", Name = [[LRO Narrow Angle Camera, Mosaic Apollo 17 Landing Site]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Mosaic_Apollo_17_Landing_Site.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Mosaic_Apollo_17_Landing_Site.vrt"), Description = [[This is the site where American astronauts Eugene Cernan and Harrison Schmitt made the sixth and final human landing on the Moon of the Apollo program on December 11, 1972. Cernan and Schmitt landed here aboard the lunar module Challenger, while Ronald Evans remained in orbit around the Moon in the command module America. With a PhD in geology, Schmitt was the first and only professional scientist to have visited the Moon. Cernan and Schmitt conducted 3 surface EVAs. The first, lasting 7 hours, 11 minutes, 53 seconds, included deploying the Apollo Lunar Surface Experiments Package (ALSEP) approximately 185 meters west-northwest of the lunar module, and conducting a 3.5-kilometer geologic traverse using the lunar rover to the rim of Steno, a small impact crater south of the landing site. The second surface EVA, lasting 7 hours, 36 minutes, 56 seconds, featured a 20.4-kilometer geologic traverse south and west. Stops included a location at the base of South Massif where a landslide had brought ancient highland rocks from high on the mountain into reach, and at Shorty Crater, which was found to be impact rather than volcanic in origin, but which excavated an older volcanic deposit which yielded the famous , beads of volcanic glass erupted in a lunar fire fountain. The third surface EVA, lasting 7 hours, 15 minutes, 8 seconds, had the astronauts making a 20.4-kilometer geologic traverse north and east to North Massif. Stops on this traverse included taking samples of early lunar crust material from large boulders near the base of the massif that had rolled down from high up on the mountain. Cernan and Schmitt collected 110.52 kilograms of lunar sample material for return to the Earth. In this LRO NAC view of the landing site, the descent stage of the Challenger is the largest man-made object visible. The dark markings of the astronauts' footprints and rover tire tracks are visible around the landing site, especially extending to the west-northwest, where components of the ALSEP are visible. @@ -135,77 +135,77 @@ The landing site, located at 20.1911 N, 30.7723 E, is in a narrow valley in the local treks_ingenii_skylight = { Identifier = "ingenii_skylight", Name = [[LRO Narrow Angle Camera, Mosaic Ingenii]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Mosaic_Ingenii.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Mosaic_Ingenii.vrt"), Description = [[Mare Ingenii is notable for being one of the few examples of a mare on the far side of the Moon, and the site for notable lunar swirls, enigmatic bright albedo features. This was enough to qualify the area as a Constellation Region of Interest. However, the area became even more interesting with the discovery of a lunar pit in imagery obtained using the Kaguya Terrain Camera. It measures about 130 m in diameter, and researchers speculate that the pit could be a skylight resulting from the collapse of the roof of a lava tube. Whether this is actually the case, and if so, the accessibility and extent of the lava tube have yet to be determined. However, such lava tubes are of great interest as potential locations for lunar bases, offering protection from extreme swings in temperature, galactic and solar radiation, and meteoroid impacts. This data layer was obtained using the Narrow Angle Camera aboard the Lunar Reconnaissance Orbiter and is a is a mosaic of 2 NAC strips centered on the Mare Ingenii pit.]] } local treks_marius_skylight = { Identifier = "marius_skylight", Name = [[LRO Narrow Angle Camera, Mosaic Marius]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Mosaic_Marius.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Mosaic_Marius.vrt"), Description = [[The Marius Hills represents one of the most prominent collection of volcanic domes on the Moon. The area was a candidate landing site for the Apollo program and was also designated as a Constellation Region of Interest. It remains a site under consideration for possible future missions. In addition to volcanic domes, the area features basaltic flows, sinuous rilles, and one prominent lunar pit. The Marius Hills pit measures 58 x 49 m in diameter and 40 m deep. It was first noticed in an image taken with the Kaguya Terrain Camera on May 20, 2008, by a team led by Junichi Haruyama . The fact that the Marius Hills pit is located on the floor of a sinuous rille has encouraged speculation the pit could be a skylight resulting from the collapse of the roof of a lava tube. Whether this is actually the case, and if so, the accessibility and extent of the lava tube have yet to be determined. However, such lava tubes are of great interest as potential locations for lunar bases, offering protection from extreme swings in temperature, galactic and solar radiation, and meteoroid impacts. This data layer was obtained using the Narrow Angle Camera aboard the Lunar Reconnaissance Orbiter and is a is a mosaic of 2 NAC strips centered on the Marius Hills pit.]] } local treks_LRO_NAC_Schrodinger = { Identifier = "LRO_NAC_Schrodinger", Name = [[LRO Narrow Angle Camera, Mosaic Schrodinger]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Mosaic_Schrodinger.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Mosaic_Schrodinger.vrt"), Description = [[This is a visible image mosaic generated using Lunar Reconnaissance Orbiter Camera (LROC) Narrow Angle Camera (NAC) images from the Lunar Reconnaissance Orbiter mission. The images were orthorectified using a digital elevation model (DEM) created from LROC NAC stereo images, when available, or LRO's Lunar Orbiter Laser Altimeter (LOLA) global DEM. The mosaic is generated at the same resolution at which the individual LROC NAC images were gathered, which is approximately 0.5 meters/pixel. The mosaic was registered horizontally to the LOLA global DEM.]] } local treks_schrodingerextraswathseq = { Identifier = "schrodingerextraswathseq", Name = [[LRO Narrow Angle Camera, Mosaic Schrodinger Extra]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Mosaic_Schrodinger_Extra.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Mosaic_Schrodinger_Extra.vrt"), Description = [[TBD]] } local treks_LRO_NAC_SchrodingerLandingSite2 = { Identifier = "LRO_NAC_SchrodingerLandingSite2", Name = [[LRO Narrow Angle Camera, Mosaic Schrodinger Landing Site]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Mosaic_Schrodinger_Landing_Site.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Mosaic_Schrodinger_Landing_Site.vrt"), Description = [[This is a visible image mosaic generated using Lunar Reconnaissance Orbiter Camera (LROC) Narrow Angle Camera (NAC) images from the Lunar Reconnaissance Orbiter mission. The images were orthorectified using a digital elevation model (DEM) created from LROC NAC stereo images, when available, or LRO's Lunar Orbiter Laser Altimeter (LOLA) global DEM. The mosaic is generated at the same resolution at which the individual LROC NAC images were gathered, which is approximately 0.5 meters/pixel. The mosaic was registered horizontally to the LOLA global DEM.]] } local treks_schrodingerneequirect = { Identifier = "schrodingerneequirect", Name = [[LRO Narrow Angle Camera, Mosaic Schrodinger NorthEast]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Mosaic_Schrodinger_NorthEast.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Mosaic_Schrodinger_NorthEast.vrt"), Description = [[This is a visible image mosaic generated using Lunar Reconnaissance Orbiter Camera (LROC) Narrow Angle Camera (NAC) images from the Lunar Reconnaissance Orbiter mission. Each NAC image was registered horizontally to the LRO's Lunar Orbiter Laser Altimeter (LOLA) global DEM, and then mosaicked together and color balanced. The mosaic is generated at the same resolution at which the individual LROC NAC images were gathered, which is approximately 1 meters/pixel.]] } local treks_schrodingerscequirect = { Identifier = "schrodingerscequirect", Name = [[LRO Narrow Angle Camera, Mosaic Schrodinger SouthCenter]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Mosaic_Schrodinger_SouthCenter.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Mosaic_Schrodinger_SouthCenter.vrt"), Description = [[This is a visible image mosaic generated using Lunar Reconnaissance Orbiter Camera (LROC) Narrow Angle Camera (NAC) images from the Lunar Reconnaissance Orbiter mission. Each NAC image was registered horizontally to the LRO's Lunar Orbiter Laser Altimeter (LOLA) global DEM, and then mosaicked together and color balanced. The mosaic is generated at the same resolution at which the individual LROC NAC images were gathered, which is approximately 1 meters/pixel.]] } local treks_schrodingerseequirect = { Identifier = "schrodingerseequirect", Name = [[LRO Narrow Angle Camera, Mosaic Schrodinger SouthEast]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Mosaic_Schrodinger_SouthEast.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Mosaic_Schrodinger_SouthEast.vrt"), Description = [[This is a visible image mosaic generated using Lunar Reconnaissance Orbiter Camera (LROC) Narrow Angle Camera (NAC) images from the Lunar Reconnaissance Orbiter mission. Each NAC image was registered horizontally to the LRO's Lunar Orbiter Laser Altimeter (LOLA) global DEM, and then mosaicked together and color balanced. The mosaic is generated at the same resolution at which the individual LROC NAC images were gathered, which is approximately 1 meters/pixel.]] } local treks_small_tranq_skylight_1 = { Identifier = "small_tranq_skylight_1", Name = [[LRO Narrow Angle Camera, Mosaic Small Tranquilltatis 1]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Mosaic_Small_Tranquilltatis_1.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Mosaic_Small_Tranquilltatis_1.vrt"), Description = [[The discovery of three lunar pits using imagery from imagery obtained using the Kaguya Terrain Camera led researchers to wonder how common such features might be. A very successful campaign was mounted to search Lunar Reconnaissance Orbiter Narrow Angle Camera (NAC) images to see if the higher resolution of NAC might reveal more lunar pits smaller than were detectable with the Kaguya Terrain Camera (R. V. Wagner and M. S. Robinson, 2015, UPDATE: THE SEARCH FOR LUNAR PITS, 2nd International Planetary Caves Conference). Researchers speculate that these lunar pits could be skylights resulting from roof collapse in lava tubes. Whether this is actually the case, and if so, the accessibility and extent of the lava tubes have yet to be determined. However, such lava tubes are of great interest as potential locations for lunar bases, offering protection from extreme swings in temperature, galactic and solar radiation, and meteoroid impacts. This data layer was obtained using the Narrow Angle Camera aboard the Lunar Reconnaissance Orbiter and is a is a mosaic of 2 NAC strips centered on a small pit in Mare Tranquillitatis.]] } local treks_small_tranq_skylight_2 = { Identifier = "small_tranq_skylight_2", Name = [[LRO Narrow Angle Camera, Mosaic Small Tranquilltatis 2]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Mosaic_Small_Tranquilltatis_2.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Mosaic_Small_Tranquilltatis_2.vrt"), Description = [[The discovery of three lunar pits using imagery from imagery obtained using the Kaguya Terrain Camera led researchers to wonder how common such features might be. A very successful campaign was mounted to search Lunar Reconnaissance Orbiter Narrow Angle Camera (NAC) images to see if the higher resolution of NAC might reveal more lunar pits smaller than were detectable with the Kaguya Terrain Camera (R. V. Wagner and M. S. Robinson, 2015, UPDATE: THE SEARCH FOR LUNAR PITS, 2nd International Planetary Caves Conference). Researchers speculate that these lunar pits could be skylights resulting from roof collapse in lava tubes. Whether this is actually the case, and if so, the accessibility and extent of the lava tubes have yet to be determined. However, such lava tubes are of great interest as potential locations for lunar bases, offering protection from extreme swings in temperature, galactic and solar radiation, and meteoroid impacts. This data layer was obtained using the Narrow Angle Camera aboard the Lunar Reconnaissance Orbiter and is a is a mosaic of 2 NAC strips centered on a small pit in Mare Tranquillitatis.]] } local treks_NAC_DTM_APOLLO17_SLOPE = { Identifier = "NAC_DTM_APOLLO17_SLOPE", Name = [[LRO Narrow Angle Camera, Slope Apollo 17]], - FilePath = asset.localResource("LRO_Narrow_Angle_Camera/Slope_Apollo_17.vrt"), + FilePath = asset.resource("LRO_Narrow_Angle_Camera/Slope_Apollo_17.vrt"), Description = [[This is a color slope map derived from a 5m Digital Terrain Model (DTM) of the Apollo 17 landing site created with Narrow Angle Camera (NAC) stereo image pairs from the Lunar Reconnaissance Orbiter Camera (LROC) aboard the Lunar Reconnaissance Orbiter (LRO). Image is 3-channel RGB TIFF, 8 bits/sample, 3 samples/pixel in single image plane configuration]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_WAC-GLD100_DEM.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_WAC-GLD100_DEM.asset index b79cfafafa..46d3eba271 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_WAC-GLD100_DEM.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_WAC-GLD100_DEM.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_WACGLD100_Gray_79S79N_256ppd = { Identifier = "LRO_WACGLD100_Gray_79S79N_256ppd", Name = [[LRO WAC-GLD100 DEM, Grayscale]], - FilePath = asset.localResource("LRO_WAC-GLD100_DEM/Grayscale.vrt"), + FilePath = asset.resource("LRO_WAC-GLD100_DEM/Grayscale.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_WAC_GLD100_DEM.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_WAC_GLD100_DEM.asset index b1e8e6ab82..1f64a5cbce 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_WAC_GLD100_DEM.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_WAC_GLD100_DEM.asset @@ -9,14 +9,14 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_LRO_WACGLD100_ClrShade_79S79N_256ppd = { Identifier = "LRO_WACGLD100_ClrShade_79S79N_256ppd", Name = [[LRO WAC GLD100 DEM, ColorHillShade]], - FilePath = asset.localResource("LRO_WAC_GLD100_DEM/ColorHillShade.vrt"), + FilePath = asset.resource("LRO_WAC_GLD100_DEM/ColorHillShade.vrt"), Description = [[]] } local treks_LRO_WACGLD100_Shade_79S79N_256ppd = { Identifier = "LRO_WACGLD100_Shade_79S79N_256ppd", Name = [[LRO WAC GLD100 DEM, Hillshade]], - FilePath = asset.localResource("LRO_WAC_GLD100_DEM/Hillshade.vrt"), + FilePath = asset.resource("LRO_WAC_GLD100_DEM/Hillshade.vrt"), Description = [[]] } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_and_Kaguya_Multi_Instruments_1895.21mpp.asset b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_and_Kaguya_Multi_Instruments_1895.21mpp.asset index b712baf75b..7a72733e9e 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_and_Kaguya_Multi_Instruments_1895.21mpp.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/nasa-treks/LRO_and_Kaguya_Multi_Instruments_1895.21mpp.asset @@ -9,35 +9,35 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/earth/moon/moo local treks_3He_Dig_Here_Layer = { Identifier = "3He_Dig_Here_Layer", Name = [[LRO and Kaguya Multi Instruments 1895.21mpp, 3He Dig Here]], - FilePath = asset.localResource("LRO_and_Kaguya_Multi_Instruments_1895.21mpp/3He_Dig_Here.vrt"), + FilePath = asset.resource("LRO_and_Kaguya_Multi_Instruments_1895.21mpp/3He_Dig_Here.vrt"), Description = [[This data represents potential Helium-3 deposits and other solar wind implanted volatiles on the Moon. This data layer has been generated by querying specific criteria from the following datasets: Titanium Oxide (TiO2) abundance from Lunar Reconnaissance Orbiter’s (LRO) Wide-Angle Camera (WAC), Optical Maturity Index (OMAT) from Kaguya Lunar Multiband Imager (MI), slope from LRO’s Lunar Orbital Laser Altimeter (LOLA), and Rock Abundance from LRO’s Lunar Radiometer Experiment (DIVINER). For this “Dig Here” layer, the following criteria has been applied: TiO2 > 9.0%, OMAT < 0.15, Slope < 4°, and rock abundance < 0.02%. The research on Helium-3 as a potential use for fuel for a fusion cell and the data presented as a result of this research culminated as an outcome of a group project at the Colorado School of Mines. The research for this data should be credited to: Stewart Ray, Colleen Olson, Lisa Robibero, Steven Coutts, and Maxwell Sissman of the Planetary and Terrestrial Mining Sciences Symposium and Space Resources Roundtable, Colorado School of Mines.]] } local treks_3He_Likely_Layer = { Identifier = "3He_Likely_Layer", Name = [[LRO and Kaguya Multi Instruments 1895.21mpp, 3He Likely]], - FilePath = asset.localResource("LRO_and_Kaguya_Multi_Instruments_1895.21mpp/3He_Likely.vrt"), + FilePath = asset.resource("LRO_and_Kaguya_Multi_Instruments_1895.21mpp/3He_Likely.vrt"), Description = [[This data represents potential Helium-3 deposits and other solar wind implanted volatiles on the Moon. This data layer has been generated by querying specific criteria from the following datasets: Titanium Oxide (TiO2) abundance from Lunar Reconnaissance Orbiter’s (LRO) Wide-Angle Camera (WAC), Optical Maturity Index (OMAT) from Kaguya Lunar Multiband Imager (MI), slope from LRO’s Lunar Orbital Laser Altimeter (LOLA), and Rock Abundance from LRO’s Lunar Radiometer Experiment (DIVINER). For this “Likely” layer, the following criteria has been applied: TiO2 > 3.0%, OMAT < 0.25, Slope < 20°, and rock abundance < 0.10%. The research on Helium-3 as a potential use for fuel for a fusion cell and the data presented as a result of this research culminated as an outcome of a group project at the Colorado School of Mines. The research for this data should be credited to: Stewart Ray, Colleen Olson, Lisa Robibero, Steven Coutts, and Maxwell Sissman of the Planetary and Terrestrial Mining Sciences Symposium and Space Resources Roundtable, Colorado School of Mines.]] } local treks_3He_More_Likely_Layer = { Identifier = "3He_More_Likely_Layer", Name = [[LRO and Kaguya Multi Instruments 1895.21mpp, 3He More Likely]], - FilePath = asset.localResource("LRO_and_Kaguya_Multi_Instruments_1895.21mpp/3He_More_Likely.vrt"), + FilePath = asset.resource("LRO_and_Kaguya_Multi_Instruments_1895.21mpp/3He_More_Likely.vrt"), Description = [[This data represents potential Helium-3 deposits and other solar wind implanted volatiles on the Moon. This data layer has been generated by querying specific criteria from the following datasets: Titanium Oxide (TiO2) abundance from Lunar Reconnaissance Orbiter’s (LRO) Wide-Angle Camera (WAC), Optical Maturity Index (OMAT) from Kaguya Lunar Multiband Imager (MI), slope from LRO’s Lunar Orbital Laser Altimeter (LOLA), and Rock Abundance from LRO’s Lunar Radiometer Experiment (DIVINER). For this “More Likely” layer, the following criteria has been applied: TiO2 > 4.5%, OMAT < 0.225, Slope < 16°, and rock abundance < 0.08%. The research on Helium-3 as a potential use for fuel for a fusion cell and the data presented as a result of this research culminated as an outcome of a group project at the Colorado School of Mines. The research for this data should be credited to: Stewart Ray, Colleen Olson, Lisa Robibero, Steven Coutts, and Maxwell Sissman of the Planetary and Terrestrial Mining Sciences Symposium and Space Resources Roundtable, Colorado School of Mines.]] } local treks_3He_Most_Likely_Layer = { Identifier = "3He_Most_Likely_Layer", Name = [[LRO and Kaguya Multi Instruments 1895.21mpp, 3He Most Likely]], - FilePath = asset.localResource("LRO_and_Kaguya_Multi_Instruments_1895.21mpp/3He_Most_Likely.vrt"), + FilePath = asset.resource("LRO_and_Kaguya_Multi_Instruments_1895.21mpp/3He_Most_Likely.vrt"), Description = [[This data represents potential Helium-3 deposits and other solar wind implanted volatiles on the Moon. This data layer has been generated by querying specific criteria from the following datasets: Titanium Oxide (TiO2) abundance from Lunar Reconnaissance Orbiter’s (LRO) Wide-Angle Camera (WAC), Optical Maturity Index (OMAT) from Kaguya Lunar Multiband Imager (MI), slope from LRO’s Lunar Orbital Laser Altimeter (LOLA), and Rock Abundance from LRO’s Lunar Radiometer Experiment (DIVINER). For this “Most Likely” layer, the following criteria has been applied: TiO2 > 7.5%, OMAT < 0.175, Slope < 8°, and rock abundance < 0.04%. The research on Helium-3 as a potential use for fuel for a fusion cell and the data presented as a result of this research culminated as an outcome of a group project at the Colorado School of Mines. The research for this data should be credited to: Stewart Ray, Colleen Olson, Lisa Robibero, Steven Coutts, and Maxwell Sissman of the Planetary and Terrestrial Mining Sciences Symposium and Space Resources Roundtable, Colorado School of Mines.]] } local treks_3He_Very_Likely_Layer = { Identifier = "3He_Very_Likely_Layer", Name = [[LRO and Kaguya Multi Instruments 1895.21mpp, 3He Very Likely]], - FilePath = asset.localResource("LRO_and_Kaguya_Multi_Instruments_1895.21mpp/3He_Very_Likely.vrt"), + FilePath = asset.resource("LRO_and_Kaguya_Multi_Instruments_1895.21mpp/3He_Very_Likely.vrt"), Description = [[This data represents potential Helium-3 deposits and other solar wind implanted volatiles on the Moon. This data layer has been generated by querying specific criteria from the following datasets: Titanium Oxide (TiO2) abundance from Lunar Reconnaissance Orbiter’s (LRO) Wide-Angle Camera (WAC), Optical Maturity Index (OMAT) from Kaguya Lunar Multiband Imager (MI), slope from LRO’s Lunar Orbital Laser Altimeter (LOLA), and Rock Abundance from LRO’s Lunar Radiometer Experiment (DIVINER). For this “Very Likely” layer, the following criteria has been applied: TiO2 > 6.0%, OMAT < 0.20, Slope < 12°, and rock abundance < 0.06%. The research on Helium-3 as a potential use for fuel for a fusion cell and the data presented as a result of this research culminated as an outcome of a group project at the Colorado School of Mines. The research for this data should be credited to: Stewart Ray, Colleen Olson, Lisa Robibero, Steven Coutts, and Maxwell Sissman of the Planetary and Terrestrial Mining Sciences Symposium and Space Resources Roundtable, Colorado School of Mines.]] } diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2000_carbon_monoxide.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2000_carbon_monoxide.asset index e627c703e4..f80b089ff5 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2000_carbon_monoxide.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2000_carbon_monoxide.asset @@ -16,7 +16,7 @@ volcanoes and brush burning. Between the anthropogenic and natural sources, scie estimate that the annual production of carbon monoxide is 2-5 gigatons]] local URL = "https://sos.noaa.gov/catalog/datasets/carbon-monoxide-2000/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2004_ir_hurricane.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2004_ir_hurricane.asset index b7c88a2d5e..e3122e3be3 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2004_ir_hurricane.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2004_ir_hurricane.asset @@ -16,7 +16,7 @@ hurricane season]] local URL = "https://sos.noaa.gov/catalog/datasets/hurricane-season-2004/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2005_hurricane-grayir.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2005_hurricane-grayir.asset index 22d4c3ffa4..54dc62e0eb 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2005_hurricane-grayir.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2005_hurricane-grayir.asset @@ -12,7 +12,7 @@ commerce for oceans and atmosphere and NOAA administrator]] local URL = "https://sos.noaa.gov/catalog/datasets/hurricane-season-2005/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2005_hurricane-wvsst.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2005_hurricane-wvsst.asset index b904040628..c0ef080763 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2005_hurricane-wvsst.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2005_hurricane-wvsst.asset @@ -12,7 +12,7 @@ commerce for oceans and atmosphere and NOAA administrator]] local URL = "https://sos.noaa.gov/catalog/datasets/hurricane-season-water-vapor-and-sst-2005/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2012_hurricane.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2012_hurricane.asset index 3d1c11732e..3f3e9068a4 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2012_hurricane.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/2012_hurricane.asset @@ -18,7 +18,7 @@ recorded by geostationary satellites]] local URL = "https://sos.noaa.gov/catalog/datasets/hurricane-season-2012/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_blackcarbon.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_blackcarbon.asset index 46d0b31305..9f1f47fd8c 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_blackcarbon.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_blackcarbon.asset @@ -20,7 +20,7 @@ Pinatubo]] local URL = "https://sos.noaa.gov/catalog/datasets/aerosols-black-carbon/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_blackcarbon_and_sulfate.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_blackcarbon_and_sulfate.asset index 635dd828d8..86bf016ffc 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_blackcarbon_and_sulfate.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_blackcarbon_and_sulfate.asset @@ -20,7 +20,7 @@ Pinatubo]] local URL = "https://sos.noaa.gov/catalog/datasets/aerosols-black-carbon-and-sulfate/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_sulfate.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_sulfate.asset index 68f8a0bd14..6a7ebd203e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_sulfate.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aerosol_sulfate.asset @@ -20,7 +20,7 @@ Pinatubo]] local URL = "https://sos.noaa.gov/catalog/datasets/aerosols-sulfate/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/airtraffic.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/airtraffic.asset index fcddb6a034..e4d6d301e7 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/airtraffic.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/airtraffic.asset @@ -15,7 +15,7 @@ takeoffs and landings." - From the National Air Traffic Controllers Association local URL = "https://sos.noaa.gov/catalog/datasets/air-traffic/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/all_sats.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/all_sats.asset index 7a1467473a..80b2539b4a 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/all_sats.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/all_sats.asset @@ -20,7 +20,7 @@ than one day]] local URL = "https://sos.noaa.gov/catalog/datasets/satellites-paths-and-positions/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aqua_swath.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aqua_swath.asset index f272694ac0..5b7df40b5a 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aqua_swath.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/aqua_swath.asset @@ -19,7 +19,7 @@ about the same local time everyday. Aqua crosses the equator from south to north local URL = "https://sos.noaa.gov/catalog/datasets/polar-orbiting-aqua-satellite-and-modis-swath/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbonflux.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbonflux.asset index 1f9b8a1bb3..a1f6807fdf 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbonflux.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbonflux.asset @@ -18,7 +18,7 @@ for CO2 and related trace gases. The data set shows daily average fluxes constru local URL = "https://sos.noaa.gov/catalog/datasets/polar-orbiting-aqua-satellite-and-modis-swath/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbontracker_2000_2100-fixed_scale.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbontracker_2000_2100-fixed_scale.asset index f56bd621f2..dd969db107 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbontracker_2000_2100-fixed_scale.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbontracker_2000_2100-fixed_scale.asset @@ -18,7 +18,7 @@ performed by the NOAA Global Monitoring Division and international partners]] local URL = "https://sos.noaa.gov/catalog/datasets/carbon-tracker-fixed-scale/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbontracker_2000_2100-sliding_scale.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbontracker_2000_2100-sliding_scale.asset index d63b070c1b..cb1c676a70 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbontracker_2000_2100-sliding_scale.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/carbontracker_2000_2100-sliding_scale.asset @@ -18,7 +18,7 @@ performed by the NOAA Global Monitoring Division and international partners]] local URL = "https://sos.noaa.gov/catalog/datasets/carbon-tracker-sliding-scale/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/climate_niche.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/climate_niche.asset index d66a48f2e3..d6fcfabaf8 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/climate_niche.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/climate_niche.asset @@ -21,7 +21,7 @@ projected to cover 19% of the global land and impact an estimated 3.5 billion pe local URL = "https://sos.noaa.gov/catalog/datasets/human-climate-niche-2020-and-2070/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/co_gmd.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/co_gmd.asset index d65682d582..557670a013 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/co_gmd.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/co_gmd.asset @@ -19,7 +19,7 @@ emissions from heavy traffic can produce CO concentrations of 200 - 5000 ppb]] local URL = "https://sos.noaa.gov/catalog/datasets/carbon-monoxide-2008-2011/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fim_chem.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fim_chem.asset index a8d9eaa785..9799f9951c 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fim_chem.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fim_chem.asset @@ -15,7 +15,7 @@ for better Earth system modeling for climate prediction]] local URL = "https://sos.noaa.gov/catalog/datasets/aerosols-fim-chem-model/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fossil_fuel.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fossil_fuel.asset index 340d39938a..fc43fc2b5a 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fossil_fuel.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fossil_fuel.asset @@ -22,7 +22,7 @@ human management of global resources]] local URL = "https://sos.noaa.gov/catalog/datasets/fossil-fuel-co2-release-2011-2012/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fukushima.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fukushima.asset index 5745f85178..6f7c10371b 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fukushima.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/fukushima.asset @@ -14,7 +14,7 @@ passively follow the wind]] local URL = "https://sos.noaa.gov/catalog/datasets/fukushima-radioactive-aerosol-dispersion-model/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/geo_sat.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/geo_sat.asset index c1b307452d..6b907476bf 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/geo_sat.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/geo_sat.asset @@ -18,7 +18,7 @@ local Description = [[Geostationary satellites are a key tool for scientists to local URL = "https://sos.noaa.gov/catalog/datasets/geostationary-satellites/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/geo_scan.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/geo_scan.asset index ea7f80eaa2..673b40fff3 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/geo_scan.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/geo_scan.asset @@ -18,7 +18,7 @@ worldwide]] local URL = "https://sos.noaa.gov/catalog/datasets/geostationary-satellites-scanning-pattern/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/giss_temp_anom.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/giss_temp_anom.asset index 93c0bb28bb..3c46da965f 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/giss_temp_anom.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/giss_temp_anom.asset @@ -10,7 +10,7 @@ not absolute temperature]] local URL = "https://sos.noaa.gov/catalog/datasets/temperature-anomaly-nasa-1884-2012/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/globe-insolation.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/globe-insolation.asset index 169c523ede..882d03bc59 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/globe-insolation.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/globe-insolation.asset @@ -14,7 +14,7 @@ places]] local URL = "https://sos.noaa.gov/catalog/datasets/solar-insolation-monthly-nasa/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/globe-rainfall.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/globe-rainfall.asset index 8ad3926164..712af8bc9f 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/globe-rainfall.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/globe-rainfall.asset @@ -14,7 +14,7 @@ atmosphere. This heating is a major part of Earth's energy budget and climate]] local URL = "https://sos.noaa.gov/catalog/datasets/rainfall-monthly-nasa/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/harvey-clouds_precip.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/harvey-clouds_precip.asset index c41747a256..a5cf15c25c 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/harvey-clouds_precip.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/harvey-clouds_precip.asset @@ -14,7 +14,7 @@ local Description = [[Hurricane Harvey was an extremely destructive Atlantic hur local URL = "https://sos.noaa.gov/catalog/datasets/hurricane-harvey-clouds-with-precipitation-2017/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_season_2017.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_season_2017.asset index c380649be9..abb12828da 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_season_2017.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_season_2017.asset @@ -17,7 +17,7 @@ and calling on volunteers for help]] local URL = "https://sos.noaa.gov/catalog/datasets/hurricane-season-2017/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_season_2017_wvsst.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_season_2017_wvsst.asset index b1aba5e1e8..94c7b73a8b 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_season_2017_wvsst.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_season_2017_wvsst.asset @@ -17,7 +17,7 @@ local Description = [[After a long lull in major hurricanes striking the U.S. local URL = "https://sos.noaa.gov/catalog/datasets/hurricane-season-water-vapor-and-sst-2017/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_tracks-cumulative.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_tracks-cumulative.asset index 0fd6929d3e..26b8ec90e4 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_tracks-cumulative.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/hurricane_tracks-cumulative.asset @@ -12,7 +12,7 @@ been created to predict hurricane paths include the historical data in their mod local URL = "https://sos.noaa.gov/catalog/datasets/hurricane-tracks-cumulative-1950-2005/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/isaac.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/isaac.asset index 19782cbd5a..05d3d2c136 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/isaac.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/isaac.asset @@ -15,7 +15,7 @@ brought significant amounts of rain to the southeastern United States]] local URL = "https://sos.noaa.gov/catalog/datasets/hurricane-isaac-2012/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/iss_track.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/iss_track.asset index 7d7ed3c86c..1885b12d30 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/iss_track.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/iss_track.asset @@ -18,7 +18,7 @@ local Description = [[The first piece of the International Space Station was sen local URL = "https://sos.noaa.gov/catalog/datasets/international-space-station-track/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/land_temp.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/land_temp.asset index a592db0723..b7b37a9708 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/land_temp.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/land_temp.asset @@ -14,7 +14,7 @@ the University of Delaware]] local URL = "https://sos.noaa.gov/catalog/datasets/international-space-station-track/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/lightning.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/lightning.asset index 6528b0afb8..01371824a9 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/lightning.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/lightning.asset @@ -15,7 +15,7 @@ number of lightning flashes per square kilometer]] local URL = "https://sos.noaa.gov/catalog/datasets/lightning-flash-rate/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/ltg_vaisala.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/ltg_vaisala.asset index 9b7feb1d1f..6ded0d0620 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/ltg_vaisala.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/ltg_vaisala.asset @@ -19,7 +19,7 @@ number of events. This dataset runs from June 2011 through August 2012]] local URL = "c" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nasa_sats.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nasa_sats.asset index 43bf62187a..46cf73d447 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nasa_sats.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nasa_sats.asset @@ -17,7 +17,7 @@ of the satellites are currently in orbit, and the sixth satellite is scheduled t launched in 2008]] local URL = "https://sos.noaa.gov/catalog/datasets/polar-orbiting-nasa-a-train-satellites/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-carbon.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-carbon.asset index d059ba1cd8..199a26002f 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-carbon.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-carbon.asset @@ -14,7 +14,7 @@ atmosphere]] local URL = "https://sos.noaa.gov/catalog/datasets/carbon-dioxide-concentration-geos-5-model/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-chem.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-chem.asset index 30ca95c704..0861878015 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-chem.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-chem.asset @@ -14,7 +14,7 @@ and climate]] local URL = "https://sos.noaa.gov/catalog/datasets/atmospheric-chemistry-geos-5-model/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-winds.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-winds.asset index 29759ea97c..e59570d7c1 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-winds.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/nccs_models-winds.asset @@ -14,7 +14,7 @@ around the globe. Red, orange and yellow are used for the fastest moving air]] local URL = "https://sos.noaa.gov/catalog/datasets/winds-geos-5-model/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/no2_omsi.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/no2_omsi.asset index 6cdf0ac2b7..0b089d56d4 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/no2_omsi.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/no2_omsi.asset @@ -15,7 +15,7 @@ local Description = [[Nitrogen dioxide (NO2) is a key component of urban air pol local URL = "https://sos.noaa.gov/catalog/datasets/nitrogen-dioxide/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/noaa_sat-tracks.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/noaa_sat-tracks.asset index d5f3f9e2c9..e4ccbcf3f8 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/noaa_sat-tracks.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/noaa_sat-tracks.asset @@ -19,7 +19,7 @@ other applications]] local URL = "https://sos.noaa.gov/catalog/datasets/polar-orbiting-noaa-satellite-tracks/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/pclim.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/pclim.asset index ad471808da..b10da7f4b6 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/pclim.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/pclim.asset @@ -12,7 +12,7 @@ normal]] local URL = "https://sos.noaa.gov/catalog/datasets/temperature-anomaly-yearly-500-2006-paleoclimate-evidence/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/poes_sat.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/poes_sat.asset index ca3c100c52..72166327b2 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/poes_sat.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/poes_sat.asset @@ -15,7 +15,7 @@ orbit the Earth 14.1 times per day]] local URL = "https://sos.noaa.gov/catalog/datasets/polar-orbiting-noaa-17-satellite-coverage/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-antarctic.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-antarctic.asset index 396092394f..3a31ab9c2c 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-antarctic.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-antarctic.asset @@ -26,7 +26,7 @@ temporal resolution and 2 degree longitude by 2 degree latitude resolution]] local URL = "https://sos.noaa.gov/catalog/datasets/precipitable-water-antarctic-expedition-1902-1903/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-elnino.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-elnino.asset index dd23e40a4f..506e1eed80 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-elnino.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-elnino.asset @@ -26,7 +26,7 @@ temporal resolution and 2 degree longitude by 2 degree latitude resolution]] local URL = "https://sos.noaa.gov/catalog/datasets/precipitable-water-el-nino-1917-1919/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-hurricane.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-hurricane.asset index 8e591c95fe..5f075a0882 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-hurricane.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/reanalysis-hurricane.asset @@ -26,7 +26,7 @@ local Description = [[Until 2010, the longest globally-complete estimate of the local URL = "https://sos.noaa.gov/catalog/datasets/precipitable-water-galveston-hurricane-1900/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/sandy.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/sandy.asset index 2b02f27780..993858da9d 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/sandy.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/sandy.asset @@ -10,7 +10,7 @@ local Description = [[Hurricane Sandy was a memorable and disastrous storm that local URL = "https://sos.noaa.gov/catalog/datasets/precipitable-water-galveston-hurricane-1900/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/sunsync_sat.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/sunsync_sat.asset index 4d0494246b..5642468f42 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/sunsync_sat.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/sunsync_sat.asset @@ -15,7 +15,7 @@ orbit the Earth 14.1 times per day]] local URL = "https://sos.noaa.gov/catalog/datasets/polar-orbiting-noaa-17-and-noaa-18/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/temp_anom.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/temp_anom.asset index 490c0d6d37..7371f9ffca 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/temp_anom.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/temp_anom.asset @@ -18,7 +18,7 @@ warmest]] local URL = "https://sos.noaa.gov/catalog/datasets/temperature-anomaly-yearly-noaa-1880-present/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/tropical_widening.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/tropical_widening.asset index dc9a991756..b06c47520c 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/tropical_widening.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/tropical_widening.asset @@ -9,7 +9,7 @@ shows the changes in the tropical zone boundaries over the last three decades]] local URL = "https://sos.noaa.gov/catalog/datasets/tropical-widening/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/typhoon_haiyan-wvsst.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/typhoon_haiyan-wvsst.asset index 6ffe5657f2..49387eaf9c 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/typhoon_haiyan-wvsst.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/typhoon_haiyan-wvsst.asset @@ -12,7 +12,7 @@ Real-time: SST from October 30th to November 12th, 2013]] local URL = "https://sos.noaa.gov/catalog/datasets/typhoon-haiyan-water-vapor-and-sst-oct-nov-2013/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/typhoon_haiyan.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/typhoon_haiyan.asset index 0f6f98766e..1895f32d98 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/typhoon_haiyan.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/typhoon_haiyan.asset @@ -12,7 +12,7 @@ to 195 mph. If confirmed, it would beat the previous record holder, Hurricane Ca local URL = "https://sos.noaa.gov/catalog/datasets/typhoon-haiyan-oct-nov-2013/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/volcano_ash.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/volcano_ash.asset index 2fef56cbb0..bcb98981e5 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/volcano_ash.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/atmosphere/volcano_ash.asset @@ -18,7 +18,7 @@ engine failures]] local URL = "https://sos.noaa.gov/catalog/datasets/volcanic-ash-eruption-iceland/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/agriculture-cropland.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/agriculture-cropland.asset index 3babd0b6d7..d2dc1af89d 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/agriculture-cropland.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/agriculture-cropland.asset @@ -14,7 +14,7 @@ the area of Africa]] local URL = "https://sos.noaa.gov/catalog/datasets/agriculture-cropland-intensity/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/agriculture-pastureland.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/agriculture-pastureland.asset index 5e0ddef36e..83900b4dab 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/agriculture-pastureland.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/agriculture-pastureland.asset @@ -14,7 +14,7 @@ the area of Africa]] local URL = "https://sos.noaa.gov/catalog/datasets/agriculture-pastureland-intensity/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/birds.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/birds.asset index 14823d0289..8d39b8a6b7 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/birds.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/birds.asset @@ -13,7 +13,7 @@ and National Audubon Society, that allows birdwatchers to enter their observatio local URL = "https://sos.noaa.gov/catalog/datasets/bird-migration-patterns-western-hemisphere/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble.asset index 256ee75fc0..58c755df20 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble.asset @@ -17,7 +17,7 @@ poles using thermal infrared imagery.]] local URL = "https://sos.noaa.gov/catalog/datasets/blue-marble/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble_topo.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble_topo.asset index b18ff1a6f0..8d59f9a4e8 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble_topo.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble_topo.asset @@ -13,7 +13,7 @@ local Description = [[The Blue Marble is an incredibly detailed, true-color depi local URL = "https://sos.noaa.gov/catalog/datasets/blue-marble-with-topography-seasonal/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble_topo_bathy.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble_topo_bathy.asset index 3c12994ae2..99b4c8d412 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble_topo_bathy.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-blue_marble_topo_bathy.asset @@ -13,7 +13,7 @@ local Description = [[The Blue Marble is an incredibly detailed, true-color depi local URL = "https://sos.noaa.gov/catalog/datasets/blue-marble-with-topography-seasonal/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-nightlights.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-nightlights.asset index d9881cd218..37c2d7ef41 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-nightlights.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-nightlights.asset @@ -19,7 +19,7 @@ needed to get a view of the clouds over the poles using thermal infrared imagery local URL = "https://sos.noaa.gov/catalog/datasets/blue-marble-and-nighttime-lights/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-seasonal_blue_marble.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-seasonal_blue_marble.asset index 1ed2f90abc..e5984b1c27 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-seasonal_blue_marble.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/blue_marble-seasonal_blue_marble.asset @@ -14,7 +14,7 @@ on any given day clouds are blocking a significant portion of the surface]] local URL = "https://sos.noaa.gov/catalog/datasets/blue-marble-seasonal/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-global.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-global.asset index 7dadc485b7..b4175be9ed 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-global.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-global.asset @@ -12,7 +12,7 @@ the world's hydrological cycle]] local URL = "https://sos.noaa.gov/catalog/datasets/dams-and-reservoirs-1800-2010/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-mississippi.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-mississippi.asset index 02c0b651ef..4f56658289 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-mississippi.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-mississippi.asset @@ -12,7 +12,7 @@ where data were available]] local URL = "https://sos.noaa.gov/catalog/datasets/dams-and-reservoirs-mississippi-river-1800-2010/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-yangtze.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-yangtze.asset index 9e1b70a16b..83574adc63 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-yangtze.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/dams-yangtze.asset @@ -12,7 +12,7 @@ the world's hydrological cycle]] local URL = "https://sos.noaa.gov/catalog/datasets/dams-and-reservoirs-yangtze-1800-2010/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-06z_only.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-06z_only.asset index 7dff94800c..530348ea91 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-06z_only.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-06z_only.asset @@ -14,7 +14,7 @@ greater area than the land covered by darkness]] local URL = "https://sos.noaa.gov/catalog/datasets/daynight-terminator-daily/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-full_year.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-full_year.asset index f6c7b80fa5..8fe830bb97 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-full_year.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-full_year.asset @@ -14,7 +14,7 @@ greater area than the land covered by darkness]] local URL = "https://sos.noaa.gov/catalog/datasets/daynight-terminator-hourly/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-oneday.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-oneday.asset index 8e5a5136fc..df43c5ec61 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-oneday.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/day_night-oneday.asset @@ -14,7 +14,7 @@ greater area than the land covered by darkness]] local URL = "https://sos.noaa.gov/catalog/datasets/daynight-terminator-single-day/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-1992_2002.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-1992_2002.asset index bbbedd7abd..003584eabf 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-1992_2002.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-1992_2002.asset @@ -13,7 +13,7 @@ local Description = [[The data was recorded by the Defense Meteorological Satell local URL = "https://sos.noaa.gov/catalog/datasets/nighttime-lights-comparison-1992-and-2002/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-1992_2008.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-1992_2008.asset index a3685b893b..336b374623 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-1992_2008.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-1992_2008.asset @@ -13,7 +13,7 @@ infrared radiance at night]] local URL = "https://sos.noaa.gov/catalog/datasets/nighttime-lights-comparison-1992-2000-and-2008/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-1992_2009.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-1992_2009.asset index 79847962d9..d5fbd4c977 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-1992_2009.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-1992_2009.asset @@ -13,7 +13,7 @@ radiance at night]] local URL = "https://sos.noaa.gov/catalog/datasets/nighttime-lights-comparison-1992-and-2009/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-2012.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-2012.asset index f272717e0e..82a44ade54 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-2012.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-2012.asset @@ -11,7 +11,7 @@ the Department of Defense]] local URL = "https://sos.noaa.gov/catalog/datasets/nighttime-lights-2012/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-color_nightlights.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-color_nightlights.asset index e246a6f54c..4b092c15ec 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-color_nightlights.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-color_nightlights.asset @@ -16,7 +16,7 @@ Meteorological Satellite Program (DMSP) data spanning October 1994 - March 1995] local URL = "https://sos.noaa.gov/catalog/datasets/nighttime-lights-colorized/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-nightlights.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-nightlights.asset index 7b3dfcd372..dec6df226a 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-nightlights.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earth_night-nightlights.asset @@ -16,7 +16,7 @@ Meteorological Satellite Program (DMSP) data spanning October 1994 - March 1995] local URL = "https://sos.noaa.gov/catalog/datasets/nighttime-lights/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquake-1980_1995_quakes.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquake-1980_1995_quakes.asset index 4414257e03..3eb6fb3f2f 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquake-1980_1995_quakes.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquake-1980_1995_quakes.asset @@ -21,7 +21,7 @@ some shaking of indoor items and significant damage unlikely]] local URL = "https://sos.noaa.gov/catalog/datasets/earthquakes-cumulative-1980-1995/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquake-2001_2015.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquake-2001_2015.asset index 01df0c1d2c..5feb93ace6 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquake-2001_2015.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquake-2001_2015.asset @@ -18,7 +18,7 @@ when they are shallow within the earth (less than 100 km or 60 mi. deep)]] local URL = "https://sos.noaa.gov/catalog/datasets/earthquakes-2001-2015/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquakes_1901_2000.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquakes_1901_2000.asset index ae3ec7f342..be3f75493d 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquakes_1901_2000.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquakes_1901_2000.asset @@ -19,7 +19,7 @@ the plate boundary faults responsible for the majority of all of these earthquak local URL = "https://sos.noaa.gov/catalog/datasets/earthquakes-of-the-20th-century/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquakes_and_eruptions.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquakes_and_eruptions.asset index 8341231db6..b16a81bb6b 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquakes_and_eruptions.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earthquakes_and_eruptions.asset @@ -14,7 +14,7 @@ dots]] local URL = "https://sos.noaa.gov/catalog/datasets/earthquakes-and-eruptions-1960-2010/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earths_magnetism_magnetic_lines.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earths_magnetism_magnetic_lines.asset index c844a389e5..7200450a55 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earths_magnetism_magnetic_lines.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earths_magnetism_magnetic_lines.asset @@ -19,7 +19,7 @@ Earth, between the red and blue lines, is the magnetic equator shaded yellow]] local URL = "https://sos.noaa.gov/catalog/datasets/earths-magnetic-lines/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earths_magnetism_magnets.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earths_magnetism_magnets.asset index 359e6060ca..3a29cb1ed8 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earths_magnetism_magnets.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/earths_magnetism_magnets.asset @@ -19,7 +19,7 @@ Earth, between the red and blue lines, is the magnetic equator shaded yellow]] local URL = "https://sos.noaa.gov/catalog/datasets/earths-magnetic-field-compass-needles/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo1.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo1.asset index e8368c6c65..4c888bcca8 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo1.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo1.asset @@ -16,7 +16,7 @@ modeling and Earth visualization]] local URL = "https://sos.noaa.gov/catalog/datasets/etopo1-topography-and-bathymetry/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-earth_bright.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-earth_bright.asset index cb63930d27..9dfc2e090e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-earth_bright.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-earth_bright.asset @@ -14,7 +14,7 @@ uses green, yellow, orange, red and white to denote increasing elevation of the local URL = "https://sos.noaa.gov/catalog/datasets/etopo2-topography-and-bathymetry-bright-colors/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-earth_color.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-earth_color.asset index a225878d88..82cb62fbf4 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-earth_color.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-earth_color.asset @@ -14,7 +14,7 @@ green, yellow, orange, red and white to denote increasing elevation of the land] local URL = "https://sos.noaa.gov/catalog/datasets/etopo2-topography-and-bathymetry-color-enhanced/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-earth_shaded.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-earth_shaded.asset index 70decb20cd..5676c1f385 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-earth_shaded.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-earth_shaded.asset @@ -14,7 +14,7 @@ model]] local URL = "https://sos.noaa.gov/catalog/datasets/etopo2-topography-and-bathymetry-shaded-colors/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-earth_topo.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-earth_topo.asset index cc6f7a54ed..ce1530cc6f 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-earth_topo.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-earth_topo.asset @@ -17,7 +17,7 @@ use green, yellow, orange, red and white to denote increasing elevation of the l local URL = "https://sos.noaa.gov/catalog/datasets/etopo2-topography-and-bathymetry-natural-colors/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-landsat.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-landsat.asset index 4b461e3cbf..78a8f15a7f 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-landsat.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/etopo2-landsat.asset @@ -13,7 +13,7 @@ from the GLOBE project which has a global digital elevation model]] local URL = "https://sos.noaa.gov/catalog/datasets/etopo2-bathymetry/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/fire.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/fire.asset index 0e5c6596a3..d0ff98dec5 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/fire.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/fire.asset @@ -17,7 +17,7 @@ and their short- and long-term effects on ecosystems]] local URL = "https://sos.noaa.gov/catalog/datasets/fires-2009/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/fire_veg.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/fire_veg.asset index 33606bda10..f7a85b0659 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/fire_veg.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/fire_veg.asset @@ -16,7 +16,7 @@ local Description = [[This dataset leads viewers on a narrated global tour of fi local URL = "https://sos.noaa.gov/catalog/datasets/fire-observations-and-vegetation-2002-2011/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/flooding-displaced_250.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/flooding-displaced_250.asset index fc38b5ac1e..04666ec168 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/flooding-displaced_250.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/flooding-displaced_250.asset @@ -17,7 +17,7 @@ vulnerable to the effects of flooding]] local URL = "https://sos.noaa.gov/catalog/datasets/flood-events-displaced-250-or-more-people-2000-2009/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/flooding-fatal.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/flooding-fatal.asset index 8b053ac833..f41a83c311 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/flooding-fatal.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/flooding-fatal.asset @@ -17,7 +17,7 @@ vulnerable to the effects of flooding]] local URL = "https://sos.noaa.gov/catalog/datasets/flood-events-50-or-more-fatalities-2000-2009/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/flooding-heavy_rain.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/flooding-heavy_rain.asset index ccda40b529..58c8536244 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/flooding-heavy_rain.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/flooding-heavy_rain.asset @@ -17,7 +17,7 @@ vulnerable to the effects of flooding]] local URL = "https://sos.noaa.gov/catalog/datasets/flood-events-due-to-heavy-rain-2000-2009/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/flooding-major_floods.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/flooding-major_floods.asset index 414a7a44e5..5b24cf1dc2 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/flooding-major_floods.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/flooding-major_floods.asset @@ -17,7 +17,7 @@ vulnerable to the effects of flooding]] local URL = "https://sos.noaa.gov/catalog/datasets/flood-events-2000-2009/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/food_v_feed.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/food_v_feed.asset index 8ce2ecc1e9..410c898ef2 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/food_v_feed.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/food_v_feed.asset @@ -12,7 +12,7 @@ where most of the crops are used as animal feed (in red)]] local URL = "https://sos.noaa.gov/catalog/datasets/agriculture-food-vs-feed/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/forests.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/forests.asset index 6eec50dfa2..682e404b0e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/forests.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/forests.asset @@ -13,7 +13,7 @@ replanting after loss has occurred]] local URL = "https://sos.noaa.gov/catalog/datasets/forest-change-extent-gain-and-loss-2000-2014/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/geomag_tracklines.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/geomag_tracklines.asset index 631bbd5ead..d9fb82ea75 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/geomag_tracklines.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/geomag_tracklines.asset @@ -13,7 +13,7 @@ created in the liquid iron-nickel core]] local URL = "https://sos.noaa.gov/catalog/datasets/geomagnetic-tracklines/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/global_vegetation.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/global_vegetation.asset index e690559e05..93c92af7a6 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/global_vegetation.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/global_vegetation.asset @@ -13,7 +13,7 @@ data from the satellite, developed by scientists at NOAA]] local URL = "https://sos.noaa.gov/catalog/datasets/vegetation-seasonal-changes-apr-2012-apr-2013/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/gray_earth.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/gray_earth.asset index 0197017490..334b16fcd0 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/gray_earth.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/gray_earth.asset @@ -24,7 +24,7 @@ equalized hypsography that forms the foundation of the Gray Earth imagery]] local URL = "https://sos.noaa.gov/catalog/datasets/gray-earth/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/hot_topo.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/hot_topo.asset index 1722b454f5..74f0e33e84 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/hot_topo.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/hot_topo.asset @@ -20,7 +20,7 @@ Everest, the tallest point on earth at a height of 29,035 feet, almost 5.5 miles local URL = "https://sos.noaa.gov/catalog/datasets/topography-and-bathymetry-with-nighttime-lights/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/irsat_nightlights.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/irsat_nightlights.asset index 75adb14afb..fd2d9bc973 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/irsat_nightlights.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/irsat_nightlights.asset @@ -14,7 +14,7 @@ greater area than the land covered by darkness]] local URL = "https://sos.noaa.gov/catalog/datasets/daynight-terminator-with-clouds/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/japan_quake.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/japan_quake.asset index c10f56cd42..0cbb716b0e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/japan_quake.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/japan_quake.asset @@ -14,7 +14,7 @@ waves]] local URL = "https://sos.noaa.gov/catalog/datasets/japan-earthquake-march-2011/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/koppen_climate-koppen_1901_2100.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/koppen_climate-koppen_1901_2100.asset index d27f83c2aa..3f6c43a626 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/koppen_climate-koppen_1901_2100.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/koppen_climate-koppen_1901_2100.asset @@ -14,7 +14,7 @@ climatologist Rudolf Geiger]] local URL = "https://sos.noaa.gov/catalog/datasets/koppen-geiger-climate-changes-1901-2100/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/koppen_climate-koppen_2007.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/koppen_climate-koppen_2007.asset index b9c6112dd2..5a48702002 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/koppen_climate-koppen_2007.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/koppen_climate-koppen_2007.asset @@ -14,7 +14,7 @@ climatologist Rudolf Geiger.This particular revision is from 2007]] local URL = "https://sos.noaa.gov/catalog/datasets/koppen-geiger-climate-classification-2007/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_cover-animation.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_cover-animation.asset index d09fc82a7c..74312c68ec 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_cover-animation.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_cover-animation.asset @@ -19,7 +19,7 @@ Earth]] local URL = "https://sos.noaa.gov/catalog/datasets/land-cover-animation/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_cover-ribbon.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_cover-ribbon.asset index 15514b56fd..4daf011126 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_cover-ribbon.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_cover-ribbon.asset @@ -19,7 +19,7 @@ Earth]] local URL = "https://sos.noaa.gov/catalog/datasets/land-cover-map-with-ribbon-of-labels/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_cover-slideshow.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_cover-slideshow.asset index 21ba1b8650..64f938d1ef 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_cover-slideshow.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_cover-slideshow.asset @@ -19,7 +19,7 @@ Earth]] local URL = "https://sos.noaa.gov/catalog/datasets/land-cover-map-with-slideshow-of-labels/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_production-cropland_current.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_production-cropland_current.asset index 9062e2ef0c..139b6eda91 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_production-cropland_current.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_production-cropland_current.asset @@ -14,7 +14,7 @@ indicate higher yields]] local URL = "https://sos.noaa.gov/catalog/datasets/agriculture-cropland-yield-current/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_production-cropland_potential.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_production-cropland_potential.asset index fa2184dbbd..cf1b64cd85 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_production-cropland_potential.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_production-cropland_potential.asset @@ -13,7 +13,7 @@ yields, while bright pink areas indicate higher yields]] local URL = "https://sos.noaa.gov/catalog/datasets/agriculture-cropland-yield-potential/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_production-production_gap.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_production-production_gap.asset index 2362a1ac18..d0eedf650c 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_production-production_gap.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_production-production_gap.asset @@ -13,7 +13,7 @@ local Description = [[A major component of the 2 Billion More Coming to Dinner f local URL = "https://sos.noaa.gov/catalog/datasets/agriculture-cropland-yield-potential/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_ratio.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_ratio.asset index 8f245c37e8..86025ca6f9 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_ratio.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/land_ratio.asset @@ -9,7 +9,7 @@ that shows the ratio of land and sea at different latitudes]] local URL = "https://sos.noaa.gov/catalog/datasets/land-to-sea-ratio/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/latitude_longitude.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/latitude_longitude.asset index bb3c44399a..7f02d6b4de 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/latitude_longitude.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/latitude_longitude.asset @@ -10,7 +10,7 @@ introduction of map reading and exploration]] local URL = "https://sos.noaa.gov/catalog/datasets/latitude-longitude-layers/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/magnetic_declination.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/magnetic_declination.asset index 39ee251726..aa6016c541 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/magnetic_declination.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/magnetic_declination.asset @@ -13,7 +13,7 @@ created in the liquid iron-nickel core]] local URL = "https://sos.noaa.gov/catalog/datasets/earths-magnetic-declination/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/nightsky.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/nightsky.asset index e79777a478..bad37b4666 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/nightsky.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/nightsky.asset @@ -10,7 +10,7 @@ constellations in the night sky]] local URL = "https://sos.noaa.gov/catalog/datasets/light-pollution-artificial-sky-brightness/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/nuclear_earthquake.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/nuclear_earthquake.asset index 86f8b078f3..b6cb618048 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/nuclear_earthquake.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/nuclear_earthquake.asset @@ -19,7 +19,7 @@ prediction continues to be inaccurate and imprecise]] local URL = "https://sos.noaa.gov/catalog/datasets/earthquakes-and-nuclear-power-plants/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/paleo_map.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/paleo_map.asset index c510b97081..1ded519273 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/paleo_map.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/paleo_map.asset @@ -18,7 +18,7 @@ local Description = [[The PALEOMAP PaleoAtlas for GPlates consists of 91 paleoge local URL = "https://sos.noaa.gov/catalog/datasets/paleomap-paleoatlas-0-750-million-years-ago/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/paleo_overlays.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/paleo_overlays.asset index 3cbffba2f3..e3bc89c716 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/paleo_overlays.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/paleo_overlays.asset @@ -18,7 +18,7 @@ mineral-rich water from the roof of the cave]] local URL = "https://sos.noaa.gov/catalog/datasets/paleoclimate-proxies/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/pantropical_biomass.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/pantropical_biomass.asset index 1f950ba22e..04ac41cd55 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/pantropical_biomass.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/pantropical_biomass.asset @@ -12,7 +12,7 @@ accurate baseline for evaluating and monitoring future changes]] local URL = "https://sos.noaa.gov/catalog/datasets/land-cover-woody-biomass-in-pan-tropics/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/plate_movement.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/plate_movement.asset index 6444d42a3e..de764789fc 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/plate_movement.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/plate_movement.asset @@ -21,7 +21,7 @@ motion of the oceanic plates]] local URL = "https://sos.noaa.gov/catalog/datasets/plate-movement-200-million-years-ago-to-today/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/river_discharge_2010.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/river_discharge_2010.asset index 46b10fdd5a..c9ec00865d 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/river_discharge_2010.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/river_discharge_2010.asset @@ -12,7 +12,7 @@ cells]] local URL = "https://sos.noaa.gov/catalog/datasets/rivers-daily-discharge-2010/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/sea_floor_age-iso_lines_yellow.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/sea_floor_age-iso_lines_yellow.asset index 226a21c2fa..7fd63a675c 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/sea_floor_age-iso_lines_yellow.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/sea_floor_age-iso_lines_yellow.asset @@ -18,7 +18,7 @@ not uniform causing linear features perpendicular to the divergent boundaries]] local URL = "https://sos.noaa.gov/catalog/datasets/age-of-the-seafloor-contour-lines/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/sea_floor_age-shaded_veg.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/sea_floor_age-shaded_veg.asset index 3fad571144..187eb0090e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/sea_floor_age-shaded_veg.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/sea_floor_age-shaded_veg.asset @@ -18,7 +18,7 @@ not uniform causing linear features perpendicular to the divergent boundaries]] local URL = "https://sos.noaa.gov/catalog/datasets/age-of-the-seafloor-vegetation/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/sea_floor_age-topo.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/sea_floor_age-topo.asset index c02691c137..29862244b3 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/sea_floor_age-topo.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/sea_floor_age-topo.asset @@ -18,7 +18,7 @@ not uniform causing linear features perpendicular to the divergent boundaries]] local URL = "https://sos.noaa.gov/catalog/datasets/age-of-the-seafloor-topography/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/seismic_waves-1994northridge.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/seismic_waves-1994northridge.asset index c580a32d93..200484ba65 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/seismic_waves-1994northridge.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/seismic_waves-1994northridge.asset @@ -15,7 +15,7 @@ displaced from their homes by the effects of the quake]] local URL = "https://sos.noaa.gov/catalog/datasets/seismic-waves-northridge-earthquake-1994/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-amphibians.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-amphibians.asset index 74da04e0be..4bc5d9c98e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-amphibians.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-amphibians.asset @@ -15,7 +15,7 @@ ensure that the places with the most vulnerable species are being protected]] local URL = "https://sos.noaa.gov/catalog/datasets/species-richness-amphibians/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-amphibians_threatened.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-amphibians_threatened.asset index 01e9e088c4..a9384cfc87 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-amphibians_threatened.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-amphibians_threatened.asset @@ -15,7 +15,7 @@ ensure that the places with the most vulnerable species are being protected]] local URL = "https://sos.noaa.gov/catalog/datasets/species-richness-amphibians-threatened/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-birds.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-birds.asset index b9a31f6778..63c58241be 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-birds.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-birds.asset @@ -15,7 +15,7 @@ ensure that the places with the most vulnerable species are being protected]] local URL = "https://sos.noaa.gov/catalog/datasets/species-richness-birds/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-birds_threatened.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-birds_threatened.asset index cfd93d573f..7d74457996 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-birds_threatened.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-birds_threatened.asset @@ -15,7 +15,7 @@ ensure that the places with the most vulnerable species are being protected]] local URL = "https://sos.noaa.gov/catalog/datasets/species-richness-birds-threatened/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-mammals.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-mammals.asset index 0bd4cd9d68..898368e9b4 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-mammals.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-mammals.asset @@ -15,7 +15,7 @@ ensure that the places with the most vulnerable species are being protected]] local URL = "https://sos.noaa.gov/catalog/datasets/species-richness-mammals/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-mammals_threatened.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-mammals_threatened.asset index 2b76fb9369..26aaeb3d3e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-mammals_threatened.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/species_richness-mammals_threatened.asset @@ -15,7 +15,7 @@ ensure that the places with the most vulnerable species are being protected]] local URL = "https://sos.noaa.gov/catalog/datasets/species-richness-mammals-threatened/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/surface_temperature.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/surface_temperature.asset index 66a3736839..03246628cb 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/surface_temperature.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/surface_temperature.asset @@ -15,7 +15,7 @@ area in the northern hemisphere, is also evident]] local URL = "https://sos.noaa.gov/catalog/datasets/surface-temperature/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/top_quakes.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/top_quakes.asset index 0f2fdc7dfb..1923dfe436 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/top_quakes.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/top_quakes.asset @@ -21,7 +21,7 @@ motion]] local URL = "https://sos.noaa.gov/catalog/datasets/earthquakes-historical-top-10-through-2011/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/volcanoes-eruptions.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/volcanoes-eruptions.asset index 70619dbd43..fc9b6dbb89 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/volcanoes-eruptions.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/volcanoes-eruptions.asset @@ -19,7 +19,7 @@ rising to the surface. The volcanoes on Hawaii are the result of hotspots]] local URL = "https://sos.noaa.gov/catalog/datasets/volcano-eruptions-through-2010/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/volcanoes-global_volcanoes.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/volcanoes-global_volcanoes.asset index 7a5c88dabf..bd1d17724e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/volcanoes-global_volcanoes.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/volcanoes-global_volcanoes.asset @@ -19,7 +19,7 @@ rising to the surface. The volcanoes on Hawaii are the result of hotspots]] local URL = "https://sos.noaa.gov/catalog/datasets/volcano-locations/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/volcanoes-tsunami.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/volcanoes-tsunami.asset index d253562d82..cd92fa7082 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/volcanoes-tsunami.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/land/volcanoes-tsunami.asset @@ -19,7 +19,7 @@ rising to the surface. The volcanoes on Hawaii are the result of hotspots]] local URL = "https://sos.noaa.gov/catalog/datasets/volcano-eruptions-causing-tsunamis-through-2010/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/bm10000.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/bm10000.asset index e7e97f9b28..f1500048de 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/bm10000.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/bm10000.asset @@ -37,7 +37,7 @@ coasts]] local URL = "https://sos.noaa.gov/catalog/datasets/blue-marble-sea-level-ice-and-vegetation-changes-19000bc-10000ad/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/gfdl_seaice.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/gfdl_seaice.asset index 48d53c5b82..a4522509af 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/gfdl_seaice.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/gfdl_seaice.asset @@ -20,7 +20,7 @@ temperatures]] local URL = "https://sos.noaa.gov/catalog/datasets/climate-model-sea-ice-change-gfdl-a1b-1861-2100/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-ccsm-a1b.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-ccsm-a1b.asset index 848febb8f9..fd2cf07bfa 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-ccsm-a1b.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-ccsm-a1b.asset @@ -17,7 +17,7 @@ formatted for Science On a Sphere]] local URL = "https://sos.noaa.gov/catalog/datasets/climate-model-temperature-change-ccsm-a1b-1870-2100/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-ccsm-b1.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-ccsm-b1.asset index 2e1a4f97b0..414ca53bbd 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-ccsm-b1.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-ccsm-b1.asset @@ -17,7 +17,7 @@ formatted for Science On a Sphere]] local URL = "https://sos.noaa.gov/catalog/datasets/climate-model-temperature-change-ccsm-b1-1870-2100/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-compare.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-compare.asset index de2207e70f..7b9ecc5cbb 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-compare.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-compare.asset @@ -17,7 +17,7 @@ formatted for Science On a Sphere]] local URL = "https://sos.noaa.gov/catalog/datasets/climate-model-temperature-change-comparison-gfdl-a1b-and-b1/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-gfdl-a1b.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-gfdl-a1b.asset index 77775a04bc..c8e2503572 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-gfdl-a1b.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-gfdl-a1b.asset @@ -17,7 +17,7 @@ formatted for Science On a Sphere]] local URL = "https://sos.noaa.gov/catalog/datasets/climate-model-temperature-change-gfdl-a1b-1870-2100/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-gfdl-b1.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-gfdl-b1.asset index 3363e76a50..53cf3c1058 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-gfdl-b1.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-gfdl-b1.asset @@ -17,7 +17,7 @@ formatted for Science On a Sphere]] local URL = "https://sos.noaa.gov/catalog/datasets/climate-model-temperature-change-gfdl-b1-1870-2100/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-had-a1b.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-had-a1b.asset index 0969862c73..84735005b0 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-had-a1b.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-had-a1b.asset @@ -17,7 +17,7 @@ formatted for Science On a Sphere]] local URL = "https://sos.noaa.gov/catalog/datasets/climate-model-temperature-change-hadley-a1b-1870-2100/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-had-b1.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-had-b1.asset index 77b3a7b8ca..37e4f72ff1 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-had-b1.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ipcc_temp-had-b1.asset @@ -17,7 +17,7 @@ formatted for Science On a Sphere]] local URL = "https://sos.noaa.gov/catalog/datasets/climate-model-temperature-change-hadley-b1-1870-2100/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga26.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga26.asset index 13902c9a57..90b1469ba8 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga26.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga26.asset @@ -9,7 +9,7 @@ of dynamics of the weather and climate system to projections of future climate]] local URL = "https://sos.noaa.gov/catalog/datasets/climate-model-temperature-change-rcp-26-2006-2100/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga45.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga45.asset index 3f9ac61d06..eecde1e968 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga45.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga45.asset @@ -9,7 +9,7 @@ of dynamics of the weather and climate system to projections of future climate]] local URL = "https://sos.noaa.gov/catalog/datasets/climate-model-temperature-change-rcp-45-2006-2100/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga60.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga60.asset index a25f860df7..f3d5a28fc4 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga60.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga60.asset @@ -9,7 +9,7 @@ of dynamics of the weather and climate system to projections of future climate]] local URL = "https://sos.noaa.gov/catalog/datasets/climate-model-temperature-change-rcp-60-2006-2100/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga85.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga85.asset index fdbf42c66b..6fb81cd80b 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga85.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/rcp-ga85.asset @@ -9,7 +9,7 @@ of dynamics of the weather and climate system to projections of future climate]] local URL = "https://sos.noaa.gov/catalog/datasets/climate-model-temperature-change-rcp-85-2006-2100/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ukmet-a1b.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ukmet-a1b.asset index 8384c9f5bd..ab5213b79d 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ukmet-a1b.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ukmet-a1b.asset @@ -19,7 +19,7 @@ local Description = [[Scientists use computer climate models as a way to underst local URL = "https://sos.noaa.gov/catalog/datasets/climate-model-temperature-change-hadley-a1b-1860-2099/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ukmet-e1.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ukmet-e1.asset index 593d54ba07..5c28fbbce1 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ukmet-e1.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/models/ukmet-e1.asset @@ -18,7 +18,7 @@ and then drops to 421ppm by 2099, with a global mean temperature increase of 2.1 local URL = "https://sos.noaa.gov/catalog/datasets/climate-model-temperature-change-hadley-e1-1860-2099/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/2009_ice_animation.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/2009_ice_animation.asset index 8c19cd9782..ad3a0b706c 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/2009_ice_animation.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/2009_ice_animation.asset @@ -18,7 +18,7 @@ Microwave/Imager. The resolution is 2 km]] local URL = "https://sos.noaa.gov/catalog/datasets/sea-ice-animation-2009/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/6m_sea_level_rise-black.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/6m_sea_level_rise-black.asset index c3515c1222..4327700b34 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/6m_sea_level_rise-black.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/6m_sea_level_rise-black.asset @@ -21,7 +21,7 @@ inches for low emission scenarios and 10 - 23 inches for high emission scenarios local URL = "https://sos.noaa.gov/catalog/datasets/sea-level-rise-impact-of-6-meter-black/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/6m_sea_level_rise-red.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/6m_sea_level_rise-red.asset index 26dc7c7ab6..aca7f7aed0 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/6m_sea_level_rise-red.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/6m_sea_level_rise-red.asset @@ -21,7 +21,7 @@ Report predicts that total global-average sea level rise from 1990 - 2100 will b local URL = "https://sos.noaa.gov/catalog/datasets/sea-level-rise-impact-of-6-meter-red/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/animal_tracking.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/animal_tracking.asset index 187f6e42d7..a279e0bce7 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/animal_tracking.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/animal_tracking.asset @@ -15,7 +15,7 @@ local Description = [["TOPP, Tagging of the Pacific Predators, began in 2000 as local URL = "https://sos.noaa.gov/catalog/datasets/seal-and-seabird-tracks-pacific-ocean/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/argo_buoy_tracks.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/argo_buoy_tracks.asset index 1e18740f11..80c657cacc 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/argo_buoy_tracks.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/argo_buoy_tracks.asset @@ -17,7 +17,7 @@ climate]] local URL = "https://sos.noaa.gov/catalog/datasets/float-tracks-argo-buoy-surface-animation/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/argo_buoy_waterfall.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/argo_buoy_waterfall.asset index 81e673f004..ef27752c47 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/argo_buoy_waterfall.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/argo_buoy_waterfall.asset @@ -17,7 +17,7 @@ climate]] local URL = "https://sos.noaa.gov/catalog/datasets/float-tracks-argo-buoy-depths-animation/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/atl_turtle.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/atl_turtle.asset index c2c5499355..604610e609 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/atl_turtle.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/atl_turtle.asset @@ -17,7 +17,7 @@ was outfitted with a satellite tag by Kate Mansfield, then a Ph.D. student at th local URL = "https://sos.noaa.gov/catalog/datasets/sea-turtle-track-atlantic-ocean/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/buoy_locations.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/buoy_locations.asset index c171f02641..c1406f0f01 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/buoy_locations.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/buoy_locations.asset @@ -14,7 +14,7 @@ can be seen on this visualization]] local URL = "https://sos.noaa.gov/catalog/datasets/buoy-and-float-locations/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/catch_model.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/catch_model.asset index d7e49d2d31..ab15fba4d1 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/catch_model.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/catch_model.asset @@ -18,7 +18,7 @@ catch in these areas]] local URL = "https://sos.noaa.gov/catalog/datasets/fisheries-catch-model-2005-vs-2050/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/chlorophyll_model.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/chlorophyll_model.asset index fea17dc984..6080951b6c 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/chlorophyll_model.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/chlorophyll_model.asset @@ -17,7 +17,7 @@ understand the possible effects on life in the ocean and the global carbon cycle local URL = "https://sos.noaa.gov/catalog/datasets/biosphere-marine-chlorophyll-concentration-model/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/currents.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/currents.asset index 52a5a4c998..f20aaeba3e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/currents.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/currents.asset @@ -21,7 +21,7 @@ to move through the whole conveyor belt]] local URL = "https://sos.noaa.gov/catalog/datasets/ocean-circulation-labeled-currents/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/dart_buoy.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/dart_buoy.asset index c69391da60..ea86ca24c0 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/dart_buoy.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/dart_buoy.asset @@ -16,7 +16,7 @@ DART Project will consist of 32 DART buoys]] local URL = "https://sos.noaa.gov/catalog/datasets/buoy-locations-dart-only/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ecco2_sst-gray_land.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ecco2_sst-gray_land.asset index 9beda39568..77f9c7d36e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ecco2_sst-gray_land.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ecco2_sst-gray_land.asset @@ -19,7 +19,7 @@ surface temperatures. The sea surface temperature data is also from the ECCO2 mo local URL = "https://sos.noaa.gov/catalog/datasets/sea-surface-currents-and-temperature-gray-land/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ecco2_sst-veg_land.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ecco2_sst-veg_land.asset index c07834ffd6..9d1020ab5e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ecco2_sst-veg_land.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ecco2_sst-veg_land.asset @@ -19,7 +19,7 @@ surface temperatures. The sea surface temperature data is also from the ECCO2 mo local URL = "https://sos.noaa.gov/catalog/datasets/sea-surface-currents-and-temperature-vegetation-on-land/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/elnino.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/elnino.asset index b8afbc6621..7734c78160 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/elnino.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/elnino.asset @@ -16,7 +16,7 @@ lasts for about 18 months]] local URL = "https://sos.noaa.gov/catalog/datasets/el-nino-and-la-nina-seasonal-impacts/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/gfdl_sst-black_background.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/gfdl_sst-black_background.asset index 866a3fb9e0..6007fb6e1e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/gfdl_sst-black_background.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/gfdl_sst-black_background.asset @@ -13,7 +13,7 @@ Dynamics Laboratory (GFDL)]] local URL = "https://sos.noaa.gov/catalog/datasets/sea-surface-temperature-noaa-model-black-land/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/gfdl_sst-land_background.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/gfdl_sst-land_background.asset index ff77be0d3d..a2c534a529 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/gfdl_sst-land_background.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/gfdl_sst-land_background.asset @@ -13,7 +13,7 @@ Dynamics Laboratory (GFDL)]] local URL = "https://sos.noaa.gov/catalog/datasets/sea-surface-temperature-noaa-model-with-vegetation/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/greenland_melt.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/greenland_melt.asset index 95d515789b..67f471a1d0 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/greenland_melt.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/greenland_melt.asset @@ -17,7 +17,7 @@ average over the past 18 years that have been studied]] local URL = "https://sos.noaa.gov/catalog/datasets/greenland-melting-trends/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/japan_tsunami.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/japan_tsunami.asset index 36a78b06a8..0c7c8615ec 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/japan_tsunami.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/japan_tsunami.asset @@ -14,7 +14,7 @@ waves]] local URL = "https://sos.noaa.gov/catalog/datasets/japan-tsunami-wave-heights-march-11-2011/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/japan_tsunami_waves.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/japan_tsunami_waves.asset index 910dbd1868..e27ec10675 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/japan_tsunami_waves.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/japan_tsunami_waves.asset @@ -20,7 +20,7 @@ the DART buoys]] local URL = "https://sos.noaa.gov/catalog/datasets/japan-tsunami-wave-propagation-march-11-2011/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/loggerheadseaturtletracks.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/loggerheadseaturtletracks.asset index daef08d4c6..2a81d52f9e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/loggerheadseaturtletracks.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/loggerheadseaturtletracks.asset @@ -17,7 +17,7 @@ proportional to the turtle length]] local URL = "https://sos.noaa.gov/catalog/datasets/loggerhead-sea-turtle-tracks/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/marine_impacts.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/marine_impacts.asset index 25fd80c9a3..19e7fde4fd 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/marine_impacts.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/marine_impacts.asset @@ -17,7 +17,7 @@ acidification]] local URL = "https://sos.noaa.gov/catalog/datasets/human-influences-on-marine-ecosystems/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/marine_life_tracking.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/marine_life_tracking.asset index 7c3943e563..e1e727e216 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/marine_life_tracking.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/marine_life_tracking.asset @@ -14,7 +14,7 @@ animal tracking dataset. For a more extensive dataset using data from TOPP, go h local URL = "https://sos.noaa.gov/catalog/datasets/marine-life-tracks-pacific-ocean/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/mexico_turtles_947293.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/mexico_turtles_947293.asset index 40b6035177..393bcc47da 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/mexico_turtles_947293.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/mexico_turtles_947293.asset @@ -16,7 +16,7 @@ capture site]] local URL = "https://sos.noaa.gov/catalog/datasets/sea-turtle-track-gulf-of-mexico-94-7293/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/mexico_turtles_958002.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/mexico_turtles_958002.asset index edf064cf59..93fc0bc868 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/mexico_turtles_958002.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/mexico_turtles_958002.asset @@ -16,7 +16,7 @@ released within 2 days at the capture site]] local URL = "https://sos.noaa.gov/catalog/datasets/sea-turtle-track-gulf-of-mexico-94-8002/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/modis_sst.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/modis_sst.asset index caba554a45..500cda2ca1 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/modis_sst.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/modis_sst.asset @@ -15,7 +15,7 @@ months]] local URL = "https://sos.noaa.gov/catalog/datasets/sea-surface-temperature-observations-2002-2006/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/nasa_speed.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/nasa_speed.asset index ddb23c4a85..e22a3b1774 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/nasa_speed.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/nasa_speed.asset @@ -15,7 +15,7 @@ green areas are moving faster than the blue areas]] local URL = "https://sos.noaa.gov/catalog/datasets/sea-surface-currents/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/nasa_sst.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/nasa_sst.asset index 813324aa22..f550750ea7 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/nasa_sst.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/nasa_sst.asset @@ -13,7 +13,7 @@ Space Flight Center]] local URL = "https://sos.noaa.gov/catalog/datasets/sea-surface-temperature-model/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-co2_flux.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-co2_flux.asset index 7ce6e84ed0..c357a919df 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-co2_flux.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-co2_flux.asset @@ -12,7 +12,7 @@ water than in atmosphere above, CO2 is released to the atmosphere]] local URL = "https://sos.noaa.gov/catalog/datasets/ocean-atmosphere-co2-exchange/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-ph.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-ph.asset index 855b08afa1..fb85da36b3 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-ph.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-ph.asset @@ -15,7 +15,7 @@ dataset starts in 1861 and runs through 2100]] local URL = "https://sos.noaa.gov/catalog/datasets/ocean-acidification-surface-ph/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-saturation.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-saturation.asset index 7371f28050..b41f0377d7 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-saturation.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_acid-saturation.asset @@ -20,7 +20,7 @@ acidification]] local URL = "https://sos.noaa.gov/catalog/datasets/ocean-acidification-saturation-state/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_depths_temp.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_depths_temp.asset index 846f34d8dd..27c5016607 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_depths_temp.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_depths_temp.asset @@ -15,7 +15,7 @@ in some of the deeper imagery]] local URL = "https://sos.noaa.gov/catalog/datasets/ocean-temperature-at-depth-seasonal/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_drain-gray.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_drain-gray.asset index b3c491381a..3a14bf4d87 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_drain-gray.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ocean_drain-gray.asset @@ -13,7 +13,7 @@ anomalies in the sea surface detected by satellites]] local URL = "https://sos.noaa.gov/catalog/datasets/ocean-drain-with-gray-bathymetry/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/pac_turtle.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/pac_turtle.asset index f3a36de299..1a4151cdf0 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/pac_turtle.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/pac_turtle.asset @@ -15,7 +15,7 @@ tag transmitted a signal that allowed Adelita's track to be monitored post-relea local URL = "https://sos.noaa.gov/catalog/datasets/sea-turtle-track-pacific-ocean/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/phytoplankton.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/phytoplankton.asset index 6eb6fa12eb..dd262a0677 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/phytoplankton.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/phytoplankton.asset @@ -19,7 +19,7 @@ biomass]] local URL = "https://sos.noaa.gov/catalog/datasets/phytoplankton-model/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/pr_tsunami.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/pr_tsunami.asset index 5019d5de8f..78b14d4818 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/pr_tsunami.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/pr_tsunami.asset @@ -16,7 +16,7 @@ Trench, the deepest location in the Atlantic Ocean]] local URL = "https://sos.noaa.gov/catalog/datasets/puerto-rico-hypothetical-tsunami/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/reefs_risk.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/reefs_risk.asset index f6a6533d60..720127aecb 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/reefs_risk.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/reefs_risk.asset @@ -24,7 +24,7 @@ is leading to wide-spread coral bleaching]] local URL = "https://sos.noaa.gov/catalog/datasets/coral-reef-risk-outlook/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_level.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_level.asset index 88749947cc..c5f092c2c3 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_level.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_level.asset @@ -21,7 +21,7 @@ inches for low emission scenarios and 10 - 23 inches for high emission scenarios local URL = "https://sos.noaa.gov/catalog/datasets/sea-level-rise-10m-increments/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_level_trends.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_level_trends.asset index 871633731f..9757aa3491 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_level_trends.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_level_trends.asset @@ -22,7 +22,7 @@ high emission scenarios]] local URL = "https://sos.noaa.gov/catalog/datasets/sea-level-trends-1993-2012/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_surface_height_anomaly.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_surface_height_anomaly.asset index fbde95f363..71c12a4abc 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_surface_height_anomaly.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sea_surface_height_anomaly.asset @@ -16,7 +16,7 @@ collecting sea surface height data over the global ocean for almost two decades] local URL = "https://sos.noaa.gov/catalog/datasets/sea-surface-height-anomaly/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seaice_monthly.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seaice_monthly.asset index 6043d8e4ac..7ddcc88c9a 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seaice_monthly.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seaice_monthly.asset @@ -15,7 +15,7 @@ planet]] local URL = "https://sos.noaa.gov/catalog/datasets/sea-ice-extent-arctic-only-1850-present/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seaice_radiation.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seaice_radiation.asset index dd42635ed6..52963b7232 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seaice_radiation.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seaice_radiation.asset @@ -13,7 +13,7 @@ which is more pronounced than anywhere else on the planet]] local URL = "https://sos.noaa.gov/catalog/datasets/sea-ice-fraction-and-solar-radiation-absorption/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-land_background.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-land_background.asset index 993e9e9022..b670d3816b 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-land_background.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-land_background.asset @@ -10,7 +10,7 @@ quantity of marine plant-life as it changes throughout the seasons of the year]] local URL = "https://sos.noaa.gov/catalog/datasets/biosphere-marine-chlorophyll-concentration/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-no_holes.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-no_holes.asset index c0a0c6082a..765a94802f 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-no_holes.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-no_holes.asset @@ -11,7 +11,7 @@ year]] local URL = "https://sos.noaa.gov/catalog/datasets/biosphere-marine-chlorophyll-concentration-and-land-vegetation-with-co2-labels/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-polar_holes.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-polar_holes.asset index 012ebd28de..bc98e00dc9 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-polar_holes.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/seawifs-polar_holes.asset @@ -11,7 +11,7 @@ year]] local URL = "https://sos.noaa.gov/catalog/datasets/biosphere-marine-chlorophyll-concentration-and-land-vegetation/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/shark.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/shark.asset index ca0c3360c4..89d70e40ca 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/shark.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/shark.asset @@ -16,7 +16,7 @@ the coast of California also were tracked traveling great distances from Califor local URL = "https://sos.noaa.gov/catalog/datasets/great-white-shark-track/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ship_tracks-mosaic.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ship_tracks-mosaic.asset index 7a414b9034..773ea2dba6 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ship_tracks-mosaic.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ship_tracks-mosaic.asset @@ -22,7 +22,7 @@ ocean]] local URL = "https://sos.noaa.gov/catalog/datasets/ship-multibeam-bathymetric-surveys-mosaic/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ship_tracks-tracks.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ship_tracks-tracks.asset index 3a22679f6c..e9bd96ea0e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ship_tracks-tracks.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/ship_tracks-tracks.asset @@ -22,7 +22,7 @@ ocean]] local URL = "https://sos.noaa.gov/catalog/datasets/ship-tracklines-of-multibeam-bathymetric-surveys/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/shipping.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/shipping.asset index 197b037d66..6b36871784 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/shipping.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/shipping.asset @@ -17,7 +17,7 @@ Global Map of Human Impacts to Marine Ecosystems]] local URL = "https://sos.noaa.gov/catalog/datasets/shipping-routes-with-labels-one-year/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/species_richness.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/species_richness.asset index 4534a808c3..9ea1b64c46 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/species_richness.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/species_richness.asset @@ -20,7 +20,7 @@ fisheries]] local URL = "https://sos.noaa.gov/catalog/datasets/fisheries-species-richness/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sss.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sss.asset index 0ab1905034..f7fe11873c 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sss.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sss.asset @@ -14,7 +14,7 @@ Earth's water cycle and ocean circulation]] local URL = "https://sos.noaa.gov/catalog/datasets/sea-surface-salinity/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sst_1980_1999.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sst_1980_1999.asset index c8b742970e..6206025b57 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sst_1980_1999.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/sst_1980_1999.asset @@ -16,7 +16,7 @@ shading is a cooling of the ocean by 5-10°F]] local URL = "https://sos.noaa.gov/catalog/datasets/sea-surface-temperature-anomalies-1980-1999/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-alaska.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-alaska.asset index 673fe90b00..bbe1c9024b 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-alaska.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-alaska.asset @@ -26,7 +26,7 @@ high also struck Mexico, Chile, and even New Zealand]] local URL = "https://sos.noaa.gov/catalog/datasets/tsunami-historical-series-alaska-1964/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-aleutians.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-aleutians.asset index 9a84b76b13..2c3a881556 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-aleutians.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-aleutians.asset @@ -23,7 +23,7 @@ in Peru]] local URL = "https://sos.noaa.gov/catalog/datasets/tsunami-historical-series-aleutian-islands-1946/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-aleutians_1957.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-aleutians_1957.asset index 456505a344..3c1bdbad9f 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-aleutians_1957.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-aleutians_1957.asset @@ -24,7 +24,7 @@ These efforts, established in 1948, would later become the Pacific Tsunami Warni local URL = "https://sos.noaa.gov/catalog/datasets/tsunami-historical-series-aleutian-islands-1957/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-cascadia.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-cascadia.asset index 3c688d3a66..c6d07d7ef8 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-cascadia.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-cascadia.asset @@ -26,7 +26,7 @@ occurred around 9:00 at night in Cascadia on January 26, 1700 (05:00 January 27 local URL = "https://sos.noaa.gov/catalog/datasets/tsunami-historical-series-cascadia-1700/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-chile.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-chile.asset index b8334de5e8..89b087b975 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-chile.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-chile.asset @@ -28,7 +28,7 @@ and caused minor damage in San Diego, California and in Japan]] local URL = "https://sos.noaa.gov/catalog/datasets/tsunami-historical-series-chile-2010/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-japan.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-japan.asset index 1e3c4a08c6..d3d26e05fc 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-japan.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-japan.asset @@ -33,7 +33,7 @@ California]] local URL = "https://sos.noaa.gov/catalog/datasets/tsunami-historical-series-japan-2011/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-lisbon.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-lisbon.asset index 5dfb64a7cd..bbb689a831 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-lisbon.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-lisbon.asset @@ -16,7 +16,7 @@ completing the earthquake's destruction]] local URL = "https://sos.noaa.gov/catalog/datasets/tsunami-historical-series-lisbon-1755/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-samoa.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-samoa.asset index 11b3d8b34c..7b25322717 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-samoa.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-samoa.asset @@ -18,7 +18,7 @@ evacuation. PTWC canceled all tsunami alerts about four hours after the earthqua local URL = "https://sos.noaa.gov/catalog/datasets/tsunami-historical-series-samoa-2009/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-sumatra.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-sumatra.asset index bbe0fbb68a..af71950876 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-sumatra.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_historical_series-sumatra.asset @@ -12,7 +12,7 @@ Province, Sumatra, where the tsunami rose as high as 30 m (100 ft.) and traveled local URL = "https://sos.noaa.gov/catalog/datasets/tsunami-historical-series-sumatra-2004//" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_locations.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_locations.asset index 162f691b35..5e2e99ca81 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_locations.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/tsunami_locations.asset @@ -22,7 +22,7 @@ pronounced ocean features, such as volcanic islands, rift zones, and plate bound local URL = "https://sos.noaa.gov/catalog/datasets/tsunami-locations-2000-bce-2014/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vector_winds.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vector_winds.asset index fa7f73d43f..5fb452633a 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vector_winds.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vector_winds.asset @@ -16,7 +16,7 @@ from a given area on the ocean surface]] local URL = "https://sos.noaa.gov/catalog/datasets/ocean-surface-winds/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vent_discoveries_animation.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vent_discoveries_animation.asset index 9354c87045..3e5ef81dc7 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vent_discoveries_animation.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vent_discoveries_animation.asset @@ -13,7 +13,7 @@ with human-occupied, remotely-operated, and autonomous vehicles]] local URL = "https://sos.noaa.gov/catalog/datasets/deep-sea-vent-discoveries/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vent_locations.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vent_locations.asset index 521acfc12a..30bd1411c8 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vent_locations.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vent_locations.asset @@ -13,7 +13,7 @@ otherwise cold, dark, deep sea]] local URL = "https://sos.noaa.gov/catalog/datasets/deep-sea-vent-locations/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vorticity.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vorticity.asset index 20a3fb3f8a..fd43cf69c1 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vorticity.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/vorticity.asset @@ -14,7 +14,7 @@ chemical constituents (such as carbon dioxide) throughout the globe]] local URL = "https://sos.noaa.gov/catalog/datasets/ocean-surface-vorticity/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_2012.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_2012.asset index aae1c3c290..2dd68ccffc 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_2012.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_2012.asset @@ -11,7 +11,7 @@ numerical models to make these predictions]] local URL = "https://sos.noaa.gov/catalog/datasets/wave-heights-2012/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_katrina.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_katrina.asset index 3b9e4435e6..52f41c1189 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_katrina.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_katrina.asset @@ -13,7 +13,7 @@ though the Gulf of Mexico. Finally it hit the southeast Louisiana coast on Monda local URL = "https://sos.noaa.gov/catalog/datasets/wave-heights-hurricane-katrina-2005/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_sandy.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_sandy.asset index 174650547f..44d1229ed5 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_sandy.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_height_sandy.asset @@ -13,7 +13,7 @@ a wave model called 'WAVEWATCH III'. The movie shows 3 hourly model output over local URL = "https://sos.noaa.gov/catalog/datasets/wave-heights-hurricane-sandy-2012/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_power_2012.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_power_2012.asset index c1fbc68467..18f19e88dc 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_power_2012.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/waves-wave_power_2012.asset @@ -11,7 +11,7 @@ numerical models to make these predictions]] local URL = "https://sos.noaa.gov/catalog/datasets/wave-power-2012/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/weeklyseaice-10day_seaice.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/weeklyseaice-10day_seaice.asset index 6d5533fd1a..8c6b7ce635 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/weeklyseaice-10day_seaice.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/weeklyseaice-10day_seaice.asset @@ -17,7 +17,7 @@ cell size grid covering both Arctic and Antarctic polar regions]] local URL = "https://sos.noaa.gov/catalog/datasets/sea-ice-extent-1978-present/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/weeklyseaice-sept_seaice.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/weeklyseaice-sept_seaice.asset index b299b2de26..47dcb5639e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/weeklyseaice-sept_seaice.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/oceans/weeklyseaice-sept_seaice.asset @@ -25,7 +25,7 @@ Arctic is shrinking, while the Antarctic sea ice is not trending downward]] local URL = "https://sos.noaa.gov/catalog/datasets/sea-ice-extent-september-only/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/cables.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/cables.asset index 33f6b2be4c..b322a4e284 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/cables.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/cables.asset @@ -11,7 +11,7 @@ at Wikipedia]] local URL = "https://sos.noaa.gov/catalog/datasets/undersea-communication-cables/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/capitals.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/capitals.asset index 8b8024c36d..ad77528a18 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/capitals.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/capitals.asset @@ -10,7 +10,7 @@ country capitals onto any dataset that you are viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/capital-city-names/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/city_names.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/city_names.asset index 53ba464dfc..606da418d8 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/city_names.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/city_names.asset @@ -11,7 +11,7 @@ are viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/city-names/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/continent_borders-black.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/continent_borders-black.asset index 03280e3dd0..6766fb74d3 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/continent_borders-black.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/continent_borders-black.asset @@ -10,7 +10,7 @@ continent borders in black onto any dataset that you are viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/continent-borders-black/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/continent_borders-white.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/continent_borders-white.asset index ef85f6be2c..68b85bc6d9 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/continent_borders-white.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/continent_borders-white.asset @@ -10,7 +10,7 @@ continent borders in white onto any dataset that you are viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/continent-borders-white/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/continent_names.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/continent_names.asset index 5b9e415137..3cd2185ac8 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/continent_names.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/continent_names.asset @@ -10,7 +10,7 @@ continent continent names onto any dataset that you are viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/continent-names/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/country_borders-black.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/country_borders-black.asset index 2e9bdcf181..d16306a91e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/country_borders-black.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/country_borders-black.asset @@ -10,7 +10,7 @@ country borders onto any dataset that you are viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/country-borders-black/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/country_borders-white.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/country_borders-white.asset index 66e2d411e0..57907d639b 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/country_borders-white.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/country_borders-white.asset @@ -10,7 +10,7 @@ country borders onto any dataset that you are viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/country-borders-white/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/country_pop_names.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/country_pop_names.asset index 5475e86771..68ac357cfd 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/country_pop_names.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/country_pop_names.asset @@ -11,7 +11,7 @@ viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/country-names/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/currents.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/currents.asset index b786993321..6cc7217b16 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/currents.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/currents.asset @@ -10,7 +10,7 @@ of ocean currents, taken from the Ocean Circulation dataset]] local URL = "https://sos.noaa.gov/catalog/datasets/ocean-currents/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/general_circulation.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/general_circulation.asset index 1189f61cf8..48bd3641d2 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/general_circulation.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/general_circulation.asset @@ -12,7 +12,7 @@ rain shadow effect as well as cloud movement or when describing the coriolis eff local URL = "https://sos.noaa.gov/catalog/datasets/atmospheric-general-circulation/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/land_mask-black.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/land_mask-black.asset index 3bbb7af600..eda460e77e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/land_mask-black.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/land_mask-black.asset @@ -10,7 +10,7 @@ black mask over all the land on any dataset that you are viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/land-mask-black/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/land_mask-veg.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/land_mask-veg.asset index 7b9f28a9d6..0e86d919fc 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/land_mask-veg.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/land_mask-veg.asset @@ -11,7 +11,7 @@ viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/land-mask-vegetation/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/latlon_grid-black.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/latlon_grid-black.asset index 1488b37544..630c38028e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/latlon_grid-black.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/latlon_grid-black.asset @@ -10,7 +10,7 @@ latitude and longitude grid in black onto any dataset that you are viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/latlong-grid-black/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/latlon_grid-white.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/latlon_grid-white.asset index 8e4b62c7c9..88e05c2f12 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/latlon_grid-white.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/latlon_grid-white.asset @@ -10,7 +10,7 @@ latitude and longitude grid in white onto any dataset that you are viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/latlong-grid-white/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/ocean_names.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/ocean_names.asset index 6173829747..25ea1e94e2 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/ocean_names.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/ocean_names.asset @@ -10,7 +10,7 @@ names onto any dataset that you are viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/ocean-names/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/plate_boundary-color.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/plate_boundary-color.asset index 90bad9ed82..d06a4b533b 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/plate_boundary-color.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/plate_boundary-color.asset @@ -11,7 +11,7 @@ dataset that you are viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/plate-boundaries-colorized/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/plate_boundary-white.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/plate_boundary-white.asset index e0567faf4d..00e2d4dd0d 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/plate_boundary-white.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/plate_boundary-white.asset @@ -10,7 +10,7 @@ tectonic plate boundaries in white onto any dataset that you are viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/plate-boundaries-white/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/plate_names.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/plate_names.asset index f8bd0a3842..57b509e1ec 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/plate_names.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/plate_names.asset @@ -10,7 +10,7 @@ tectonic plate names onto any dataset that you are viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/plate-names/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/railroad.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/railroad.asset index 8efbb458c6..9301f1f4b5 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/railroad.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/railroad.asset @@ -11,7 +11,7 @@ Data]] local URL = "https://sos.noaa.gov/catalog/datasets/railroads/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/rivers.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/rivers.asset index 76bb1a1eb6..bef5758229 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/rivers.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/rivers.asset @@ -11,7 +11,7 @@ indicated by the size of the lines. The data was found at Natural Earth Data]] local URL = "https://sos.noaa.gov/catalog/datasets/rivers/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/roads-black.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/roads-black.asset index 02272f9cf5..c0085795cf 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/roads-black.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/roads-black.asset @@ -11,7 +11,7 @@ Data]] local URL = "https://sos.noaa.gov/catalog/datasets/roads-black/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/roads-white.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/roads-white.asset index 1c2755289f..a97330d44e 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/roads-white.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/roads-white.asset @@ -11,7 +11,7 @@ Data]] local URL = "https://sos.noaa.gov/catalog/datasets/roads-white/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/state_borders-black.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/state_borders-black.asset index fe201024ab..08359476c0 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/state_borders-black.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/state_borders-black.asset @@ -10,7 +10,7 @@ country and North American state borders onto any dataset that you are viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/country-borders-with-north-american-states-black/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/state_borders-white.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/state_borders-white.asset index 23163d7e99..42a19b0e29 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/state_borders-white.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/state_borders-white.asset @@ -10,7 +10,7 @@ country and North American state borders onto any dataset that you are viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/country-borders-with-north-american-states-white/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, diff --git a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/timezones.asset b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/timezones.asset index a771fb0f5e..69518b1167 100644 --- a/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/timezones.asset +++ b/data/assets/scene/solarsystem/planets/earth/noaa-sos/overlays/timezones.asset @@ -10,7 +10,7 @@ timezones onto any dataset that you are viewing]] local URL = "https://sos.noaa.gov/catalog/datasets/time-zones/" -local syncedDirectory = asset.syncedResource({ +local syncedDirectory = asset.resource({ Name = Name, Type = "HttpSynchronization", Identifier = Identifier, 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 8c53e2fa68..4e4f755a3f 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/amateur.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/amateur.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Amateur Radio)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_amateur_radio", 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 5307b4938b..654c64564a 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/experimental.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/experimental.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Experimental)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_x-comm", 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 c0e562027e..b6668e7ef2 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/geostationary.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/geostationary.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Geostationary)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_geo", 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 f4304a159a..e3d54ba07c 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/globalstar.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/globalstar.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (GlobalStar)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_globalstar", 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 8e81b4c2cb..0ab12c2d39 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/gorizont.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/gorizont.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Gorizont)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_gorizont", 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 1a7f0d21b5..b54b81e4f4 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/intelsat.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/intelsat.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Intelsat)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_intelsat", 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 b5181a5086..c5a623371a 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/iridium.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/iridium.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Iridium)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_iridium", 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 69856e3174..b56bb45a39 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 @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Iridium NEXT)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_iridium-NEXT", 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 5937017024..5be8ee8886 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/molniya.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/molniya.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Molniya)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_molniya", 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 06a4b3ddc4..8f00be9cac 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/orbcomm.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/orbcomm.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Orbcomm)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_orbcomm", 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 613a9a1933..99e98cc528 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 @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Other comm)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_other-comm", 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 f212a9f1a0..589e70850f 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/raduga.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/raduga.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Raduga)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_raduga", 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 9da29c13c7..68ff8c2343 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/ses.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/ses.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (SES)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_ses", 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 3e6538001f..d9ae0f3fa4 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/starlink.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/starlink.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Starlink)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_starlink", diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_asat.asset b/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_asat.asset index 524ea1b36e..197d0817b1 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_asat.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_asat.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Indian ASAT test Debris)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_2019-006", 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 48990cb89b..429d75054b 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 @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Breeze-M Breakup)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_2012-044", 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 f7164e36fa..6de5152b47 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 @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Fengyun Debris)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_1999-025", 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 d31e5d3cc6..2745a39fbf 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 @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Iridium 33 Debris)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_iridium-33-debris", 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 ae4e4c7658..8681bf7bc7 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 @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Kosmos 2251 Debris)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_cosmos-2251-debris", diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/debris/volume/cartesian_volume.asset b/data/assets/scene/solarsystem/planets/earth/satellites/debris/volume/cartesian_volume.asset index 165c09f43e..9fd06ffed6 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/debris/volume/cartesian_volume.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/debris/volume/cartesian_volume.asset @@ -18,8 +18,8 @@ local DebrisVolumeCartesian = { }, Renderable = { Type = "RenderableTimeVaryingVolume", - SourceDirectory = asset.localResource("generatedCartesian"), - TransferFunction = asset.localResource("transferfunction.txt"), + SourceDirectory = asset.resource("generatedCartesian"), + TransferFunction = asset.resource("transferfunction.txt"), StepSize = 0.01, MinValue = 0, MaxValue = 1, diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/debris/volume/spherical_volume.asset b/data/assets/scene/solarsystem/planets/earth/satellites/debris/volume/spherical_volume.asset index fa9884a66b..7b007b20a2 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/debris/volume/spherical_volume.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/debris/volume/spherical_volume.asset @@ -18,8 +18,8 @@ local DebrisVolumeSpherical = { }, Renderable = { Type = "RenderableTimeVaryingVolume", - SourceDirectory = asset.localResource("generated"), - TransferFunction = asset.localResource("transferfunction.txt"), + SourceDirectory = asset.resource("generated"), + TransferFunction = asset.resource("transferfunction.txt"), StepSize = 0.01, MinValue = 0, MaxValue = 1, 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 eef6c9b559..d146a2a599 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/active.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/active.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Active)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_active", 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 79bb4e7dab..95870e8de3 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/brightest.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/brightest.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (100 Brightest)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_visual", 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 c1a86fe27f..7f7a66fc55 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/cubesats.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/cubesats.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (CubeSat)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_cubesat", 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 881f564cd7..4166915558 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 @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Hubble)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_hst", 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 e113c31ed8..d8a069c31a 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset @@ -3,14 +3,14 @@ local sun = asset.require("scene/solarsystem/sun/sun") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "ISS Models", Type = "HttpSynchronization", Identifier = "iss_model", Version = 3 }) -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (ISS)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_iss", 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 72a6ad19d4..ac741d8d11 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/military.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/military.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Military)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_military", 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 4ed0818184..786a10b15f 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/other.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/other.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Other)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_other", 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 8dc45113ad..83143280f9 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/radar.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/radar.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Radar Calibration)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_radar", 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 dbc992f377..167d2b2cd9 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/spacestations.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/spacestations.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (SpaceStations)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_stations", 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 98b734ffa1..71336d51c1 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 @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Last 30 Days)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_tle-new", 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 a49d2358e7..94429c0294 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/beidou.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/beidou.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Beidou)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_beidou", 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 baecdb65a8..36cc8d0572 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/galileo.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/galileo.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Galileo)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_galileo", 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 f086cf4c6b..3e29b0f1c9 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/glosnass.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/glosnass.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Glosnass)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_glo-ops", 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 4a605cae9e..0e1cf3c5c5 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/gps.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/gps.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (GPS)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_gps-ops", 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 5bf78083f5..89df6c73c3 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/musson.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/musson.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Russian LEO Navigation)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_musson", 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 a6755ef248..a478d319c9 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/nnss.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/nnss.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Navy Navigation Satellite System)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_nnss", 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 9f46740e3b..181722c5c1 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/sbas.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/sbas.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Satellite Based Augmentation System)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_sbas", 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 a58e5a28de..84d4d1ad16 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/science/education.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/science/education.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Education)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_education", 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 332735fc3a..1277fa0e99 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/science/engineering.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/science/engineering.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Engineering)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_engineering", 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 809fe9f451..6b5bc0468b 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/science/geodetic.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/science/geodetic.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Geodetic)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_geodetic", 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 2bdda691a2..1f222f6c5a 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/science/spaceearth.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/science/spaceearth.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Space & Earth Science)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_science", 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 f82ed45578..abe707e3c8 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/aqua.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/aqua.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Aqua)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_aqua", 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 a6586c21a8..f4632ee3e3 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/argos.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/argos.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (ARGOS)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_argos", 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 88a3f46446..7ecdebfb9e 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/dmc.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/dmc.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Disaster Monitoring)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_dmc", 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 ca16489efd..6451aace49 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 @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Earth Resources)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_resource", 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 6e1e91de04..fc24bdd839 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/goes.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/goes.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (GOES)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_goes", 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 30d7b3b906..65b1a6cf81 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/noaa.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/noaa.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (NOAA)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_noaa", 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 857be0486b..b56b882db8 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/planet.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/planet.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Planet)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_planet", 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 5f2eab355a..4b3b9dc29e 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/sarsat.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/sarsat.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Search & Rescue (SARSAT))", Type = "UrlSynchronization", Identifier = "satellite_omm_data_sarsat", 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 8bcb7aa50c..b1a4f7cd7b 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/snpp.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/snpp.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (SNPP)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_snpp", 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 56e8f279e5..ee3267a8e1 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/spire.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/spire.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Spire)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_spire", 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 b77f8f5104..c8cfc79075 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/tdrss.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/tdrss.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Tracking and Data Relay Satellite System (TDRSS))", Type = "UrlSynchronization", Identifier = "satellite_omm_data_tdrss", 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 aefe0d0ae2..b4d4791ab1 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/terra.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/terra.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Terra)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_terra", 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 b9e48e5cc9..3993910bfa 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/weather.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/weather.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local omm = asset.syncedResource({ +local omm = asset.resource({ Name = "Satellite OMM Data (Weather)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_weather", diff --git a/data/assets/scene/solarsystem/planets/jupiter/callisto/callisto.asset b/data/assets/scene/solarsystem/planets/jupiter/callisto/callisto.asset index 9c3860b697..162d176067 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/callisto/callisto.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/callisto/callisto.asset @@ -5,7 +5,7 @@ local kernel = asset.require("../kernels") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Jupiter Labels", Type = "HttpSynchronization", Identifier = "jupiter_labels", diff --git a/data/assets/scene/solarsystem/planets/jupiter/callisto/layers/colorlayers/callisto_texture.asset b/data/assets/scene/solarsystem/planets/jupiter/callisto/layers/colorlayers/callisto_texture.asset index e3997574c9..804a5838d9 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/callisto/layers/colorlayers/callisto_texture.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/callisto/layers/colorlayers/callisto_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../callisto") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Callisto Textures", Type = "HttpSynchronization", Identifier = "callisto_textures", diff --git a/data/assets/scene/solarsystem/planets/jupiter/europa/europa.asset b/data/assets/scene/solarsystem/planets/jupiter/europa/europa.asset index ca760934d4..524ada7573 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/europa/europa.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/europa/europa.asset @@ -5,7 +5,7 @@ local kernel = asset.require("../kernels") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Jupiter Labels", Type = "HttpSynchronization", Identifier = "jupiter_labels", diff --git a/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/europa_texture.asset b/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/europa_texture.asset index ab3034ed9b..e0f15f1f0b 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/europa_texture.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/europa_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../europa") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Europa Textures", Type = "HttpSynchronization", Identifier = "europa_textures", diff --git a/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/voyager_global_mosaic_local.asset b/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/voyager_global_mosaic_local.asset index 0fba860a00..5ceec9e9b1 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/voyager_global_mosaic_local.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/voyager_global_mosaic_local.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../europa") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Europa Textures", Type = "HttpSynchronization", Identifier = "europa_textures", diff --git a/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/voyager_global_mosaic_newyork.asset b/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/voyager_global_mosaic_newyork.asset index fea34cd307..9bdc27c2b4 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/voyager_global_mosaic_newyork.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/voyager_global_mosaic_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Voyager_Global_Mosaic_NewYork", Name = "Voyager Global Mosaic [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("voyager_global_mosaic_newyork.wms"), + FilePath = asset.resource("voyager_global_mosaic_newyork.wms"), BlendMode = "Color" } diff --git a/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/voyager_global_mosaic_sweden.asset b/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/voyager_global_mosaic_sweden.asset index bc210bef54..3687982f7d 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/voyager_global_mosaic_sweden.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/voyager_global_mosaic_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Voyager_Global_Mosaic_sweden", Name = "Voyager Global Mosaic [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("voyager_global_mosaic_sweden.wms"), + FilePath = asset.resource("voyager_global_mosaic_sweden.wms"), BlendMode = "Color" } diff --git a/data/assets/scene/solarsystem/planets/jupiter/ganymede/ganymede.asset b/data/assets/scene/solarsystem/planets/jupiter/ganymede/ganymede.asset index 5a0340b7e8..84b03b030a 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/ganymede/ganymede.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/ganymede/ganymede.asset @@ -5,7 +5,7 @@ local kernel = asset.require("../kernels") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Jupiter Labels", Type = "HttpSynchronization", Identifier = "jupiter_labels", diff --git a/data/assets/scene/solarsystem/planets/jupiter/ganymede/layers/colorlayers/ganymede_texture.asset b/data/assets/scene/solarsystem/planets/jupiter/ganymede/layers/colorlayers/ganymede_texture.asset index c13cba2e90..ab2bebba5e 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/ganymede/layers/colorlayers/ganymede_texture.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/ganymede/layers/colorlayers/ganymede_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../ganymede") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Ganymede Textures", Type = "HttpSynchronization", Identifier = "ganymede_textures", diff --git a/data/assets/scene/solarsystem/planets/jupiter/io/io.asset b/data/assets/scene/solarsystem/planets/jupiter/io/io.asset index b25fe4e33e..c4a7ee85fd 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/io/io.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/io/io.asset @@ -5,7 +5,7 @@ local kernel = asset.require("../kernels") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Jupiter Labels", Type = "HttpSynchronization", Identifier = "jupiter_labels", diff --git a/data/assets/scene/solarsystem/planets/jupiter/io/layers/colorlayers/io_texture.asset b/data/assets/scene/solarsystem/planets/jupiter/io/layers/colorlayers/io_texture.asset index d28283f7f2..406767562b 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/io/layers/colorlayers/io_texture.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/io/layers/colorlayers/io_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../io") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Io Textures", Type = "HttpSynchronization", Identifier = "io_textures", diff --git a/data/assets/scene/solarsystem/planets/jupiter/kernels.asset b/data/assets/scene/solarsystem/planets/jupiter/kernels.asset index d336e1b908..ac4a956c60 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/kernels.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/kernels.asset @@ -1,4 +1,4 @@ -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Jupiter Spice Kernels", Type = "HttpSynchronization", Identifier = "jupiter_kernels", diff --git a/data/assets/scene/solarsystem/planets/jupiter/layers/colorlayers/jupiter_texture.asset b/data/assets/scene/solarsystem/planets/jupiter/layers/colorlayers/jupiter_texture.asset index 3b8eaf3ee3..2a88336998 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/layers/colorlayers/jupiter_texture.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/layers/colorlayers/jupiter_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../jupiter") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Jupiter Textures", Type = "HttpSynchronization", Identifier = "jupiter_textures", diff --git a/data/assets/scene/solarsystem/planets/jupiter/layers/colorlayers/jupiter_video.asset b/data/assets/scene/solarsystem/planets/jupiter/layers/colorlayers/jupiter_video.asset index 2f71fadc12..9d9a0aae62 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/layers/colorlayers/jupiter_video.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/layers/colorlayers/jupiter_video.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../jupiter") -local data = asset.syncedResource({ +local data = asset.resource({ Name = "Jupiter Video Layer", Type = "HttpSynchronization", Identifier = "jupiter_videos", diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_blended.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_blended.asset index 99ae7f2feb..e9dd435845 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_blended.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_blended.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "CTX_blended", Name = "CTX Blended", Enabled = asset.enabled, - FilePath = asset.localResource("ctx_blended.vrt"), + FilePath = asset.resource("ctx_blended.vrt"), BlendMode = "Color", Description = [[The Bruce Murray Laboratory for Planetary Visualization has completed a 5.7 terapixel mosaic of the surface of Mars rendered at 5.0 m/px. Each pixel in the diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_blended_beta01.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_blended_beta01.asset index 5f0cd47132..9a71f5cd2e 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_blended_beta01.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_blended_beta01.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "CTX_blended_01", Name = "CTX Blended beta01", Enabled = asset.enabled, - FilePath = asset.localResource("ctx_blended_beta01.vrt"), + FilePath = asset.resource("ctx_blended_beta01.vrt"), BlendMode = "Color", Settings = { Gamma = 2.14, diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_newyork.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_newyork.asset index 554bd605fa..cd89d5bc20 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_newyork.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "CTX_Mosaic_NewYork", Name = "CTX Mosaic [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("ctx_mosaic_newyork.wms"), + FilePath = asset.resource("ctx_mosaic_newyork.wms"), BlendMode = "Color" } diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_sweden.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_sweden.asset index b4a64f4359..20e912abf4 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_sweden.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "CTX_Mosaic_Sweden", Name = "CTX Mosaic [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("ctx_mosaic_sweden.wms"), + FilePath = asset.resource("ctx_mosaic_sweden.wms"), BlendMode = "Color" } diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_utah.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_utah.asset index 9369fc1225..70820e690f 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_utah.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "CTX_Mosaic_Utah", Name = "CTX Mosaic [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("ctx_mosaic_utah.wms"), + FilePath = asset.resource("ctx_mosaic_utah.wms"), BlendMode = "Color" } diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/hirise.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/hirise.asset index 84a3635ec0..05660ad98e 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/hirise.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/hirise.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "HiRISE-PSP", Name = "HiRISE", Enabled = asset.enabled, - FilePath = asset.localResource("hirise.vrt"), + FilePath = asset.resource("hirise.vrt"), BlendMode = "Color", Settings = { Gamma = 1.0, diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/hirisels.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/hirisels.asset index ce3ba7880e..37b7be2a60 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/hirisels.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/hirisels.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "HiRISE-LS", Name = "HiRISE Local Set", Enabled = asset.enabled, - FilePath = asset.localResource("hirisels.vrt"), + FilePath = asset.resource("hirisels.vrt"), BlendMode = "Color", Description = [[HiRISE (High Resolution Imaging Science Experiment) is the most powerful camera ever sent to another planet, one of six instruments onboard the diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mars_texture.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mars_texture.asset index 090565e026..00cf598ee1 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mars_texture.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mars_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../mars") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Mars Textures", Type = "HttpSynchronization", Identifier = "mars_textures", diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_newyork.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_newyork.asset index e482dfd72f..9e38603835 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_newyork.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "MOC_WA_Color_NewYork", Name = "MOC WA Color [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("moc_wa_color_newyork.wms"), + FilePath = asset.resource("moc_wa_color_newyork.wms"), Settings = { Gamma = 1.6, Multiplier = 1.07 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_sweden.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_sweden.asset index 9cf95b8188..0256b37974 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_sweden.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "MOC_WA_Color_LiU", Name = "MOC WA Color [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("moc_wa_color_sweden.wms"), + FilePath = asset.resource("moc_wa_color_sweden.wms"), Settings = { Gamma = 1.6, Multiplier = 1.07 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_utah.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_utah.asset index dbb028af29..b84870c532 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_utah.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "MOC_WA_Color_Utah", Name = "MOC WA Color [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("moc_wa_color_utah.wms"), + FilePath = asset.resource("moc_wa_color_utah.wms"), Settings = { Gamma = 1.6, Multiplier = 1.07 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_newyork.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_newyork.asset index 6cb33b8698..96d96527c3 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_newyork.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "MOLA_HRSC_NewYork", Name = "MOLA HRSC [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("mola_hrsc_newyork.wms"), + FilePath = asset.resource("mola_hrsc_newyork.wms"), Description = [[This map layer is colorzied based elevation data from MOLA and HRSC. Compared to MOLA Psuedo Color, this layer has no terrain shading, which is suitable for use when combing with other layers. Data Reference: diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_sweden.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_sweden.asset index 222504b621..5360c598f5 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_sweden.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "MOLA_HRSC_Sweden", Name = "MOLA HRSC [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("mola_hrsc_sweden.wms"), + FilePath = asset.resource("mola_hrsc_sweden.wms"), Description = [[This map layer is colorzied based elevation data from MOLA and HRSC. Compared to MOLA Psuedo Color, this layer has no terrain shading, which is suitable for use when combing with other layers. Data Reference: diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_utah.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_utah.asset index e4f719418b..b1286cdd5b 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_utah.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "MOLA_HRSC_Utah", Name = "MOLA HRSC [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("mola_hrsc_utah.wms"), + FilePath = asset.resource("mola_hrsc_utah.wms"), Description = [[This map layer is colorzied based elevation data from MOLA and HRSC. Compared to MOLA Psuedo Color, this layer has no terrain shading, which is suitable for use when combing with other layers. Data Reference: diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_newyork.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_newyork.asset index ec584d0ea4..1af1376a92 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_newyork.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "MOLA_Pseudo_Color_NewYork", Name = "MOLA Pseudo Color [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("mola_pseudo_color_newyork.wms"), + FilePath = asset.resource("mola_pseudo_color_newyork.wms"), Description = [[This map is based on data from the Mars Orbiter Laser Altimeter (MOLA) (Smith, et al., 2001), an instrument on NASA's Mars Global Surveyor (MGS) spacecraft (Albee, et al., 2001). The image used for the base of this map diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_sweden.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_sweden.asset index ddfcb02653..df09e62929 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_sweden.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "MOLA_Pseudo_Color_Sweden", Name = "MOLA Pseudo Color [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("mola_pseudo_color_sweden.wms"), + FilePath = asset.resource("mola_pseudo_color_sweden.wms"), Description = [[This map is based on data from the Mars Orbiter Laser Altimeter (MOLA) (Smith, et al., 2001), an instrument on NASA's Mars Global Surveyor (MGS) spacecraft (Albee, et al., 2001). The image used for the base of this map diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_utah.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_utah.asset index e67262bd3a..b7e21a1bc6 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_utah.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "MOLA_Pseudo_Color_Utah", Name = "MOLA Pseudo Color [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("mola_pseudo_color_utah.wms"), + FilePath = asset.resource("mola_pseudo_color_utah.wms"), Description = [[This map is based on data from the Mars Orbiter Laser Altimeter (MOLA) (Smith, et al., 2001), an instrument on NASA's Mars Global Surveyor (MGS) spacecraft (Albee, et al., 2001). The image used for the base of this map diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_newyork.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_newyork.asset index a5dc285c20..e2b0de6b2c 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_newyork.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Themis_IR_Day_NewYork", Name = "Themis IR Day [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("themis_ir_day_newyork.wms"), + FilePath = asset.resource("themis_ir_day_newyork.wms"), BlendMode = "Color", Description = [[This mosaic represents the Thermal Emission Imaging System (THEMIS) -daytime infrared (IR) 100 meter/pixel mosaic (version 12) released in the summer diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_sweden.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_sweden.asset index 24886ae828..efbc859e78 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_sweden.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Themis_IR_Day_Sweden", Name = "Themis IR Day [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("themis_ir_day_sweden.wms"), + FilePath = asset.resource("themis_ir_day_sweden.wms"), BlendMode = "Color", Description = [[This mosaic represents the Thermal Emission Imaging System (THEMIS) -daytime infrared (IR) 100 meter/pixel mosaic (version 12) released in the summer diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_utah.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_utah.asset index dad2f6d283..a1ff8ac6a1 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_utah.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Themis_IR_Day_Utah", Name = "Themis IR Day [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("themis_ir_day_utah.wms"), + FilePath = asset.resource("themis_ir_day_utah.wms"), BlendMode = "Color", Description = [[This mosaic represents the Thermal Emission Imaging System (THEMIS) -daytime infrared (IR) 100 meter/pixel mosaic (version 12) released in the summer diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_newyork.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_newyork.asset index 4a650074f1..1c6c2f6ae1 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_newyork.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Themis_IR_Night_NewYork", Name = "Themis IR Night [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("themis_ir_night_newyork.vrt"), + FilePath = asset.resource("themis_ir_night_newyork.vrt"), BlendMode = "Color", Description = [[This mosaic represents the Thermal Emission Imaging System (THEMIS) -nighttime infrared (IR) 100 meter/pixel mosaic (version 12) released in the diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_sweden.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_sweden.asset index aa288c5ffe..13f20e95c9 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_sweden.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Themis_IR_Night_Sweden", Name = "Themis IR Night [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("themis_ir_night_sweden.vrt"), + FilePath = asset.resource("themis_ir_night_sweden.vrt"), BlendMode = "Color", Description = [[This mosaic represents the Thermal Emission Imaging System (THEMIS) -nighttime infrared (IR) 100 meter/pixel mosaic (version 12) released in the diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_utah.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_utah.asset index 441ce32631..7b9e3004c9 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_utah.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Themis_IR_Night_Utah", Name = "Themis IR Night [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("themis_ir_night_utah.vrt"), + FilePath = asset.resource("themis_ir_night_utah.vrt"), BlendMode = "Color", Description = [[This mosaic represents the Thermal Emission Imaging System (THEMIS) -nighttime infrared (IR) 100 meter/pixel mosaic (version 12) released in the diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_newyork.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_newyork.asset index 85b475603d..b4e0ffb44f 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_newyork.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Viking_MDIM_NewYork", Name = "Viking MDIM [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("viking_mdim_newyork.wms"), + FilePath = asset.resource("viking_mdim_newyork.wms"), Description = [[This global image map of Mars has a resolution of 256 pixels/degree (scale approximately 232 meters per pixel (m) at the equator). The colorized mosaic was completed by NASA AMES which warped the original Viking colorized diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_sweden.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_sweden.asset index 5c40e44373..d9c2ff518e 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_sweden.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Viking_MDIM_Sweden", Name = "Viking MDIM [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("viking_mdim_sweden.wms"), + FilePath = asset.resource("viking_mdim_sweden.wms"), Description = [[This global image map of Mars has a resolution of 256 pixels/degree (scale approximately 232 meters per pixel (m) at the equator). The colorized mosaic was completed by NASA AMES which warped the original Viking colorized diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_utah.asset b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_utah.asset index 0b795a883c..6d958b52c6 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_utah.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Viking_MDIM_Utah", Name = "Viking MDIM [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("viking_mdim_utah.wms"), + FilePath = asset.resource("viking_mdim_utah.wms"), Description = [[This global image map of Mars has a resolution of 256 pixels/degree (scale approximately 232 meters per pixel (m) at the equator). The colorized mosaic was completed by NASA AMES which warped the original Viking colorized diff --git a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/hirisels.asset b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/hirisels.asset index af7a51b238..743d1b68f3 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/hirisels.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/hirisels.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "HiRISE-LS-DEM", Name = "HiRISE Local Set DEM", Enabled = asset.enabled, - FilePath = asset.localResource("hirisels.wms"), + FilePath = asset.resource("hirisels.wms"), TilePixelSize = 129, Description = [[HiRISE (High Resolution Imaging Science Experiment) is the most powerful camera ever sent to another planet, one of six instruments onboard the diff --git a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mdem200m.asset b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mdem200m.asset index 8206a3a70c..1868b7f580 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mdem200m.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mdem200m.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "MDEM200M", Name = "HRSC MOLA Blended DEM Global 200m v2", Enabled = asset.enabled, - FilePath = asset.localResource("mdem200m.wms"), + FilePath = asset.resource("mdem200m.wms"), TilePixelSize = 129, Description = [[Blend of data derived from the Mars Orbiter Laser Altimeter (MOLA, an instrument aboard NASA's Mars Global Surveyor spacecraft), and data derived diff --git a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_amnh.asset b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_amnh.asset index 37dc40350d..6c006e38ff 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_amnh.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_amnh.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Mola_AMNH", Name = "Mola Elevation [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("mola_amnh.wms"), + FilePath = asset.resource("mola_amnh.wms"), TilePixelSize = 360, Description = [[This digital elevation model (DEM) is based on data from the Mars Orbiter Laser Altimeter (MOLA; Smith et al., 2001), an instrument on NASA's Mars diff --git a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_sweden.asset b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_sweden.asset index 8b6b7c044a..6d39acc71d 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_sweden.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Mola_Europe", Name = "Mola Elevation [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("mola_sweden.wms"), + FilePath = asset.resource("mola_sweden.wms"), TilePixelSize = 360, Description = [[This digital elevation model (DEM) is based on data from the Mars Orbiter Laser Altimeter (MOLA; Smith et al., 2001), an instrument on NASA's Mars diff --git a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_utah.asset b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_utah.asset index 23545537a2..4d1cb1c87c 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_utah.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Mola_Utah", Name = "Mola Elevation [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("mola_utah.wms"), + FilePath = asset.resource("mola_utah.wms"), TilePixelSize = 360, Description = [[This digital elevation model (DEM) is based on data from the Mars Orbiter Laser Altimeter (MOLA; Smith et al., 2001), an instrument on NASA's Mars diff --git a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MEX_HRSC.asset b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MEX_HRSC.asset index 3223495309..56d8c117dd 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MEX_HRSC.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MEX_HRSC.asset @@ -9,14 +9,14 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/mars/mars").Ma local treks_hrsc_dem_martian_east = { Identifier = "hrsc_dem_martian_east", Name = [[MEX HRSC, Martian Path Eastern Section DEM]], - FilePath = asset.localResource("MEX_HRSC/Martian_Path_Eastern_Section_DEM.vrt"), + FilePath = asset.resource("MEX_HRSC/Martian_Path_Eastern_Section_DEM.vrt"), Description = [[This layer is a greyscale mosaic assembled using data from the High Resolution Stereo Camera aboard the European Space Agency's Mars Express orbiter. HRSC is being used to obtain color and stereo images that will map 100% of Mars' surface at resolution better than 30 m/pixel, and 50% of the surface at better than 15 m/pixel. Each of the nine CCD lines of HRSC, a linescan imager (pushbroom camera), contains 5184 pixels. The channels consist of red, green, blue, near-infrared, three stereo channels (backward, nadir, and forward) and two photometric channels. The digital elevation model used for this layer is a combination of data derived from the HRSC and the Mars Orbiter Laser Altimeter.]] } local treks_MC11E11_HRDTMAR_DA5 = { Identifier = "MC11E11_HRDTMAR_DA5", Name = [[MEX HRSC, Martian Path MC11 Quad DEM]], - FilePath = asset.localResource("MEX_HRSC/Martian_Path_MC11_Quad_DEM.vrt"), + FilePath = asset.resource("MEX_HRSC/Martian_Path_MC11_Quad_DEM.vrt"), Description = [[This layer is a greyscale mosaic assembled using data from the High Resolution Stereo Camera aboard the European Space Agency's Mars Express orbiter. HRSC is being used to obtain color and stereo images that will map 100% of Mars' surface at resolution better than 30 m/pixel, and 50% of the surface at better than 15 m/pixel. Each of the nine CCD lines of HRSC, a linescan imager (pushbroom camera), contains 5184 pixels. The channels consist of red, green, blue, near-infrared, three stereo channels (backward, nadir, and forward) and two photometric channels. The digital elevation model used for this layer is a combination of data derived from the HRSC and the Mars Orbiter Laser Altimeter.]] } diff --git a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MGS_MOC_Atlas.asset b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MGS_MOC_Atlas.asset index d15e6a2ed9..0c3471dcc9 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MGS_MOC_Atlas.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MGS_MOC_Atlas.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/mars/mars").Ma local treks_msss_atlas_simp_clon = { Identifier = "msss_atlas_simp_clon", Name = [[MGS MOC Atlas, Global Color Mosaic]], - FilePath = asset.localResource("MGS_MOC_Atlas/Global_Color_Mosaic.vrt"), + FilePath = asset.resource("MGS_MOC_Atlas/Global_Color_Mosaic.vrt"), Description = [[This data was acquired using the Mars Orbiter Camera instrument aboard NASA's Mars Global Surveyor spacecraft (MGS). MGS was launched on November 7, 1996 and arrived at Mars on September 11, 1997. It maintained a circular polar orbit, completing an orbital revolution every 117.65 minutes at an average altitude of 378 km (235 mi). Until November 2, 2006, MGS characterized and mapped Mars' surface features, properties, topography, composition, and processes, as well as studied Mars' weather and atmospheric structure. The Mars Orbiter Camera (MOC) consisted of 3 instruments. A black-and-white narrow angle camera captured high resolution images (typically 1.5 to 12 m per pixel) and red and blue wide angle cameras for context (240 m per pixel) and daily global imaging (7.5 km per pixel). This mosaic was assembled from Wide Angle red images (primarily those acquired in May-June 1999) from the Mars Orbiter Camera.]] diff --git a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MGS_MOLA.asset b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MGS_MOLA.asset index 1c052b65d4..164cc565cf 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MGS_MOLA.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MGS_MOLA.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/mars/mars").Ma local treks_Mars_MGS_MOLA_ClrShade_merge_global_463m = { Identifier = "Mars_MGS_MOLA_ClrShade_merge_global_463m", Name = [[MGS MOLA, Global Color Hillshade]], - FilePath = asset.localResource("MGS_MOLA/Global_Color_Hillshade.vrt"), + FilePath = asset.resource("MGS_MOLA/Global_Color_Hillshade.vrt"), Description = [[This data was acquired using the Mars Orbiter Laser Altimeter instrument aboard NASA's Mars Global Surveyor spacecraft (MGS). MGS was launched on November 7, 1996 and arrived at Mars on September 11, 1997. It maintained a circular polar orbit, completing an orbital revolution every 117.65 minutes at an average altitude of 378 km (235 mi). Until November 2, 2006, MGS characterized and mapped Mars' surface features, properties, topography, composition, and processes, as well as studied Mars' weather and atmospheric structure. The Mars Orbiter Laser Altimeter (MOLA) made precise measurements of the heights and depths of surface features on Mars. MOLA fired infrared laser pulses downward 10 times per second, and measured the time it took for the reflected pulses to return from the surface. Converting this data to a colorized hillshade makes it particularly easy to visualize surface topography. The image used for the base of this map represents more than 600 million measurements gathered between 1999 and 2001. The average accuracy of each point is originally ~100 meters in horizontal position and the total elevation uncertainty is at least ±3 m.]] @@ -18,7 +18,7 @@ The Mars Orbiter Laser Altimeter (MOLA) made precise measurements of the heights local treks_mola128_mola64_merge_90Nto90S_SimpleC_clon0 = { Identifier = "mola128_mola64_merge_90Nto90S_SimpleC_clon0", Name = [[MGS MOLA, Global DEM]], - FilePath = asset.localResource("MGS_MOLA/Global_DEM.vrt"), + FilePath = asset.resource("MGS_MOLA/Global_DEM.vrt"), Description = [[This data was acquired using the Mars Orbiter Laser Altimeter instrument aboard NASA's Mars Global Surveyor spacecraft (MGS). MGS was launched on November 7, 1996 and arrived at Mars on September 11, 1997. It maintained a circular polar orbit, completing an orbital revolution every 117.65 minutes at an average altitude of 378 km (235 mi). Until November 2, 2006, MGS characterized and mapped Mars' surface features, properties, topography, composition, and processes, as well as studied Mars' weather and atmospheric structure. The DEM represents more than 600 million measurements gathered between 1999 and 2001, adjusted for consistency and converted to planetary radii. These have been converted to elevations above the areoid as determined from a Martian gravity field solution GMM-2B, truncated to degree and order 50, and oriented according to current standards. The average accuracy of each point is originally ~100 meters in horizontal position and ~1 meter in radius. However, the total elevation uncertainty is at least ±3 m due to the global error in the areoid (±1.8 meters) and regional uncertainties in its shape. This DEM is a blend of data obtained with a resolution of 128 pixels per degree and 64 pixels per degree. The majority of the surface is covered at the higher resolution 128 pixels per degree. In projection, these pixels are 463 meters in size at the equator. However, these higher resolution data are very sparse near the two poles (above 87° north and below 87° south latitude) because these areas were sampled by only a few off-nadir altimetry tracks. Gaps between tracks of 1-2 km are common, and some gaps of up to 12 km occur near the equator.This data was acquired using the Mars Orbiter Laser Altimeter instrument aboard NASA's Mars Global Surveyor spacecraft (MGS). MGS was launched on November 7, 1996 and arrived at Mars on September 11, 1997. It maintained a circular polar orbit, completing an orbital revolution every 117.65 minutes at an average altitude of 378 km (235 mi). Until November 2, 2006, MGS characterized and mapped Mars' surface features, properties, topography, composition, and processes, as well as studied Mars' weather and atmospheric structure. @@ -29,7 +29,7 @@ The DEM represents more than 600 million measurements gathered between 1999 and local treks_mola_roughness = { Identifier = "mola_roughness", Name = [[MGS MOLA, Global Surface Roughness]], - FilePath = asset.localResource("MGS_MOLA/Global_Surface_Roughness.vrt"), + FilePath = asset.resource("MGS_MOLA/Global_Surface_Roughness.vrt"), Description = [[The Mars Orbiter Laser Altimeter (MOLA) aboard the Mars Global Surveyor (MGS) spacecraft, made precise altimetry measurements from orbit around Mars from September 1997 to June, 2001. The MOLA instrument transmitted infrared laser pulses towards Mars at a rate of 10 times per second, and measured the time of flight to determine the range (distance) of the MGS spacecraft to the Martian surface. The range measurements resulted in precise topographic maps of Mars. This kilometer-scale global roughness map is presented as an RGB composite image. The Blue, Green and Red channels contain roughness at 0.6 km, 2.4 km, and 9.2 km baselines. Brighter shades denote rougher surface. Thus, general brightness denotes general roughness, and color hue denotes the nature of the scale dependence of roughness. Map resolution/scale: 8 ppd/7.5km. Kreslavsky and Head, 2000, JGR, VOL. 105, NO. Ell, PAGES 26,695-26,711]] } diff --git a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MGS_MOLA_and_Mars_Express_HRSC.asset b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MGS_MOLA_and_Mars_Express_HRSC.asset index e68e1850b3..7b333499b9 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MGS_MOLA_and_Mars_Express_HRSC.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MGS_MOLA_and_Mars_Express_HRSC.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/mars/mars").Ma local treks_Mars_MOLA_blend200ppx_HRSC_ClrShade_clon0dd_200mpp_lzw = { Identifier = "Mars_MOLA_blend200ppx_HRSC_ClrShade_clon0dd_200mpp_lzw", Name = [[MGS MOLA and Mars Express HRSC, Color Hillshade Blend]], - FilePath = asset.localResource("MGS_MOLA_and_Mars_Express_HRSC/Color_Hillshade_Blend.vrt"), + FilePath = asset.resource("MGS_MOLA_and_Mars_Express_HRSC/Color_Hillshade_Blend.vrt"), Description = [[This data product is a blend of digital terrain model (DTM) data derived from the Mars Orbiter Laser Altimeter (MOLA) instrument aboard NASA's Mars Global Surveyor spacecraft (MGS), and the High-Resolution Stereo Camera (HRSC) aboard the European Space Agency's Mars Express spacecraft. MOLA fired infrared laser pulses downward 10 times per second, and measured the time it took for the reflected pulses to return from the surface. The image used for the MOLA base of this map represents more than 600 million measurements gathered between 1999 and 2001. The average accuracy of each point is originally ~100 meters in horizontal position and the total elevation uncertainty is at least ±3 m. MOLA produced global topographic coverage with a spatial resolution of about 300 x 1000 m at the equator, and better near the poles. @@ -22,7 +22,7 @@ R. Jaumann, et al. (2007), The high-resolution stereo camera (HRSC) experiment o local treks_Mars_MOLA_blend200ppx_HRSC_Shade_clon0dd_200mpp_lzw = { Identifier = "Mars_MOLA_blend200ppx_HRSC_Shade_clon0dd_200mpp_lzw", Name = [[MGS MOLA and Mars Express HRSC, Hillshade Blend]], - FilePath = asset.localResource("MGS_MOLA_and_Mars_Express_HRSC/Hillshade_Blend.vrt"), + FilePath = asset.resource("MGS_MOLA_and_Mars_Express_HRSC/Hillshade_Blend.vrt"), Description = [[This data product is a blend of digital terrain model (DTM) data derived from the Mars Orbiter Laser Altimeter (MOLA) instrument aboard NASA's Mars Global Surveyor spacecraft (MGS), and the High-Resolution Stereo Camera (HRSC) aboard the European Space Agency's Mars Express spacecraft. MOLA fired infrared laser pulses downward 10 times per second, and measured the time it took for the reflected pulses to return from the surface. The image used for the MOLA base of this map represents more than 600 million measurements gathered between 1999 and 2001. The average accuracy of each point is originally ~100 meters in horizontal position and the total elevation uncertainty is at least ±3 m. MOLA produced global topographic coverage with a spatial resolution of about 300 x 1000 m at the equator, and better near the poles. diff --git a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MGS_TES.asset b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MGS_TES.asset index 163522a292..fa0d856950 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MGS_TES.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MGS_TES.asset @@ -9,42 +9,42 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/mars/mars").Ma local treks_TES_Dust = { Identifier = "TES_Dust", Name = [[MGS TES, Global Dust]], - FilePath = asset.localResource("MGS_TES/Global_Dust.vrt"), + FilePath = asset.resource("MGS_TES/Global_Dust.vrt"), Description = [[The Thermal Emission Spectrometer (TES) is one of the instruments aboard the Mars Global Surveyor spacecraft. TES is designed to measure the thermal infrared energy (heat) emitted from Mars. This technique, called thermal emission spectroscopy, can tell us much about the geology and atmosphere of Mars. Dust is widespread and abundant across the surface of Mars. However, in the wind-blown environment of Mars, dust accumulates tickly in some areas and is blown clear of other areas. Thick accumulations of dust mask the underlying surface, making measurements of surface composition from orbit difficult or even impossible. Preferred landing site candidates will ideally be relatively dust free. An index of the relative abundance of spectrally obscuring dust across the Martian surface was developed using data from TES. While closely correlated with albedo, the TES dust cover index (DCI) is a more direct metric for the presence or absence of dust on a particular surface and is independent of albedo. This becomes important for the types of light-toned layered deposits and surfaces that likely will be among the candidates for future landing sites. Map resolution/scale: 16ppd/3.5km. Ruff and Christensen, 2002, JGR, VOL. 107, NO. E12, 5127]] } local treks_tes_ruffdust = { Identifier = "tes_ruffdust", Name = [[MGS TES, Global Dust Index]], - FilePath = asset.localResource("MGS_TES/Global_Dust_Index.vrt"), + FilePath = asset.resource("MGS_TES/Global_Dust_Index.vrt"), Description = [[The Thermal Emission Spectrometer (TES) is one of the instruments aboard the Mars Global Surveyor spacecraft. TES is designed to measure the thermal infrared energy (heat) emitted from Mars. This technique, called thermal emission spectroscopy, can tell us much about the geology and atmosphere of Mars. Dust is widespread and abundant across the surface of Mars. However, in the wind-blown environment of Mars, dust accumulates tickly in some areas and is blown clear of other areas. Thick accumulations of dust mask the underlying surface, making measurements of surface composition from orbit difficult or even impossible. Preferred landing site candidates will ideally be relatively dust free. An index of the relative abundance of spectrally obscuring dust across the Martian surface was developed using data from TES. While closely correlated with albedo, the TES dust cover index (DCI) is a more direct metric for the presence or absence of dust on a particular surface and is independent of albedo. This becomes important for the types of light-toned layered deposits and surfaces that likely will be among the candidates for future landing sites. Map resolution/scale: 16ppd/3.5km. Ruff and Christensen, 2002, JGR, VOL. 107, NO. E12, 5127]] } local treks_TES_Clinopyroxene = { Identifier = "TES_Clinopyroxene", Name = [[MGS TES, Global High-Ca Pyroxene Abundance]], - FilePath = asset.localResource("MGS_TES/Global_High-Ca_Pyroxene_Abundance.vrt"), + FilePath = asset.resource("MGS_TES/Global_High-Ca_Pyroxene_Abundance.vrt"), Description = [[The Thermal Emission Spectrometer (TES) is one of the instruments aboard the Mars Global Surveyor spacecraft. TES is designed to measure the thermal infrared energy (heat) emitted from Mars. This technique, called thermal emission spectroscopy, can tell us much about the geology and atmosphere of Mars. A deconvolution method was used to remove atmospheric components and determine surface mineralogy from TES data at 1 pixel per degree (ppd). Minerals were grouped into categories on the basis of compositional and spectral similarity, and global concentration maps were produced. High-Ca pyroxenes are identified in concentrations of 0.10 - 0.20 in equatorial low albedo regions. The highest concentrations are present in Syrtis Major. High-latitude, low-albedo regions are characterized by concentrations of 0 - 0.10. Light regions have 0 - 0.05 high-Ca pyroxene concentrations. Only equatorial low-albedo regions have pyroxene concentrations above the detection limit. Map resolution/scale: 4 ppd/16km. Joshua L. Bandfield, 2002, JGR, VOL. 107, NO. E6, 5042]] } local treks_TES_Plagioclase = { Identifier = "TES_Plagioclase", Name = [[MGS TES, Global Plagioclase Abundance]], - FilePath = asset.localResource("MGS_TES/Global_Plagioclase_Abundance.vrt"), + FilePath = asset.resource("MGS_TES/Global_Plagioclase_Abundance.vrt"), Description = [[The Thermal Emission Spectrometer (TES) is one of the instruments aboard the Mars Global Surveyor spacecraft. TES is designed to measure the thermal infrared energy (heat) emitted from Mars. This technique, called thermal emission spectroscopy, can tell us much about the geology and atmosphere of Mars. A deconvolution method was used to remove atmospheric components and determine surface mineralogy from TES data at 1 pixel per degree (ppd). Minerals were grouped into categories on the basis of compositional and spectral similarity, and global concentration maps were produced. Plagioclase is present in high concentrations in low-albedo regions. High-latitude, low albedo regions have concentrations of 0.05 - 0.15. Equatorial low-albedo regions display concentrations of 0.10 - 0.20 with the highest concentrations in the Syrtis Major region. High-albedo surfaces have plagioclase concentrations of 0 - 0.05, well below the detectable limit. Where there are significant concentrations, average plagioclase compositions are intermediate to calcic. Map resolution/scale: 4 ppd/16km. Joshua L. Bandfield, 2002, JGR, VOL. 107, NO. E6, 5042]] } local treks_TES_Glass_Clay = { Identifier = "TES_Glass_Clay", Name = [[MGS TES, Global Sheet Silicates/High-Si Glass]], - FilePath = asset.localResource("MGS_TES/Global_Sheet_SilicatesHigh-Si_Glass.vrt"), + FilePath = asset.resource("MGS_TES/Global_Sheet_SilicatesHigh-Si_Glass.vrt"), Description = [[The Thermal Emission Spectrometer (TES) is one of the instruments aboard the Mars Global Surveyor spacecraft. TES is designed to measure the thermal infrared energy (heat) emitted from Mars. This technique, called thermal emission spectroscopy, can tell us much about the geology and atmosphere of Mars. A deconvolution method was used to remove atmospheric components and determine surface mineralogy from TES data at 1 pixel per degree (ppd). Minerals were grouped into categories on the basis of compositional and spectral similarity, and global concentration maps were produced. The sheet silicate and high-Si glass map is slightly noisier than the other mineralogy maps. This is likely due to the spectral similarity between the sheet silicate and high-Si glass end-member group and the atmospheric dust spectral shapes. The highest concentrations are located in northern hemisphere low-albedo regions with concentrations of 0.05 - 0.20. High concentrations are also present in several isolated regions south of Solis Planum, southeast of Hellas Basin, and along the edge of the southern polar cap. High albedo regions contain 0 - 0.10 sheet silicate and high-Si glass concentrations. Equatorial and southern hemisphere low-albedo regions typically have concentrations of 0.05 - 0.15 with the exception of some isolated areas. Map resolution/scale: 4 ppd/16km. Joshua L. Bandfield, 2002, JGR, VOL. 107, NO. E6, 5042]] } local treks_TES_Thermal_Inertia = { Identifier = "TES_Thermal_Inertia", Name = [[MGS TES, Global Thermal Inertia]], - FilePath = asset.localResource("MGS_TES/Global_Thermal_Inertia.vrt"), + FilePath = asset.resource("MGS_TES/Global_Thermal_Inertia.vrt"), Description = [[The Thermal Emission Spectrometer (TES) is one of the instruments aboard the Mars Global Surveyor spacecraft. TES is designed to measure the thermal infrared energy (heat) emitted from Mars. This technique, called thermal emission spectroscopy, can tell us much about the geology and atmosphere of Mars. One of the objectives of the MGS TES instrument is the derivation of thermal inertia of the surface at 3-km spatial resolution. Thermal inertia represents the ability of a material to conduct and store heat, and in the context of planetary science, it is a measure of the subsurface's ability to store heat during the day and reradiate it during the night. While compositional differences (ie, mineralogy) will have some effect, for a terrestrial planetary surface such as that of Mars, thermal inertia will depend predominantly on the physical properties of the near surface materials such as particle size, degree of induration (ie, cementation of grains), rock abundance, and exposure of bedrock (rocks will have a much higher thermal inertia than sand or dust - that is, it takes longer to heat rocks up during the day and to cool them off at night). For example, on a visit to the desert you may notice that sandy areas are much hotter at midday than adjacent rocks, and the sand cools off quickly after sunset whereas the rocks remain warm well into the evening. Map resolution/scale: 20 ppd/3km. Putzig et al, 2005, Icarus 173, 325-341]] } diff --git a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MO_THEMIS-IR_Day.asset b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MO_THEMIS-IR_Day.asset index d2740f48c7..45238136bf 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MO_THEMIS-IR_Day.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MO_THEMIS-IR_Day.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/mars/mars").Ma local treks_THEMIS_DayIR_ControlledMosaics_100m_v2_oct2018 = { Identifier = "THEMIS_DayIR_ControlledMosaics_100m_v2_oct2018", Name = [[MO THEMIS-IR Day, Global Mosaic]], - FilePath = asset.localResource("MO_THEMIS-IR_Day/Global_Mosaic.vrt"), + FilePath = asset.resource("MO_THEMIS-IR_Day/Global_Mosaic.vrt"), Description = [[This data was acquired using the Thermal Emission Imaging System instrument aboard NASA's Mars Odyssey spacecraft. Odyssey was launched on April 7, 2001 and arrived at Mars on October 24, 2001. It maintains a polar orbit around Mars with an altitude of about 3,800 km or 2,400 miles. Odyssey's mission includes studying the mineralogy of Mars' surface (especially looking at minerals formed in the presence of water), detecting water and shallow buried ice, and studying the radiation environment. The Thermal Emission Imaging System (THEMIS) instrument is a camera system that gathers data in infrared and visible light. The infrared images sample nine different wavelengths allowing spectra to be constructed and compositions of imaged surfaces to be inferred. Daytime infrared Themis images typically emphasize topography, with warmer sunward slopes being brighter than cooler shaded slopes. Nighttime Themis images emphasize differences in thermal inertia between areas being observed, giving insights into the physical characteristics of the surfaces. This map is a THEMIS daytime infrared map. The 2017 release featured preliminary geodetically controlled mosaics tied to a known coordinate system (USGS Viking Orbiter MDIM 2.1), spatially adjusted to align feature boundaries, and orthoprojected at 100 m/pixel scale. Further adjustments have been processed for the 2018 release of this final mosaic.]] } diff --git a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MO_THEMIS-IR_Night.asset b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MO_THEMIS-IR_Night.asset index 8f92f0682d..ea58be5f16 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MO_THEMIS-IR_Night.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MO_THEMIS-IR_Night.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/mars/mars").Ma local treks_THEMIS_NightIR_ControlledMosaics_100m_v2_oct2018 = { Identifier = "THEMIS_NightIR_ControlledMosaics_100m_v2_oct2018", Name = [[MO THEMIS-IR Night, Global Mosaic]], - FilePath = asset.localResource("MO_THEMIS-IR_Night/Global_Mosaic.vrt"), + FilePath = asset.resource("MO_THEMIS-IR_Night/Global_Mosaic.vrt"), Description = [[This data was acquired using the Thermal Emission Imaging System instrument aboard NASA's Mars Odyssey spacecraft. Odyssey was launched on April 7, 2001 and arrived at Mars on October 24, 2001. It maintains a polar orbit around Mars with an altitude of about 3,800 km or 2,400 miles. Odyssey's mission includes studying the mineralogy of Mars' surface (especially looking at minerals formed in the presence of water), detecting water and shallow buried ice, and studying the radiation environment. The Thermal Emission Imaging System (THEMIS) instrument is a camera system that gathers data in infrared and visible light. The infrared images sample nine different wavelengths allowing spectra to be constructed and compositions of imaged surfaces to be inferred. Daytime infrared Themis images typically emphasize topography, with warmer sunward slopes being brighter than cooler shaded slopes. Nighttime Themis images emphasize differences in thermal inertia between areas being observed, giving insights into the physical characteristics of the surfaces. This map is a THEMIS nighttime infrared map. The 2017 release featured preliminary geodetically controlled mosaics tied to a known coordinate system (USGS Viking Orbiter MDIM 2.1), spatially adjusted to align feature boundaries, and orthoprojected at 100 m/pixel scale. Further adjustments have been processed for the 2018 release of this final mosaic.]] } diff --git a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MRO_CTX.asset b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MRO_CTX.asset index 66362550a2..d96569bee0 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MRO_CTX.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MRO_CTX.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/mars/mars").Ma local treks_b21_017819_2025_xn_22n048w = { Identifier = "b21_017819_2025_xn_22n048w", Name = [[MRO CTX, 22n048w Mosaic]], - FilePath = asset.localResource("MRO_CTX/22n048w_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/22n048w_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -18,7 +18,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Acheron_Fossae_CTX_BlockAdj_dd = { Identifier = "Acheron_Fossae_CTX_BlockAdj_dd", Name = [[MRO CTX, Acheron Fossae Mosaic]], - FilePath = asset.localResource("MRO_CTX/Acheron_Fossae_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Acheron_Fossae_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -27,7 +27,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Acidalia_Plantia_CTX_BlockAdj_dd = { Identifier = "Acidalia_Plantia_CTX_BlockAdj_dd", Name = [[MRO CTX, Acidalia Plantia Mosaic]], - FilePath = asset.localResource("MRO_CTX/Acidalia_Plantia_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Acidalia_Plantia_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -36,7 +36,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Arabia_Terra_CTX_BlockAdj_dd = { Identifier = "Arabia_Terra_CTX_BlockAdj_dd", Name = [[MRO CTX, Arabia Terra Mosaic]], - FilePath = asset.localResource("MRO_CTX/Arabia_Terra_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Arabia_Terra_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -45,7 +45,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Aram_Chaos_CTX_BlockAdj_dd = { Identifier = "Aram_Chaos_CTX_BlockAdj_dd", Name = [[MRO CTX, Aram Chaos Mosaic]], - FilePath = asset.localResource("MRO_CTX/Aram_Chaos_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Aram_Chaos_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -54,7 +54,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Arcadia_CTX_BlockAdj_dd = { Identifier = "Arcadia_CTX_BlockAdj_dd", Name = [[MRO CTX, Arcadia Mosaic]], - FilePath = asset.localResource("MRO_CTX/Arcadia_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Arcadia_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -63,7 +63,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Arcadia_Planitia_CTX_BlockAdj_dd = { Identifier = "Arcadia_Planitia_CTX_BlockAdj_dd", Name = [[MRO CTX, Arcadia Planitia Mosaic]], - FilePath = asset.localResource("MRO_CTX/Arcadia_Planitia_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Arcadia_Planitia_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -72,7 +72,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Ausonia_CTX_BlockAdj_dd = { Identifier = "Ausonia_CTX_BlockAdj_dd", Name = [[MRO CTX, Ausonia Mosaic]], - FilePath = asset.localResource("MRO_CTX/Ausonia_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Ausonia_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -81,7 +81,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Cerberus_CTX_BlockAdj_dd = { Identifier = "Cerberus_CTX_BlockAdj_dd", Name = [[MRO CTX, Cerberus Mosaic]], - FilePath = asset.localResource("MRO_CTX/Cerberus_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Cerberus_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -90,7 +90,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_DEM_1m_ColumbiaHills_fixed = { Identifier = "DEM_1m_ColumbiaHills_fixed", Name = [[MRO CTX, Columbia Hills DEM]], - FilePath = asset.localResource("MRO_CTX/Columbia_Hills_DEM.vrt"), + FilePath = asset.resource("MRO_CTX/Columbia_Hills_DEM.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -99,7 +99,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Columbus_Crater_CTX_BlockAdj_dd = { Identifier = "Columbus_Crater_CTX_BlockAdj_dd", Name = [[MRO CTX, Columbus Crater Mosaic]], - FilePath = asset.localResource("MRO_CTX/Columbus_Crater_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Columbus_Crater_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -108,7 +108,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Copernicus_Crater_CTX_BlockAdj_dd = { Identifier = "Copernicus_Crater_CTX_BlockAdj_dd", Name = [[MRO CTX, Copernicus Crater Mosaic]], - FilePath = asset.localResource("MRO_CTX/Copernicus_Crater_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Copernicus_Crater_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -117,7 +117,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Coprates_EMelas_Chasm_CTX_BlockAdj_dd = { Identifier = "Coprates_EMelas_Chasm_CTX_BlockAdj_dd", Name = [[MRO CTX, Coprates EMelas Chasm Mosaic]], - FilePath = asset.localResource("MRO_CTX/Coprates_EMelas_Chasm_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Coprates_EMelas_Chasm_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -126,7 +126,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_curiosity_ctx_mosaic = { Identifier = "curiosity_ctx_mosaic", Name = [[MRO CTX, Curiosity Roving Site Mosaic]], - FilePath = asset.localResource("MRO_CTX/Curiosity_Roving_Site_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Curiosity_Roving_Site_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -135,7 +135,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Deuteronilus1_2_CTX_BlockAdj_dd = { Identifier = "Deuteronilus1_2_CTX_BlockAdj_dd", Name = [[MRO CTX, Deuteronilus Mensae Mosaic]], - FilePath = asset.localResource("MRO_CTX/Deuteronilus_Mensae_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Deuteronilus_Mensae_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -144,21 +144,21 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_CTX_DEM_East_Melas = { Identifier = "CTX_DEM_East_Melas", Name = [[MRO CTX, East Melas DEM]], - FilePath = asset.localResource("MRO_CTX/East_Melas_DEM.vrt"), + FilePath = asset.resource("MRO_CTX/East_Melas_DEM.vrt"), Description = [[This is a digital elevation model (DEM) for the Eastern Melas Chasma region of Valles Marineris. It is one of the areas identified as a potential Exploration Zone (EZ) for human exploration of Mars. This DEM was generated by combining 9 stereographic pairs of CTX images. Each individual pair was taken of the same area but from different angles. The nine pairs were joined together to cover a broad area of the EZ. This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] } local treks_CTX_Shade_East_Melas = { Identifier = "CTX_Shade_East_Melas", Name = [[MRO CTX, East Melas Hillshade]], - FilePath = asset.localResource("MRO_CTX/East_Melas_Hillshade.vrt"), + FilePath = asset.resource("MRO_CTX/East_Melas_Hillshade.vrt"), Description = [[This is a hillshade rendition of the digital elevation model (DEM) for the Eastern Melas Chasma region of Valles Marineris. It is one of the areas identified as a potential Exploration Zone (EZ) for human exploration of Mars. The hillshade layer is a shaded relief view of the DEM, making it particularly easy to visualize surface topography. The DEM was generated by combining 9 stereographic pairs of CTX images. Each individual pair was taken of the same area but from different angles. The nine pairs were joined together to cover a broad area of the EZ. This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] } local treks_NE_Marineris_Crater_CTX_BlockAdj_dd = { Identifier = "NE_Marineris_Crater_CTX_BlockAdj_dd", Name = [[MRO CTX, Eastern Valles Marineris Mosaic]], - FilePath = asset.localResource("MRO_CTX/Eastern_Valles_Marineris_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Eastern_Valles_Marineris_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -167,7 +167,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_SE_Marineris_CTX_BlockAdj_dd = { Identifier = "SE_Marineris_CTX_BlockAdj_dd", Name = [[MRO CTX, Equatorial Valles Marineries Mosaic]], - FilePath = asset.localResource("MRO_CTX/Equatorial_Valles_Marineries_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Equatorial_Valles_Marineries_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -176,7 +176,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Erebus_Montes_CTX_BlockAdj_dd = { Identifier = "Erebus_Montes_CTX_BlockAdj_dd", Name = [[MRO CTX, Erebus Montes Mosaic]], - FilePath = asset.localResource("MRO_CTX/Erebus_Montes_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Erebus_Montes_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -185,7 +185,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Gale_CTX_BlockAdj_dd = { Identifier = "Gale_CTX_BlockAdj_dd", Name = [[MRO CTX, Gale Crater Mosaic]], - FilePath = asset.localResource("MRO_CTX/Gale_Crater_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Gale_Crater_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -194,7 +194,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Gusev_CTX_BlockAdj_dd = { Identifier = "Gusev_CTX_BlockAdj_dd", Name = [[MRO CTX, Gusev Crater Mosaic]], - FilePath = asset.localResource("MRO_CTX/Gusev_Crater_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Gusev_Crater_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -203,7 +203,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Hadriacus_CTX_BlockAdj_dd = { Identifier = "Hadriacus_CTX_BlockAdj_dd", Name = [[MRO CTX, Hadriacus Mosaic]], - FilePath = asset.localResource("MRO_CTX/Hadriacus_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Hadriacus_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -212,7 +212,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Hale_Crater_CTX_BlockAdj_dd = { Identifier = "Hale_Crater_CTX_BlockAdj_dd", Name = [[MRO CTX, Hale Crater Mosaic]], - FilePath = asset.localResource("MRO_CTX/Hale_Crater_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Hale_Crater_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -221,7 +221,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Hebrus_CTX_BlockAdj_dd = { Identifier = "Hebrus_CTX_BlockAdj_dd", Name = [[MRO CTX, Hebrus Valles Mosaic]], - FilePath = asset.localResource("MRO_CTX/Hebrus_Valles_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Hebrus_Valles_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -230,7 +230,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Hellas_Hellas2_CTX_BlockAdj_dd = { Identifier = "Hellas_Hellas2_CTX_BlockAdj_dd", Name = [[MRO CTX, Hellas Eastern Rim Mosaic]], - FilePath = asset.localResource("MRO_CTX/Hellas_Eastern_Rim_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Hellas_Eastern_Rim_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -239,7 +239,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Hellas3_CTX_BlockAdj_dd = { Identifier = "Hellas3_CTX_BlockAdj_dd", Name = [[MRO CTX, Hellas Mesopotamia Mosaic]], - FilePath = asset.localResource("MRO_CTX/Hellas_Mesopotamia_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Hellas_Mesopotamia_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -248,7 +248,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Huygens_CTX_BlockAdj_dd = { Identifier = "Huygens_CTX_BlockAdj_dd", Name = [[MRO CTX, Huygens Crater Mosaic]], - FilePath = asset.localResource("MRO_CTX/Huygens_Crater_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Huygens_Crater_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -257,7 +257,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Hypanis_Delta_CTX_BlockAdj_dd = { Identifier = "Hypanis_Delta_CTX_BlockAdj_dd", Name = [[MRO CTX, Hypanis Delta Mosaic]], - FilePath = asset.localResource("MRO_CTX/Hypanis_Delta_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Hypanis_Delta_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -266,7 +266,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Ismenius_Cavus_CTX_BlockAdj_dd = { Identifier = "Ismenius_Cavus_CTX_BlockAdj_dd", Name = [[MRO CTX, Ismenius Cavus Mosaic]], - FilePath = asset.localResource("MRO_CTX/Ismenius_Cavus_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Ismenius_Cavus_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -275,7 +275,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Jezero_CTX_BlockAdj_dd = { Identifier = "Jezero_CTX_BlockAdj_dd", Name = [[MRO CTX, Jezero Mosaic, Preliminary]], - FilePath = asset.localResource("MRO_CTX/Jezero_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Jezero_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -284,7 +284,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Kasei_Valles_CTX_BlockAdj_dd = { Identifier = "Kasei_Valles_CTX_BlockAdj_dd", Name = [[MRO CTX, Kasei Valles Mosaic]], - FilePath = asset.localResource("MRO_CTX/Kasei_Valles_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Kasei_Valles_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -293,7 +293,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Mawrth_Valles_CTX_BlockAdj_dd = { Identifier = "Mawrth_Valles_CTX_BlockAdj_dd", Name = [[MRO CTX, Mawrth Vallis Mosaic]], - FilePath = asset.localResource("MRO_CTX/Mawrth_Vallis_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Mawrth_Vallis_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -302,7 +302,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_McLaughlin_Crater_CTX_BlockAdj_dd = { Identifier = "McLaughlin_Crater_CTX_BlockAdj_dd", Name = [[MRO CTX, McLaughlin Crater Mosaic]], - FilePath = asset.localResource("MRO_CTX/McLaughlin_Crater_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/McLaughlin_Crater_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -311,7 +311,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_S_Meridiani_Sinus_Planium_CTX_BlockAdj_dd = { Identifier = "S_Meridiani_Sinus_Planium_CTX_BlockAdj_dd", Name = [[MRO CTX, Meridiani Planum - Sinus Meridiani Mosaic]], - FilePath = asset.localResource("MRO_CTX/Meridiani_Planum_-_Sinus_Meridiani_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Meridiani_Planum_-_Sinus_Meridiani_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -320,7 +320,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_CTX_beta01_uncontrolled_5m_Caltech = { Identifier = "CTX_beta01_uncontrolled_5m_Caltech", Name = [[MRO CTX, Mosaic Global Uncontrolled (Caltech)]], - FilePath = asset.localResource("MRO_CTX/Mosaic_Global_Uncontrolled_Caltech.vrt"), + FilePath = asset.resource("MRO_CTX/Mosaic_Global_Uncontrolled_Caltech.vrt"), Description = [[This is a preliminary uncontrolled Context Camera (CTX) mosaic, called beta01, that the Murray Lab at Caltech has created to (1) generate a list of orbits that will be included in the final mosaic, (2) decipher challenges involved with generating a product of this unprecedented scale, and (3) solicit feedback from the Mars science community for how best to generate the mosaic in a way that helps as diverse a group of scientists as possible. The CTX camera, as managed by Malin Space Science Systems (MSSS), has attained near global coverage of Mars at the scale of ~5 m/pixel. All data used in the construction of this CTX global mosaic have been publicly released and are freely available via the NASA Planetary Data System. The Murray Lab/Caltech grants free use of the beta01 version of the mosaic for all purposes. When used, data credit should be: NASA/JPL/MSSS/The Caltech Murray Lab/Esri. This tiled web service, as hosted by Esri, is made available using lossy Jpeg compression at an 8 bit data range. To access Esri's Tiled Web Service for this mosaic, go to https://usgs.maps.arcgis.com/home/item.html?id=b164957a19544f55a8d6a001c952a590. To download the data, go to http://murray-lab.caltech.edu/CTX/. @@ -332,14 +332,14 @@ Credit: NASA/JPL/MSSS/The Caltech Murray Lab/Esri]] local treks_InSightCTXMosaic_112917 = { Identifier = "InSightCTXMosaic_112917", Name = [[MRO CTX, Mosaic InSight]], - FilePath = asset.localResource("MRO_CTX/Mosaic_InSight.vrt"), + FilePath = asset.resource("MRO_CTX/Mosaic_InSight.vrt"), Description = [[This is a 5m/px CTX orthophoto mosaic of the InSight Landing Site. After being transformed using a spline transformation, each image had the exterior 100m of pixels removed and was detrended by fitting a third order polynomial and subtracting it from each image. All of the detrended images were then mosaiced into a single image and color balanced using Distributed Gradient-Domain processing.]] } local treks_olympus_monseq = { Identifier = "olympus_monseq", Name = [[MRO CTX, Mosaic Olympus Mons]], - FilePath = asset.localResource("MRO_CTX/Mosaic_Olympus_Mons.vrt"), + FilePath = asset.resource("MRO_CTX/Mosaic_Olympus_Mons.vrt"), Description = [[This is a beta section of a CTX global mosaic produced by Jay Dickson. It was created by map projecting CT X images with ISIS3, and color balancing/stitching the images with Adobe Photoshop. A footprint layer shows the seams of image boundaries. @@ -350,7 +350,7 @@ Dickson et al. 2018 LPSC programs with abstracts https://www.hou.usra.edu/meetin local treks_Newton_Crater_CTX_BlockAdj_dd = { Identifier = "Newton_Crater_CTX_BlockAdj_dd", Name = [[MRO CTX, Newton Crater Mosaic]], - FilePath = asset.localResource("MRO_CTX/Newton_Crater_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Newton_Crater_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -359,7 +359,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Noactis_Landing_CTX_BlockAdj_dd = { Identifier = "Noactis_Landing_CTX_BlockAdj_dd", Name = [[MRO CTX, Noctis Landing Mosaic]], - FilePath = asset.localResource("MRO_CTX/Noctis_Landing_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Noctis_Landing_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -368,7 +368,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Protonilus_CTX_BlockAdj_dd = { Identifier = "Protonilus_CTX_BlockAdj_dd", Name = [[MRO CTX, Protonilus Mensae Mosaic]], - FilePath = asset.localResource("MRO_CTX/Protonilus_Mensae_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Protonilus_Mensae_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -377,7 +377,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_S_Nectaris_Fossae_CTX_BlockAdj_dd = { Identifier = "S_Nectaris_Fossae_CTX_BlockAdj_dd", Name = [[MRO CTX, Southern Nectaris Fossae Mosaic]], - FilePath = asset.localResource("MRO_CTX/Southern_Nectaris_Fossae_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Southern_Nectaris_Fossae_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -386,7 +386,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_DEM_1m_VictoriaCrater = { Identifier = "DEM_1m_VictoriaCrater", Name = [[MRO CTX, Victoria Crater DEM]], - FilePath = asset.localResource("MRO_CTX/Victoria_Crater_DEM.vrt"), + FilePath = asset.resource("MRO_CTX/Victoria_Crater_DEM.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -395,7 +395,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Viking_CTX_BlockAdj_dd = { Identifier = "Viking_CTX_BlockAdj_dd", Name = [[MRO CTX, Viking 1 Landing Site Mosaic]], - FilePath = asset.localResource("MRO_CTX/Viking_1_Landing_Site_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Viking_1_Landing_Site_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -404,7 +404,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_b16_015887_2280_xn_48n225w = { Identifier = "b16_015887_2280_xn_48n225w", Name = [[MRO CTX, Viking 2 Landing Site Mosaic]], - FilePath = asset.localResource("MRO_CTX/Viking_2_Landing_Site_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Viking_2_Landing_Site_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -413,7 +413,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_West_Candor_Chasma_longlat = { Identifier = "West_Candor_Chasma_longlat", Name = [[MRO CTX, West Candor Chasma Mosaic]], - FilePath = asset.localResource("MRO_CTX/West_Candor_Chasma_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/West_Candor_Chasma_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -422,7 +422,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_West_Candor_Chasma_DEM_longlat = { Identifier = "West_Candor_Chasma_DEM_longlat", Name = [[MRO CTX, West Candor DEM]], - FilePath = asset.localResource("MRO_CTX/West_Candor_DEM.vrt"), + FilePath = asset.resource("MRO_CTX/West_Candor_DEM.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -431,7 +431,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Noachis_CTX_BlockAdj_dd = { Identifier = "Noachis_CTX_BlockAdj_dd", Name = [[MRO CTX, Western Noachis Terra Mosaic]], - FilePath = asset.localResource("MRO_CTX/Western_Noachis_Terra_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Western_Noachis_Terra_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] @@ -440,7 +440,7 @@ The Context Camera (CTX) provides black-and-white images with resolutions up to local treks_Zephyria_CTX_BlockAdj_dd = { Identifier = "Zephyria_CTX_BlockAdj_dd", Name = [[MRO CTX, Zephyria Planum Mosaic]], - FilePath = asset.localResource("MRO_CTX/Zephyria_Planum_Mosaic.vrt"), + FilePath = asset.resource("MRO_CTX/Zephyria_Planum_Mosaic.vrt"), Description = [[This data was acquired using the Context Camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The Context Camera (CTX) provides black-and-white images with resolutions up to 6 meters/pixel. It provides broader context maps for the higher resolution but narrower fields of view of the HiRISE camera, as well as for other instruments aboard MRO, and is useful for producing mosaicked images of larger areas on Mars' surface.]] diff --git a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MRO_HiRISE.asset b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MRO_HiRISE.asset index cbb6529f34..469d7d5e58 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MRO_HiRISE.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MRO_HiRISE.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/mars/mars").Ma local treks_DTEEC_001918_1735_001984_1735_U01_longlat = { Identifier = "DTEEC_001918_1735_001984_1735_U01_longlat", Name = [[MRO HiRISE, 001918_1735_001984_1735 DEM]], - FilePath = asset.localResource("MRO_HiRISE/001918_1735_001984_1735_DEM.vrt"), + FilePath = asset.resource("MRO_HiRISE/001918_1735_001984_1735_DEM.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] @@ -18,7 +18,7 @@ The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-me local treks_DTEED_042014_1760_042647_1760_A01 = { Identifier = "DTEED_042014_1760_042647_1760_A01", Name = [[MRO HiRISE, 042014_1760_042647_1760 DEM]], - FilePath = asset.localResource("MRO_HiRISE/042014_1760_042647_1760_DEM.vrt"), + FilePath = asset.resource("MRO_HiRISE/042014_1760_042647_1760_DEM.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] @@ -27,7 +27,7 @@ The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-me local treks_DTEED_042753_1930_042252_1930_A01 = { Identifier = "DTEED_042753_1930_042252_1930_A01", Name = [[MRO HiRISE, 042753_1930_042252_1930 DEM]], - FilePath = asset.localResource("MRO_HiRISE/042753_1930_042252_1930_DEM.vrt"), + FilePath = asset.resource("MRO_HiRISE/042753_1930_042252_1930_DEM.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] @@ -36,7 +36,7 @@ The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-me local treks_h1183_0000_da4 = { Identifier = "h1183_0000_da4", Name = [[MRO HiRISE, 1183_0000 DEM]], - FilePath = asset.localResource("MRO_HiRISE/1183_0000_DEM.vrt"), + FilePath = asset.resource("MRO_HiRISE/1183_0000_DEM.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] @@ -45,7 +45,7 @@ The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-me local treks_HiRISE_ColumbiaHills = { Identifier = "HiRISE_ColumbiaHills", Name = [[MRO HiRISE, Columbia Hills Mosaic]], - FilePath = asset.localResource("MRO_HiRISE/Columbia_Hills_Mosaic.vrt"), + FilePath = asset.resource("MRO_HiRISE/Columbia_Hills_Mosaic.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] @@ -54,7 +54,7 @@ The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-me local treks_curiosity_hirise_mosaic = { Identifier = "curiosity_hirise_mosaic", Name = [[MRO HiRISE, Curiosity Roving Site Mosaic]], - FilePath = asset.localResource("MRO_HiRISE/Curiosity_Roving_Site_Mosaic.vrt"), + FilePath = asset.resource("MRO_HiRISE/Curiosity_Roving_Site_Mosaic.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] @@ -63,7 +63,7 @@ The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-me local treks_Gale_DEM_SMG_1m = { Identifier = "Gale_DEM_SMG_1m", Name = [[MRO HiRISE, Gale Crater DEM]], - FilePath = asset.localResource("MRO_HiRISE/Gale_Crater_DEM.vrt"), + FilePath = asset.resource("MRO_HiRISE/Gale_Crater_DEM.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] @@ -72,7 +72,7 @@ The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-me local treks_ESP_042252_1930_RED_B_01_ORTHO = { Identifier = "ESP_042252_1930_RED_B_01_ORTHO", Name = [[MRO HiRISE, Marth Crater West Rim Mosaic]], - FilePath = asset.localResource("MRO_HiRISE/Marth_Crater_West_Rim_Mosaic.vrt"), + FilePath = asset.resource("MRO_HiRISE/Marth_Crater_West_Rim_Mosaic.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] @@ -81,7 +81,7 @@ The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-me local treks_ESP_040776_2115_RED_A_01_ORTHO = { Identifier = "ESP_040776_2115_RED_A_01_ORTHO", Name = [[MRO HiRISE, Martian Ares 3 Landing Site Mosaic]], - FilePath = asset.localResource("MRO_HiRISE/Martian_Ares_3_Landing_Site_Mosaic.vrt"), + FilePath = asset.resource("MRO_HiRISE/Martian_Ares_3_Landing_Site_Mosaic.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] @@ -90,7 +90,7 @@ The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-me local treks_ESP_042647_1760_RED_B_01_ORTHO = { Identifier = "ESP_042647_1760_RED_B_01_ORTHO", Name = [[MRO HiRISE, Martian Ares 4 Landing Site Mosaic]], - FilePath = asset.localResource("MRO_HiRISE/Martian_Ares_4_Landing_Site_Mosaic.vrt"), + FilePath = asset.resource("MRO_HiRISE/Martian_Ares_4_Landing_Site_Mosaic.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] @@ -99,7 +99,7 @@ The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-me local treks_CLH_Visible_Mosaic_HiRISE_CTX_HRSC_GCS_MARS_07102018 = { Identifier = "CLH_Visible_Mosaic_HiRISE_CTX_HRSC_GCS_MARS_07102018", Name = [[MRO HiRISE, Mosaic Columbia Hills]], - FilePath = asset.localResource("MRO_HiRISE/Mosaic_Columbia_Hills.vrt"), + FilePath = asset.resource("MRO_HiRISE/Mosaic_Columbia_Hills.vrt"), Description = [[Preliminary visible orthoimage mosaic for Columbia Hills candidate landing site for the Mars 2020 rover. HRSC orthoimages and DEMs were downloaded from the Planetary Data System archives. HiRISE and CTX orthoimages and DEMs were created by the USGS Astrogeology and HiRISE teams, and compiled and georeferenced at JPL/Caltech by the Advanced Laboratory for Landing Site Terrain Analysis and Reconnaissance (ALLSTAR) group including Nathan Williams, @@ -121,14 +121,14 @@ When analyzing images, please ensure that the correct projection system is being local treks_ESP_058005_1845_RED_spline_rect = { Identifier = "ESP_058005_1845_RED_spline_rect", Name = [[MRO HiRISE, Mosaic Insight Landing Site]], - FilePath = asset.localResource("MRO_HiRISE/Mosaic_Insight_Landing_Site.vrt"), + FilePath = asset.resource("MRO_HiRISE/Mosaic_Insight_Landing_Site.vrt"), Description = [[This image (ESP_058005_1845) was acquired with the Mars HiRISE Camera aboard NASA's Mars Reconnaissance Orbiter. It shows the Mars InSight lander (4.5024°, 135.62345°), heat shield (4.50834°, 135.63481°), and backshell with parachute (4.49415°, 135.62778°). The image was acquired on December 11, 2018 at 14:02 local Mars time. The image is centered at 4.495° lat and 135.623° lon. The spacecraft altitude was 271.5 km. Original image scale range is 27.9 cm/pixel (with 1 x 1 binning) so objects about 84 cm across are resolved. The emission angle was 13.7°, phase angle was 51.0°, and solar incidence angle was 39°, with the Sun about 51° above the horizon. Solar longitude was 304.3°, Northern Winter.]] } local treks_NES_JEZ_MID_Visible_Mosaic_HiRISE_CTX_HRSC_GCS_MARS_07102018 = { Identifier = "NES_JEZ_MID_Visible_Mosaic_HiRISE_CTX_HRSC_GCS_MARS_07102018", Name = [[MRO HiRISE, Mosaic Jezero NE Syrtis Midway]], - FilePath = asset.localResource("MRO_HiRISE/Mosaic_Jezero_NE_Syrtis_Midway.vrt"), + FilePath = asset.resource("MRO_HiRISE/Mosaic_Jezero_NE_Syrtis_Midway.vrt"), Description = [[Preliminary visible orthoimage mosaic for Jezero Crater, NE Syrtis, and Midway candidate landing sites for the Mars 2020 rover. HRSC orthoimages and DEMs were downloaded from the Planetary Data System archives. HiRISE and CTX orthoimages and DEMs were created by the USGS Astrogeology and HiRISE teams, and compiled and georeferenced at JPL/Caltech by the Advanced Laboratory for Landing Site Terrain Analysis and Reconnaissance (ALLSTAR) group including Nathan Williams, @@ -150,14 +150,14 @@ When analyzing images, please ensure that the correct projection system is being local treks_HiRISE_Opportunity = { Identifier = "HiRISE_Opportunity", Name = [[MRO HiRISE, Mosaic Opportunity]], - FilePath = asset.localResource("MRO_HiRISE/Mosaic_Opportunity.vrt"), + FilePath = asset.resource("MRO_HiRISE/Mosaic_Opportunity.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] } local treks_opportunity_hirise_mosaic = { Identifier = "opportunity_hirise_mosaic", Name = [[MRO HiRISE, Opportunity Roving Site Mosaic]], - FilePath = asset.localResource("MRO_HiRISE/Opportunity_Roving_Site_Mosaic.vrt"), + FilePath = asset.resource("MRO_HiRISE/Opportunity_Roving_Site_Mosaic.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] @@ -166,7 +166,7 @@ The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-me local treks_phoenix_hirise_mosaic = { Identifier = "phoenix_hirise_mosaic", Name = [[MRO HiRISE, Phoenix Landing Site Mosaic]], - FilePath = asset.localResource("MRO_HiRISE/Phoenix_Landing_Site_Mosaic.vrt"), + FilePath = asset.resource("MRO_HiRISE/Phoenix_Landing_Site_Mosaic.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] @@ -175,7 +175,7 @@ The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-me local treks_sojourner_hirise_mosaic = { Identifier = "sojourner_hirise_mosaic", Name = [[MRO HiRISE, Sojourner Roving Site Mosaic]], - FilePath = asset.localResource("MRO_HiRISE/Sojourner_Roving_Site_Mosaic.vrt"), + FilePath = asset.resource("MRO_HiRISE/Sojourner_Roving_Site_Mosaic.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] @@ -184,14 +184,14 @@ The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-me local treks_PSP_001918_1735_RED_A_01_ORTHO_longlat = { Identifier = "PSP_001918_1735_RED_A_01_ORTHO_longlat", Name = [[MRO HiRISE, Southwest Candor Chasma Mosaic]], - FilePath = asset.localResource("MRO_HiRISE/Southwest_Candor_Chasma_Mosaic.vrt"), + FilePath = asset.resource("MRO_HiRISE/Southwest_Candor_Chasma_Mosaic.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] } local treks_spirit_hirise_mosaic = { Identifier = "spirit_hirise_mosaic", Name = [[MRO HiRISE, Spirit Roving Site Mosaic]], - FilePath = asset.localResource("MRO_HiRISE/Spirit_Roving_Site_Mosaic.vrt"), + FilePath = asset.resource("MRO_HiRISE/Spirit_Roving_Site_Mosaic.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] @@ -200,7 +200,7 @@ The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-me local treks_PSP_001521_2025_RED = { Identifier = "PSP_001521_2025_RED", Name = [[MRO HiRISE, Viking 1 Landing Site Mosaic]], - FilePath = asset.localResource("MRO_HiRISE/Viking_1_Landing_Site_Mosaic.vrt"), + FilePath = asset.resource("MRO_HiRISE/Viking_1_Landing_Site_Mosaic.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] @@ -209,7 +209,7 @@ The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-me local treks_PSP_001501_2280_RED = { Identifier = "PSP_001501_2280_RED", Name = [[MRO HiRISE, Viking 2 Landing Site Mosaic]], - FilePath = asset.localResource("MRO_HiRISE/Viking_2_Landing_Site_Mosaic.vrt"), + FilePath = asset.resource("MRO_HiRISE/Viking_2_Landing_Site_Mosaic.vrt"), Description = [[This data was acquired using the High Resolution Imaging Science Experiment camera aboard NASA's Mars Reconnaissance Orbiter spacecraft (MRO). MRO was launched on August 12, 2005 and arrived at Mars on March 10, 2006. It maintains a nearly circular orbit, completing an orbital revolution about every 112 minutes at an altitude of approximately 250 to 316 km or 155 to 196 miles. MRO carries a sophisticated suite of instruments used to analyze and map the landforms, stratigraphy, minerals, and ice of Mars. The High Resolution Imaging Science Experiment (HiRISE) camera utilizes a 0.5-meter telescope to obtain very high resolution images of Martian landforms and terrains. From an altitude of 300 km, HiRISE has a resolution of 0.3 meters per pixel. In addition to being used for getting very detailed images of surface features, pairs of slightly offset HiRISE images are combined to produce precise digital elevation models of Martian topography.]] diff --git a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MSL.asset b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MSL.asset index 4423e5fe35..076401270c 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MSL.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/MSL.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/mars/mars").Ma local treks_mars_pahrump_patch_8k_256m = { Identifier = "mars_pahrump_patch_8k_256m", Name = [[MSL, Pahrump Hills]], - FilePath = asset.localResource("MSL/Pahrump_Hills.vrt"), + FilePath = asset.resource("MSL/Pahrump_Hills.vrt"), Description = [[This layer is a greyscale mosaic assembled using data from the High Resolution Stereo Camera aboard the European Space Agency's Mars Express orbiter. HRSC is being used to obtain color and stereo images that will map 100% of Mars' surface at resolution better than 30 m/pixel, and 50% of the surface at better than 15 m/pixel. Each of the nine CCD lines of HRSC, a linescan imager (pushbroom camera), contains 5184 pixels. The channels consist of red, green, blue, near-infrared, three stereo channels (backward, nadir, and forward) and two photometric channels. The digital elevation model used for this layer is a combination of data derived from the HRSC and the Mars Orbiter Laser Altimeter.]] } diff --git a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/Mars_Express_HRSC.asset b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/Mars_Express_HRSC.asset index 18609103be..06f430aece 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/Mars_Express_HRSC.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/Mars_Express_HRSC.asset @@ -9,49 +9,49 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/mars/mars").Ma local treks_HRSC_Martian_east = { Identifier = "HRSC_Martian_east", Name = [[Mars Express HRSC, Martian Path Eastern Section Color Mosaic]], - FilePath = asset.localResource("Mars_Express_HRSC/Martian_Path_Eastern_Section_Color_Mosaic.vrt"), + FilePath = asset.resource("Mars_Express_HRSC/Martian_Path_Eastern_Section_Color_Mosaic.vrt"), Description = [[This layer is a greyscale mosaic assembled using data from the High Resolution Stereo Camera aboard the European Space Agency's Mars Express orbiter. HRSC is being used to obtain color and stereo images that will map 100% of Mars' surface at resolution better than 30 m/pixel, and 50% of the surface at better than 15 m/pixel. Each of the nine CCD lines of HRSC, a linescan imager (pushbroom camera), contains 5184 pixels. The channels consist of red, green, blue, near-infrared, three stereo channels (backward, nadir, and forward) and two photometric channels. The digital elevation model used for this layer is a combination of data derived from the HRSC and the Mars Orbiter Laser Altimeter.]] } local treks_MC11E_HRMOSCO_COL = { Identifier = "MC11E_HRMOSCO_COL", Name = [[Mars Express HRSC, Martian Path MC11 Quad Color Mosaic]], - FilePath = asset.localResource("Mars_Express_HRSC/Martian_Path_MC11_Quad_Color_Mosaic.vrt"), + FilePath = asset.resource("Mars_Express_HRSC/Martian_Path_MC11_Quad_Color_Mosaic.vrt"), Description = [[This layer is a combined color mosaic and 50 meter digital terrain model assembled using data from the High Resolution Stereo Camera (HRSC) aboard the European Space Agency's Mars Express orbiter. It covers the MC-11 quadrangle on Mars. For the purposes of mapping, the United States Geological Survey (USGS) has divided the surface of Mars into 30 quadrangles, labeled MC-1 through MC-30 (MC for Mars Chart). Each of the quadrangles also has a proper name derived from a prominent surface feature within the quadrangle. Much of the story of the Martian takes place within MC-11, also known as Oxia Palus. Fortunately, MC-11 happens to be the first complete quadrangle the European Space Agency produced as an HRSC 50m digital terrain model and image mosaic. HRSC is being used to obtain color and stereo images that will map 100% of Mars' surface at resolution better than 30 m/pixel, and 50% of the surface at better than 15 m/pixel. Each of the nine CCD lines of HRSC, a linescan imager (pushbroom camera), contains 5184 pixels. The channels consist of red, green, blue, near-infrared, three stereo channels (backward, nadir, and forward) and two photometric channels. This mosaic was produced by the Global Topography and Mosaic Generation Task Group of the HRSC-Team by joining nearly 100 contiguous HRSC stereo strips. HRSC data provided by ESA/DLR/FU Berlin and the Mars Express HRSC-Team.]] } local treks_MC11E_HRMOSND_ND5 = { Identifier = "MC11E_HRMOSND_ND5", Name = [[Mars Express HRSC, Martian Path MC11 Quad Mosaic]], - FilePath = asset.localResource("Mars_Express_HRSC/Martian_Path_MC11_Quad_Mosaic.vrt"), + FilePath = asset.resource("Mars_Express_HRSC/Martian_Path_MC11_Quad_Mosaic.vrt"), Description = [[This layer is a combined greyscale mosaic and 50 meter digital terrain model assembled using data from the High Resolution Stereo Camera (HRSC) aboard the European Space Agency's Mars Express orbiter. It covers the MC-11 quadrangle on Mars. For the purposes of mapping, the United States Geological Survey (USGS) has divided the surface of Mars into 30 quadrangles, labeled MC-1 through MC-30 (MC for Mars Chart). Each of the quadrangles also has a proper name derived from a prominent surface feature within the quadrangle. Much of the story of the Martian takes place within MC-11, also known as Oxia Palus. Fortunately, MC-11 happens to be the first complete quadrangle the European Space Agency produced as an HRSC 50m digital terrain model and image mosaic. HRSC is being used to obtain color and stereo images that will map 100% of Mars' surface at resolution better than 30 m/pixel, and 50% of the surface at better than 15 m/pixel. Each of the nine CCD lines of HRSC, a linescan imager (pushbroom camera), contains 5184 pixels. The channels consist of red, green, blue, near-infrared, three stereo channels (backward, nadir, and forward) and two photometric channels. While this mosaic lacks the color information shown in the color mosaic, it does show finer detail. This mosaic was produced by the Global Topography and Mosaic Generation Task Group of the HRSC-Team by joining nearly 100 contiguous HRSC stereo strips. HRSC data provided by ESA/DLR/FU Berlin and the Mars Express HRSC-Team.]] } local treks_hrsc_mawrth_vallis_color = { Identifier = "hrsc_mawrth_vallis_color", Name = [[Mars Express HRSC, Mawrth Vallis Color Mosaic]], - FilePath = asset.localResource("Mars_Express_HRSC/Mawrth_Vallis_Color_Mosaic.vrt"), + FilePath = asset.resource("Mars_Express_HRSC/Mawrth_Vallis_Color_Mosaic.vrt"), Description = [[This layer is a greyscale mosaic assembled using data from the High Resolution Stereo Camera aboard the European Space Agency's Mars Express orbiter. HRSC is being used to obtain color and stereo images that will map 100% of Mars' surface at resolution better than 30 m/pixel, and 50% of the surface at better than 15 m/pixel. Each of the nine CCD lines of HRSC, a linescan imager (pushbroom camera), contains 5184 pixels. The channels consist of red, green, blue, near-infrared, three stereo channels (backward, nadir, and forward) and two photometric channels. The digital elevation model used for this layer is a combination of data derived from the HRSC and the Mars Orbiter Laser Altimeter.]] } local treks_hrsc_mawrth_vallis = { Identifier = "hrsc_mawrth_vallis", Name = [[Mars Express HRSC, Mawrth Vallis Mosaic]], - FilePath = asset.localResource("Mars_Express_HRSC/Mawrth_Vallis_Mosaic.vrt"), + FilePath = asset.resource("Mars_Express_HRSC/Mawrth_Vallis_Mosaic.vrt"), Description = [[This layer is a greyscale mosaic assembled using data from the High Resolution Stereo Camera aboard the European Space Agency's Mars Express orbiter. HRSC is being used to obtain color and stereo images that will map 100% of Mars' surface at resolution better than 30 m/pixel, and 50% of the surface at better than 15 m/pixel. Each of the nine CCD lines of HRSC, a linescan imager (pushbroom camera), contains 5184 pixels. The channels consist of red, green, blue, near-infrared, three stereo channels (backward, nadir, and forward) and two photometric channels. The digital elevation model used for this layer is a combination of data derived from the HRSC and the Mars Orbiter Laser Altimeter.]] } local treks_h2942_0000_nd3 = { Identifier = "h2942_0000_nd3", Name = [[Mars Express HRSC, Viking 1 Landing Site Mosaic]], - FilePath = asset.localResource("Mars_Express_HRSC/Viking_1_Landing_Site_Mosaic.vrt"), + FilePath = asset.resource("Mars_Express_HRSC/Viking_1_Landing_Site_Mosaic.vrt"), Description = [[This layer is a greyscale mosaic assembled using data from the High Resolution Stereo Camera aboard the European Space Agency's Mars Express orbiter. HRSC is being used to obtain color and stereo images that will map 100% of Mars' surface at resolution better than 30 m/pixel, and 50% of the surface at better than 15 m/pixel. Each of the nine CCD lines of HRSC, a linescan imager (pushbroom camera), contains 5184 pixels. The channels consist of red, green, blue, near-infrared, three stereo channels (backward, nadir, and forward) and two photometric channels. The digital elevation model used for this layer is a combination of data derived from the HRSC and the Mars Orbiter Laser Altimeter.]] } local treks_h1394_0000_nd3 = { Identifier = "h1394_0000_nd3", Name = [[Mars Express HRSC, Viking 2 Landing Site Mosaic]], - FilePath = asset.localResource("Mars_Express_HRSC/Viking_2_Landing_Site_Mosaic.vrt"), + FilePath = asset.resource("Mars_Express_HRSC/Viking_2_Landing_Site_Mosaic.vrt"), Description = [[This layer is a greyscale mosaic assembled using data from the High Resolution Stereo Camera aboard the European Space Agency's Mars Express orbiter. HRSC is being used to obtain color and stereo images that will map 100% of Mars' surface at resolution better than 30 m/pixel, and 50% of the surface at better than 15 m/pixel. Each of the nine CCD lines of HRSC, a linescan imager (pushbroom camera), contains 5184 pixels. The channels consist of red, green, blue, near-infrared, three stereo channels (backward, nadir, and forward) and two photometric channels. The digital elevation model used for this layer is a combination of data derived from the HRSC and the Mars Orbiter Laser Altimeter.]] } diff --git a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/Mars_Reconnaissance_Orbiter_CTX.asset b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/Mars_Reconnaissance_Orbiter_CTX.asset index 8a13ebcd68..bcf434effe 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/Mars_Reconnaissance_Orbiter_CTX.asset +++ b/data/assets/scene/solarsystem/planets/mars/layers/nasa-treks/Mars_Reconnaissance_Orbiter_CTX.asset @@ -9,7 +9,7 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/mars/mars").Ma local treks_CTX_ClrSlope_8bit_12S182E_24mp_P22_009609_1674_B02_010453_1675 = { Identifier = "CTX_ClrSlope_8bit_12S182E_24mp_P22_009609_1674_B02_010453_1675", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope Apollinaris 12S182E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Apollinaris_12S182E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Apollinaris_12S182E.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -23,7 +23,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_13S182E_24mp_G15_024127_1673_G16_024483_1673 = { Identifier = "CTX_ClrSlope_8bit_13S182E_24mp_G15_024127_1673_G16_024483_1673", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope Apollinaris 13S182E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Apollinaris_13S182E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Apollinaris_13S182E.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -37,7 +37,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_14S184E_24mp_B01_009886_1658_P21_009385_1658 = { Identifier = "CTX_ClrSlope_8bit_14S184E_24mp_B01_009886_1658_P21_009385_1658", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope Apollinaris 14S184E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Apollinaris_14S184E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Apollinaris_14S184E.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -51,7 +51,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_10S291E_24mp_P22_009684_1699_B02_010396_1699 = { Identifier = "CTX_ClrSlope_8bit_10S291E_24mp_P22_009684_1699_B02_010396_1699", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope Coprates 10S291E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Coprates_10S291E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Coprates_10S291E.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -65,7 +65,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_11S293E_24mp_B09_013231_1696_B11_013732_1690 = { Identifier = "CTX_ClrSlope_8bit_11S293E_24mp_B09_013231_1696_B11_013732_1690", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope Coprates 11S293E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Coprates_11S293E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Coprates_11S293E.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -79,7 +79,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_13S293E_24mp_G07_020879_1669_G09_021657_1665 = { Identifier = "CTX_ClrSlope_8bit_13S293E_24mp_G07_020879_1669_G09_021657_1665", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope Coprates 13S293E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Coprates_13S293E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Coprates_13S293E.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -93,7 +93,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_37N024E_24mp_G05_020203_2178_G22_026994_2170 = { Identifier = "CTX_ClrSlope_8bit_37N024E_24mp_G05_020203_2178_G22_026994_2170", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope Deuteronius 37N024E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Deuteronius_37N024E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Deuteronius_37N024E.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -107,7 +107,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_38N024E_24mp_B17_016168_2181_G16_024594_2181 = { Identifier = "CTX_ClrSlope_8bit_38N024E_24mp_B17_016168_2181_G16_024594_2181", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope Deuteronius 38N024E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Deuteronius_38N024E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Deuteronius_38N024E.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -121,7 +121,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_39N024E_24mp_D15_032875_2196_D15_033165_2196 = { Identifier = "CTX_ClrSlope_8bit_39N024E_24mp_D15_032875_2196_D15_033165_2196", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope Deuteronius 39N024E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Deuteronius_39N024E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Deuteronius_39N024E.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -135,7 +135,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_40N022E_24mp_B18_016656_2206_B18_016801_2206 = { Identifier = "CTX_ClrSlope_8bit_40N022E_24mp_B18_016656_2206_B18_016801_2206", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope Deuteronius 40N024E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Deuteronius_40N024E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_Deuteronius_40N024E.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -149,7 +149,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_11S289E_24mp_F23_044971_1685_F21_043995_1685 = { Identifier = "CTX_ClrSlope_8bit_11S289E_24mp_F23_044971_1685_F21_043995_1685", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope East Melas 11S289E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_11S289E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_11S289E.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -163,7 +163,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_11S291E_24mp_B19_017187_1685_B19_016976_1685 = { Identifier = "CTX_ClrSlope_8bit_11S291E_24mp_B19_017187_1685_B19_016976_1685", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope East Melas 11S291E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_11S291E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_11S291E.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -177,7 +177,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_12S289E_24mp_D01_027446_1678_D01_027723_1677 = { Identifier = "CTX_ClrSlope_8bit_12S289E_24mp_D01_027446_1678_D01_027723_1677", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope East Melas 12S289E_D01]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_12S289E_D01.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_12S289E_D01.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -191,7 +191,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_12S289E_24mp_F18_042927_1681_J02_045749_1694 = { Identifier = "CTX_ClrSlope_8bit_12S289E_24mp_F18_042927_1681_J02_045749_1694", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope East Melas 12S289E_F18]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_12S289E_F18.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_12S289E_F18.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -205,7 +205,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_12S290E_24mp_D18_034250_1676_D21_035450_1674 = { Identifier = "CTX_ClrSlope_8bit_12S290E_24mp_D18_034250_1676_D21_035450_1674", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope East Melas 12S290E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_12S290E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_12S290E.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -219,7 +219,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_12S291E_24mp_F14_041292_1682_F16_041938_1682 = { Identifier = "CTX_ClrSlope_8bit_12S291E_24mp_F14_041292_1682_F16_041938_1682", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope East Melas 12S291E_F14]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_12S291E_F14.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_12S291E_F14.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -233,7 +233,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_12S291E_24mp_F21_043850_1684_F21_043916_1685 = { Identifier = "CTX_ClrSlope_8bit_12S291E_24mp_F21_043850_1684_F21_043916_1685", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope East Melas 12S291E_F21]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_12S291E_F21.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_12S291E_F21.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -247,7 +247,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_12S291E_24mp_J01_045116_1677_J03_046039_1676 = { Identifier = "CTX_ClrSlope_8bit_12S291E_24mp_J01_045116_1677_J03_046039_1676", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope East Melas 12S291E_J01]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_12S291E_J01.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_12S291E_J01.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -261,7 +261,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_13S289E_24mp_D10_031125_1673_D12_031903_1669 = { Identifier = "CTX_ClrSlope_8bit_13S289E_24mp_D10_031125_1673_D12_031903_1669", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope East Melas 13S289E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_13S289E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_13S289E.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -275,7 +275,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_ClrSlope_8bit_16S291E_24mp_D22_035951_1644_F01_036307_1644 = { Identifier = "CTX_ClrSlope_8bit_16S291E_24mp_D22_035951_1644_F01_036307_1644", Name = [[Mars Reconnaissance Orbiter CTX, Color Slope East Melas 16S291E_D22]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_16S291E_D22.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Color_Slope_East_Melas_16S291E_D22.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -289,7 +289,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_Shade_12S182E_24mp_P22_009609_1674_B02_010453_1675 = { Identifier = "CTX_Shade_12S182E_24mp_P22_009609_1674_B02_010453_1675", Name = [[Mars Reconnaissance Orbiter CTX, HillShade Apollinaris 12S182E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Apollinaris_12S182E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Apollinaris_12S182E.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -301,7 +301,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_13S182E_24mp_G15_024127_1673_G16_024483_1673 = { Identifier = "CTX_Shade_13S182E_24mp_G15_024127_1673_G16_024483_1673", Name = [[Mars Reconnaissance Orbiter CTX, HillShade Apollinaris 13S182E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Apollinaris_13S182E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Apollinaris_13S182E.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -313,7 +313,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_14S184E_24mp_B01_009886_1658_P21_009385_1658 = { Identifier = "CTX_Shade_14S184E_24mp_B01_009886_1658_P21_009385_1658", Name = [[Mars Reconnaissance Orbiter CTX, HillShade Apollinaris 14S184E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Apollinaris_14S184E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Apollinaris_14S184E.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -325,7 +325,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_10S291E_24mp_P22_009684_1699_B02_010396_1699 = { Identifier = "CTX_Shade_10S291E_24mp_P22_009684_1699_B02_010396_1699", Name = [[Mars Reconnaissance Orbiter CTX, HillShade Coprates 10S291E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Coprates_10S291E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Coprates_10S291E.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -337,7 +337,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_11S293E_24mp_B09_013231_1696_B11_013732_1690 = { Identifier = "CTX_Shade_11S293E_24mp_B09_013231_1696_B11_013732_1690", Name = [[Mars Reconnaissance Orbiter CTX, HillShade Coprates 11S293E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Coprates_11S293E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Coprates_11S293E.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -349,7 +349,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_13S293E_24mp_G07_020879_1669_G09_021657_1665 = { Identifier = "CTX_Shade_13S293E_24mp_G07_020879_1669_G09_021657_1665", Name = [[Mars Reconnaissance Orbiter CTX, HillShade Coprates 13S293E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Coprates_13S293E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Coprates_13S293E.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -361,7 +361,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_37N024E_24mp_G05_020203_2178_G22_026994_2170 = { Identifier = "CTX_Shade_37N024E_24mp_G05_020203_2178_G22_026994_2170", Name = [[Mars Reconnaissance Orbiter CTX, HillShade Deuteronius 37N024E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Deuteronius_37N024E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Deuteronius_37N024E.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -373,7 +373,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_38N024E_24mp_B17_016168_2181_G16_024594_2181 = { Identifier = "CTX_Shade_38N024E_24mp_B17_016168_2181_G16_024594_2181", Name = [[Mars Reconnaissance Orbiter CTX, HillShade Deuteronius 38N024E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Deuteronius_38N024E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Deuteronius_38N024E.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -385,7 +385,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_39N024E_24mp_D15_032875_2196_D15_033165_2196 = { Identifier = "CTX_Shade_39N024E_24mp_D15_032875_2196_D15_033165_2196", Name = [[Mars Reconnaissance Orbiter CTX, HillShade Deuteronius 39N024E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Deuteronius_39N024E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Deuteronius_39N024E.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -397,7 +397,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_40N022E_24mp_B18_016656_2206_B18_016801_2206 = { Identifier = "CTX_Shade_40N022E_24mp_B18_016656_2206_B18_016801_2206", Name = [[Mars Reconnaissance Orbiter CTX, HillShade Deuteronius 40N024E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Deuteronius_40N024E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_Deuteronius_40N024E.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -409,7 +409,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_11S289E_24mp_F23_044971_1685_F21_043995_1685 = { Identifier = "CTX_Shade_11S289E_24mp_F23_044971_1685_F21_043995_1685", Name = [[Mars Reconnaissance Orbiter CTX, HillShade East Melas 11S289E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_11S289E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_11S289E.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -421,7 +421,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_11S291E_24mp_B19_017187_1685_B19_016976_1685 = { Identifier = "CTX_Shade_11S291E_24mp_B19_017187_1685_B19_016976_1685", Name = [[Mars Reconnaissance Orbiter CTX, HillShade East Melas 11S291E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_11S291E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_11S291E.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -433,7 +433,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_12S289E_24mp_D01_027446_1678_D01_027723_1677 = { Identifier = "CTX_Shade_12S289E_24mp_D01_027446_1678_D01_027723_1677", Name = [[Mars Reconnaissance Orbiter CTX, HillShade East Melas 12S289E_D01]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_12S289E_D01.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_12S289E_D01.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -445,7 +445,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_12S289E_24mp_F18_042927_1681_J02_045749_1694 = { Identifier = "CTX_Shade_12S289E_24mp_F18_042927_1681_J02_045749_1694", Name = [[Mars Reconnaissance Orbiter CTX, HillShade East Melas 12S289E_F18]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_12S289E_F18.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_12S289E_F18.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -457,7 +457,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_12S290E_24mp_D18_034250_1676_D21_035450_1674 = { Identifier = "CTX_Shade_12S290E_24mp_D18_034250_1676_D21_035450_1674", Name = [[Mars Reconnaissance Orbiter CTX, HillShade East Melas 12S290E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_12S290E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_12S290E.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -469,7 +469,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_12S291E_24mp_F14_041292_1682_F16_041938_1682 = { Identifier = "CTX_Shade_12S291E_24mp_F14_041292_1682_F16_041938_1682", Name = [[Mars Reconnaissance Orbiter CTX, HillShade East Melas 12S291E_F14]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_12S291E_F14.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_12S291E_F14.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -481,7 +481,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_12S291E_24mp_F21_043850_1684_F21_043916_1685 = { Identifier = "CTX_Shade_12S291E_24mp_F21_043850_1684_F21_043916_1685", Name = [[Mars Reconnaissance Orbiter CTX, HillShade East Melas 12S291E_F21]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_12S291E_F21.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_12S291E_F21.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -493,7 +493,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_12S291E_24mp_J01_045116_1677_J03_046039_1676 = { Identifier = "CTX_Shade_12S291E_24mp_J01_045116_1677_J03_046039_1676", Name = [[Mars Reconnaissance Orbiter CTX, HillShade East Melas 12S291E_J01]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_12S291E_J01.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_12S291E_J01.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -505,7 +505,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_13S289E_24mp_D10_031125_1673_D12_031903_1669 = { Identifier = "CTX_Shade_13S289E_24mp_D10_031125_1673_D12_031903_1669", Name = [[Mars Reconnaissance Orbiter CTX, HillShade East Melas 13S289E_D10]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_13S289E_D10.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_13S289E_D10.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -517,7 +517,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Shade_16S291E_24mp_D22_035951_1644_F01_036307_1644 = { Identifier = "CTX_Shade_16S291E_24mp_D22_035951_1644_F01_036307_1644", Name = [[Mars Reconnaissance Orbiter CTX, HillShade East Melas 16S291E_D22]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_16S291E_D22.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/HillShade_East_Melas_16S291E_D22.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -529,7 +529,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_Deuteronilus_CTX_Shade_v0_20171112 = { Identifier = "Deuteronilus_CTX_Shade_v0_20171112", Name = [[Mars Reconnaissance Orbiter CTX, Hilllshade Deuteronilus]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Hilllshade_Deuteronilus.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Hilllshade_Deuteronilus.vrt"), Description = [[This is a grayscale shaded relief (hillshade) for the original digital elevation model (DEM/DTM) as produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -541,7 +541,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_12S182E_24mp_P22_009609_1674 = { Identifier = "CTX_Ortho_12S182E_24mp_P22_009609_1674", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic Apollinaris 12S182E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Apollinaris_12S182E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Apollinaris_12S182E.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -553,7 +553,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_13S182E_24mp_G15_024127_1673 = { Identifier = "CTX_Ortho_13S182E_24mp_G15_024127_1673", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic Apollinaris 13S182E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Apollinaris_13S182E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Apollinaris_13S182E.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -565,7 +565,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_14S184E_24mp_B01_009886_1658 = { Identifier = "CTX_Ortho_14S184E_24mp_B01_009886_1658", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic Apollinaris 14S184E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Apollinaris_14S184E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Apollinaris_14S184E.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -577,7 +577,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_10S291E_24mp_P22_009684_1699 = { Identifier = "CTX_Ortho_10S291E_24mp_P22_009684_1699", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic Coprates 10S291E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Coprates_10S291E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Coprates_10S291E.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -589,7 +589,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_11S293E_24mp_B09_013231_1696 = { Identifier = "CTX_Ortho_11S293E_24mp_B09_013231_1696", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic Coprates 11S293E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Coprates_11S293E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Coprates_11S293E.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -601,7 +601,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_13S293E_24mp_G07_020879_1669 = { Identifier = "CTX_Ortho_13S293E_24mp_G07_020879_1669", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic Coprates 13S293E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Coprates_13S293E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Coprates_13S293E.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -613,7 +613,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_38N024E_6mp_B17_016168_2181 = { Identifier = "CTX_Ortho_38N024E_6mp_B17_016168_2181", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic Deuteronius 38N024E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Deuteronius_38N024E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Deuteronius_38N024E.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -625,7 +625,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_39N024E_6mp_D15_032875_2196 = { Identifier = "CTX_Ortho_39N024E_6mp_D15_032875_2196", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic Deuteronius 39N024E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Deuteronius_39N024E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Deuteronius_39N024E.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -637,7 +637,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_40N022E_6mp_B18_016656_2206 = { Identifier = "CTX_Ortho_40N022E_6mp_B18_016656_2206", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic Deuteronius 40N024E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Deuteronius_40N024E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_Deuteronius_40N024E.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -649,7 +649,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_11S289E_6mp_F23_044971_1685 = { Identifier = "CTX_Ortho_11S289E_6mp_F23_044971_1685", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic East Melas 11S289E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_11S289E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_11S289E.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -661,7 +661,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_11S291E_6mp_B19_017187_1685 = { Identifier = "CTX_Ortho_11S291E_6mp_B19_017187_1685", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic East Melas 11S291E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_11S291E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_11S291E.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -673,7 +673,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_12S289E_6mp_D01_027446_1678 = { Identifier = "CTX_Ortho_12S289E_6mp_D01_027446_1678", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic East Melas 12S289E_D01]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_12S289E_D01.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_12S289E_D01.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -685,7 +685,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_12S289E_6mp_F18_042927_1681 = { Identifier = "CTX_Ortho_12S289E_6mp_F18_042927_1681", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic East Melas 12S289E_F18]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_12S289E_F18.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_12S289E_F18.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -697,7 +697,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_12S290E_6mp_D18_034250_1676 = { Identifier = "CTX_Ortho_12S290E_6mp_D18_034250_1676", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic East Melas 12S290E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_12S290E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_12S290E.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -709,7 +709,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_F14_041292_1682_map_ba_align_6_fill500DRG = { Identifier = "F14_041292_1682_map_ba_align_6_fill500DRG", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic East Melas 12S291E_F14]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_12S291E_F14.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_12S291E_F14.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -721,7 +721,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_12S291E_6mp_F21_043850_1684 = { Identifier = "CTX_Ortho_12S291E_6mp_F21_043850_1684", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic East Melas 12S291E_F21]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_12S291E_F21.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_12S291E_F21.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -733,7 +733,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_12S291E_6mp_J01_045116_1677 = { Identifier = "CTX_Ortho_12S291E_6mp_J01_045116_1677", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic East Melas 12S291E_J01]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_12S291E_J01.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_12S291E_J01.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -745,7 +745,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_13S289E_6mp_D10_031125_1673 = { Identifier = "CTX_Ortho_13S289E_6mp_D10_031125_1673", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic East Melas 13S289E_D10]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_13S289E_D10.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_13S289E_D10.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -757,7 +757,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Ortho_16S291E_6mp_D22_035951_1644 = { Identifier = "CTX_Ortho_16S291E_6mp_D22_035951_1644", Name = [[Mars Reconnaissance Orbiter CTX, Mosaic East Melas 16S291E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_16S291E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Mosaic_East_Melas_16S291E.vrt"), Description = [[This is a CTX orthorectified image, geometrically corrected using its own source digital elevation model (DEM/DTM), as produced as part of an effort to characterize candidate Human Exploration Zones for Mars. The original DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). The DEM, and thus orthoimage, has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -769,7 +769,7 @@ Mayer, D. P., E. S. Kite, 2016, An Integrated Workflow for Producing Digital Ter local treks_CTX_Slope_12S182E_24mp_P22_009609_1674_B02_010453_1675 = { Identifier = "CTX_Slope_12S182E_24mp_P22_009609_1674_B02_010453_1675", Name = [[Mars Reconnaissance Orbiter CTX, Slope Apollinaris 12S182E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Slope_Apollinaris_12S182E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Slope_Apollinaris_12S182E.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -783,7 +783,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_Slope_13S182E_24mp_G15_024127_1673_G16_024483_1673 = { Identifier = "CTX_Slope_13S182E_24mp_G15_024127_1673_G16_024483_1673", Name = [[Mars Reconnaissance Orbiter CTX, Slope Apollinaris 13S182E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Slope_Apollinaris_13S182E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Slope_Apollinaris_13S182E.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: @@ -797,7 +797,7 @@ Slopes were derived using the Python script called gdal_baseline_slope.py: https local treks_CTX_Slope_14S184E_24mp_B01_009886_1658_P21_009385_1658 = { Identifier = "CTX_Slope_14S184E_24mp_B01_009886_1658_P21_009385_1658", Name = [[Mars Reconnaissance Orbiter CTX, Slope Apollinaris 14S184E]], - FilePath = asset.localResource("Mars_Reconnaissance_Orbiter_CTX/Slope_Apollinaris_14S184E.vrt"), + FilePath = asset.resource("Mars_Reconnaissance_Orbiter_CTX/Slope_Apollinaris_14S184E.vrt"), Description = [[This is a colorized version of the original 2x2 pixel slope in degrees (also called a 1 baseline slope). This was produced as part of an effort to characterize topography within candidate Human Exploration Zones for Mars. The DEM was constructed from a pair of CTX images using the stereo photogrammetry software AMES Stereo Pipeline (ASP). THe DEM has been tied to MOLA and can be considered resarch- and visualization-ready. Because it has not been manually edited using a full 3D editing environment, ASP DEMs cannot currently be considered true engineering-ready for performing landings. References: diff --git a/data/assets/scene/solarsystem/planets/mars/mars.asset b/data/assets/scene/solarsystem/planets/mars/mars.asset index 1ae86ee846..6f25b031d1 100644 --- a/data/assets/scene/solarsystem/planets/mars/mars.asset +++ b/data/assets/scene/solarsystem/planets/mars/mars.asset @@ -4,7 +4,7 @@ local transforms = asset.require("./transforms") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Mars Labels", Type = "HttpSynchronization", Identifier = "mars_labels", diff --git a/data/assets/scene/solarsystem/planets/mars/moons/deimos.asset b/data/assets/scene/solarsystem/planets/mars/moons/deimos.asset index b1b383ab17..0c30512f58 100644 --- a/data/assets/scene/solarsystem/planets/mars/moons/deimos.asset +++ b/data/assets/scene/solarsystem/planets/mars/moons/deimos.asset @@ -4,14 +4,14 @@ local sun = asset.require("scene/solarsystem/sun/sun") -local model = asset.syncedResource({ +local model = asset.resource({ Name = "Deimos Model", Type = "HttpSynchronization", Identifier = "deimos_model", Version = 1 }) -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Mars Spice Kernels", Type = "HttpSynchronization", Identifier = "mars_kernels", diff --git a/data/assets/scene/solarsystem/planets/mars/moons/deimos_globe.asset b/data/assets/scene/solarsystem/planets/mars/moons/deimos_globe.asset index ceb6eaa5c4..2c63a40743 100644 --- a/data/assets/scene/solarsystem/planets/mars/moons/deimos_globe.asset +++ b/data/assets/scene/solarsystem/planets/mars/moons/deimos_globe.asset @@ -2,7 +2,7 @@ local transforms = asset.require("../transforms") -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Mars Spice Kernels", Type = "HttpSynchronization", Identifier = "mars_kernels", diff --git a/data/assets/scene/solarsystem/planets/mars/moons/phobos.asset b/data/assets/scene/solarsystem/planets/mars/moons/phobos.asset index c26d2a2ad5..722dd5c975 100644 --- a/data/assets/scene/solarsystem/planets/mars/moons/phobos.asset +++ b/data/assets/scene/solarsystem/planets/mars/moons/phobos.asset @@ -4,14 +4,14 @@ local sun = asset.require("scene/solarsystem/sun/sun") -local model = asset.syncedResource({ +local model = asset.resource({ Name = "Phobos Model", Type = "HttpSynchronization", Identifier = "phobos_model", Version = 1 }) -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Mars Spice Kernels", Type = "HttpSynchronization", Identifier = "mars_kernels", diff --git a/data/assets/scene/solarsystem/planets/mars/moons/phobos_globe.asset b/data/assets/scene/solarsystem/planets/mars/moons/phobos_globe.asset index e8bfc26a0d..84623a9151 100644 --- a/data/assets/scene/solarsystem/planets/mars/moons/phobos_globe.asset +++ b/data/assets/scene/solarsystem/planets/mars/moons/phobos_globe.asset @@ -2,7 +2,7 @@ local transforms = asset.require("../transforms") -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Mars Spice Kernels", Type = "HttpSynchronization", Identifier = "mars_kernels", diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/alsimap_02122015.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/alsimap_02122015.asset index e27c699f95..42e3405ce4 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/alsimap_02122015.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/alsimap_02122015.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../mercury") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Mercury Textures", Type = "HttpSynchronization", Identifier = "mercury_abundance_textures", diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/casimap_02122015.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/casimap_02122015.asset index dc5e3e71c7..8021eea9cf 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/casimap_02122015.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/casimap_02122015.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../mercury") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Mercury Textures", Type = "HttpSynchronization", Identifier = "mercury_abundance_textures", diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/fesimap_02122015.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/fesimap_02122015.asset index fb397287a7..deb23dad40 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/fesimap_02122015.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/fesimap_02122015.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../mercury") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Mercury Textures", Type = "HttpSynchronization", Identifier = "mercury_abundance_textures", diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/mercury_texture.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/mercury_texture.asset index 363bef5186..499c73e013 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/mercury_texture.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/mercury_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../mercury") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Mercury Textures", Type = "HttpSynchronization", Identifier = "mercury_textures", diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_newyork.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_newyork.asset index 72cbc12107..67263d4464 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_newyork.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_BDR_NewYork", Name = "Messenger BDR [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_bdr_newyork.wms"), + FilePath = asset.resource("messenger_bdr_newyork.wms"), TilePixelSize = 360, Description = [[The Map Projected Basemap RDR (BDR) data set consists of a global monochrome map of reflectance at a resolution of 256 pixels per degree (~166 m/p). diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_sweden.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_sweden.asset index 3e6e91190b..521eddf06b 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_sweden.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_BDR_Sweden", Name = "Messenger BDR [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_bdr_sweden.wms"), + FilePath = asset.resource("messenger_bdr_sweden.wms"), TilePixelSize = 360, Description = [[The Map Projected Basemap RDR (BDR) data set consists of a global monochrome map of reflectance at a resolution of 256 pixels per degree (~166 m/p). diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_utah.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_utah.asset index cdceb42207..5d31e934e2 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_utah.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_BDR_Utah", Name = "Messenger BDR [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_bdr_utah.wms"), + FilePath = asset.resource("messenger_bdr_utah.wms"), TilePixelSize = 360, Description = [[The Map Projected Basemap RDR (BDR) data set consists of a global monochrome map of reflectance at a resolution of 256 pixels per degree (~166 m/p). diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_newyork.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_newyork.asset index 15453f5a02..5e2b5b9bc9 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_newyork.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_HIE_NewYork", Name = "Messenger HIE [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_hie_newyork.wms") + FilePath = asset.resource("messenger_hie_newyork.wms") } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_sweden.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_sweden.asset index 15888a81ec..4f78dd33ac 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_sweden.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_HIE_Sweden", Name = "Messenger HIE [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_hie_sweden.wms") + FilePath = asset.resource("messenger_hie_sweden.wms") } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_utah.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_utah.asset index 014e5b07b7..f7576fdbc8 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_utah.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_HIE_Utah", Name = "Messenger HIE [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_hie_utah.wms") + FilePath = asset.resource("messenger_hie_utah.wms") } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_newyork.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_newyork.asset index 93797ac107..2fcdaeda8f 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_newyork.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_HIW_NewYork", Name = "Messenger HIW [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_hiw_newyork.wms") + FilePath = asset.resource("messenger_hiw_newyork.wms") } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_sweden.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_sweden.asset index 9a70a4a628..18ef239562 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_sweden.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_HIW_Sweden", Name = "Messenger HIW [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_hiw_sweden.wms") + FilePath = asset.resource("messenger_hiw_sweden.wms") } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_utah.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_utah.asset index 17eaaed762..1942be658b 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_utah.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_HIW_Utah", Name = "Messenger HIW [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_hiw_utah.wms") + FilePath = asset.resource("messenger_hiw_utah.wms") } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_newyork.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_newyork.asset index 0d100c0d6a..d7cdc01fe0 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_newyork.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_LOI_NewYork", Name = "Messenger LOI [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_loi_newyork.wms") + FilePath = asset.resource("messenger_loi_newyork.wms") } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_sweden.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_sweden.asset index 30d3a78057..6bcb79dd88 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_sweden.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_LOI_Sweden", Name = "Messenger LOI [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_loi_sweden.wms") + FilePath = asset.resource("messenger_loi_sweden.wms") } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_utah.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_utah.asset index 5675282a4a..befeeeb9c6 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_utah.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_LOI_Utah", Name = "Messenger LOI [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_loi_utah.wms") + FilePath = asset.resource("messenger_loi_utah.wms") } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_newyork.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_newyork.asset index 0487181d7e..7a92448daa 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_newyork.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_MDIS_NewYork", Name = "Messenger MDIS [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_mdis_newyork.wms"), + FilePath = asset.resource("messenger_mdis_newyork.wms"), Description = [[This May 2013 basemap is a combination of the following mosaics; (1) The 2013-05-10 version of the monochrome global mosaic, made from Applied Coherent Technology (ACT) Corporation tiles, (2) An average north polar mosaic from 90N to 82.5N, diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_sweden.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_sweden.asset index 2237e17076..d65e4b7471 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_sweden.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_MDIS_Sweden", Name = "Messenger MDIS [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_mdis_sweden.wms"), + FilePath = asset.resource("messenger_mdis_sweden.wms"), Description = [[This May 2013 basemap is a combination of the following mosaics; (1) The 2013-05-10 version of the monochrome global mosaic, made from Applied Coherent Technology (ACT) Corporation tiles, (2) An average north polar mosaic from 90N to 82.5N, diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_utah.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_utah.asset index 67b6009903..db7bca90ec 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_utah.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_MDIS_Utah", Name = "Messenger MDIS [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_mdis_utah.wms"), + FilePath = asset.resource("messenger_mdis_utah.wms"), Description = [[This May 2013 basemap is a combination of the following mosaics; (1) The 2013-05-10 version of the monochrome global mosaic, made from Applied Coherent Technology (ACT) Corporation tiles, (2) An average north polar mosaic from 90N to 82.5N, diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdr_utah.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdr_utah.asset index 2dfcb6222b..57e05220a3 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdr_utah.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdr_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_MDR_Utah", Name = "Messenger MDR [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_mdr_utah.wms") + FilePath = asset.resource("messenger_mdr_utah.wms") } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_newyork.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_newyork.asset index 6418f9a6c6..b4e5dca288 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_newyork.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_Mosaic2_NewYork", Name = "Messenger Mosaic2 [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_mosaic2_newyork.wms") + FilePath = asset.resource("messenger_mosaic2_newyork.wms") } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_sweden.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_sweden.asset index d568d7a4ce..600f13eb81 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_sweden.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_Mosaic2_Sweden", Name = "Messenger Mosaic2 [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_mosaic2_sweden.wms") + FilePath = asset.resource("messenger_mosaic2_sweden.wms") } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_utah.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_utah.asset index f2e53e59fc..19d6d6f797 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_utah.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_Mosaic2_Utah", Name = "Messenger Mosaic2 [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_mosaic2_utah.wms") + FilePath = asset.resource("messenger_mosaic2_utah.wms") } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_newyork.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_newyork.asset index 7f71d22800..c48f3ede53 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_newyork.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_Mosaic_NewYork", Name = "Messenger Mosaic [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_mosaic_newyork.wms") + FilePath = asset.resource("messenger_mosaic_newyork.wms") } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_sweden.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_sweden.asset index 9c4e6d6643..a86565b630 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_sweden.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_Mosaic_Sweden", Name = "Messenger Mosaic [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_mosaic_sweden.wms") + FilePath = asset.resource("messenger_mosaic_sweden.wms") } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_utah.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_utah.asset index 1c40788bc0..7c2ded983f 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_utah.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_Mosaic_Utah", Name = "Messenger Mosaic [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_mosaic_utah.wms") + FilePath = asset.resource("messenger_mosaic_utah.wms") } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mp3_utah.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mp3_utah.asset index c1fdab7108..40d072c688 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mp3_utah.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mp3_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_MP3_Utah", Name = "Messenger MP3 [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_mp3_utah.wms") + FilePath = asset.resource("messenger_mp3_utah.wms") } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_newyork.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_newyork.asset index 2fbb37357e..1ad76bca02 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_newyork.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_SHADE_NewYork", Name = "Messenger SHADE [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_shade_newyork.wms"), + FilePath = asset.resource("messenger_shade_newyork.wms"), Settings = { Gamma = 1.33, Multiplier = 1.15 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_sweden.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_sweden.asset index 61c8169d8e..e1bb4260f8 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_sweden.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_SHADE_Sweden", Name = "Messenger SHADE [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_shade_sweden.wms"), + FilePath = asset.resource("messenger_shade_sweden.wms"), Settings = { Gamma = 1.33, Multiplier = 1.15 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_utah.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_utah.asset index d213ca77ea..01cc5a9d1a 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_utah.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Messenger_SHADE_Utah", Name = "Messenger SHADE [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_shade_utah.wms"), + FilePath = asset.resource("messenger_shade_utah.wms"), Settings = { Gamma = 1.33, Multiplier = 1.15 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/mgsimap_02122015.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/mgsimap_02122015.asset index f83de8ebad..35fff60e83 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/mgsimap_02122015.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/mgsimap_02122015.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../mercury") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Mercury Textures", Type = "HttpSynchronization", Identifier = "mercury_abundance_textures", diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/ssimap_02122015.asset b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/ssimap_02122015.asset index 52f6cc4076..fb5cb61f04 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/ssimap_02122015.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/ssimap_02122015.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../mercury") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Mercury Textures", Type = "HttpSynchronization", Identifier = "mercury_abundance_textures", diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/heightlayers/messenger_dem_utah.asset b/data/assets/scene/solarsystem/planets/mercury/layers/heightlayers/messenger_dem_utah.asset index 00a172afda..05e9d1276e 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/heightlayers/messenger_dem_utah.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/heightlayers/messenger_dem_utah.asset @@ -4,7 +4,7 @@ local Layer = { Identifier = "Messenger_DEM_Utah", Name = "Messenger DEM [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("messenger_dem_utah.wms"), + FilePath = asset.resource("messenger_dem_utah.wms"), Settings = { Gamma = 1.59, Multiplier = 1.38 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/nasa-treks/MSGR_MDIS.asset b/data/assets/scene/solarsystem/planets/mercury/layers/nasa-treks/MSGR_MDIS.asset index b45e33a0cc..ab0423cc61 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/nasa-treks/MSGR_MDIS.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/nasa-treks/MSGR_MDIS.asset @@ -9,21 +9,21 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/mercury/mercur local treks_Mercury_Messenger_USGS_DEM_665m_v2_HillshadeColor = { Identifier = "Mercury_Messenger_USGS_DEM_665m_v2_HillshadeColor", Name = [[MSGR MDIS, ColorHillshade Global]], - FilePath = asset.localResource("MSGR_MDIS/ColorHillshade_Global.vrt"), + FilePath = asset.resource("MSGR_MDIS/ColorHillshade_Global.vrt"), Description = [[This is a colorized shaded-relief generated from the USGS Astrogeology Science Center's Mercury MESSENGER Global DEM 665m v2 data product providing global coverage of Mercury. This color hillshade was generated in ArcPro with the shaded-relief raster function. The resolution of the original DEM used to create this product is 64 pixels/degree (665 m/pixel). The control network used for registration contains tie points that are sample/line coordinates with geometric locations (derived from SPICE) that are automatically measured across the overlapping image areas. Elevation values are in meters and referred to a radius of 2439400m. The legend conveys the mapping colors to elevation values (meters).]] } local treks_Mercury_Messenger_USGS_DEM_665m_v2_Hillshade = { Identifier = "Mercury_Messenger_USGS_DEM_665m_v2_Hillshade", Name = [[MSGR MDIS, Hillshade Global]], - FilePath = asset.localResource("MSGR_MDIS/Hillshade_Global.vrt"), + FilePath = asset.resource("MSGR_MDIS/Hillshade_Global.vrt"), Description = [[This is a shaded-relief generated from the USGS Astrogeology Science Center's Mercury MESSENGER Global DEM 665m v2 data product providing global coverage of Mercury. This shaded-relief data product was generated in ArcPro with the hillshade raster function. The resolution of the original DEM used to create this product is 64 pixels/degree (665 m/pixel). The control network used for registration contains tie points that are sample/line coordinates with geometric locations (derived from SPICE) that are automatically measured across the overlapping image areas. Elevation values are in meters and referred to a radius of 2439400m.]] } local treks_Mercury_Messenger_USGS_DEM_665m_v2_SlopeColor = { Identifier = "Mercury_Messenger_USGS_DEM_665m_v2_SlopeColor", Name = [[MSGR MDIS, Slope Colorized Global]], - FilePath = asset.localResource("MSGR_MDIS/Slope_Colorized_Global.vrt"), + FilePath = asset.resource("MSGR_MDIS/Slope_Colorized_Global.vrt"), Description = [[This is a colorized slope data product of the USGS Astrogeology Science Center's Mercury MESSENGER Global DEM 665m v2 data product providing global coverage of Mercury. This slope data product was generated in ArcMap with the slope spatial analysis tool. The resolution of this product is 64 pixels/degree (665 m/pixel). The control network used for registration contains tie points that are sample/line coordinates with geometric locations (derived from SPICE) that are automatically measured across the overlapping image areas. Slope values are in degrees and referred to a radius of 2439400m. Slope values range from a minimum value of 0 to a maximum value of 71.0409. The legend conveys the mapping colors to slope values (degrees).]] } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/nasa-treks/MSGR_MDIS_Mosaic.asset b/data/assets/scene/solarsystem/planets/mercury/layers/nasa-treks/MSGR_MDIS_Mosaic.asset index 36c95e6edb..2af7a78ceb 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/nasa-treks/MSGR_MDIS_Mosaic.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/nasa-treks/MSGR_MDIS_Mosaic.asset @@ -9,70 +9,70 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/mercury/mercur local treks_MSGR_Aksakov_Crater_Peak_Ring_Ortho_29m = { Identifier = "MSGR_Aksakov_Crater_Peak_Ring_Ortho_29m", Name = [[MSGR MDIS Mosaic, Aksakov Crater Peak Ring]], - FilePath = asset.localResource("MSGR_MDIS_Mosaic/Aksakov_Crater_Peak_Ring.vrt"), + FilePath = asset.resource("MSGR_MDIS_Mosaic/Aksakov_Crater_Peak_Ring.vrt"), Description = [[This is a visible orthoimage for the Aksakov Crater Peak Ring region on Mercury. This data product class of this data is observational and has been constructed to examine the visible and topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. The visible image has been orthorectified using a digital elevation model (DEM) created from Mercury Dual Imaging System (MDIS) stereo pair images. The DEM used to generate the orthoimage has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. The orthoimage was then projected onto the DEM and exported. This ortho image has been generated at a resolution of 29m/pixel.]] } local treks_MSGR_near_Dali_Crater_Ortho_20m = { Identifier = "MSGR_near_Dali_Crater_Ortho_20m", Name = [[MSGR MDIS Mosaic, Crater near Dali Crater]], - FilePath = asset.localResource("MSGR_MDIS_Mosaic/Crater_near_Dali_Crater.vrt"), + FilePath = asset.resource("MSGR_MDIS_Mosaic/Crater_near_Dali_Crater.vrt"), Description = [[This is a visible orthoimage for the Crater Near Dali Crater region on Mercury. This data product class of this data is observational and has been constructed to examine the visible and topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. The visible image has been orthorectified using a digital elevation model (DEM) created from Mercury Dual Imaging System (MDIS) stereo pair images. The DEM used to generate the orthoimage has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. The orthoimage was then projected onto the DEM and exported. This ortho image has been generated at a resolution of 20m/pixel.]] } local treks_MSGR_near_Geddes_Crater_Ortho_33m = { Identifier = "MSGR_near_Geddes_Crater_Ortho_33m", Name = [[MSGR MDIS Mosaic, Crater near Geddes Crater]], - FilePath = asset.localResource("MSGR_MDIS_Mosaic/Crater_near_Geddes_Crater.vrt"), + FilePath = asset.resource("MSGR_MDIS_Mosaic/Crater_near_Geddes_Crater.vrt"), Description = [[This is a visible orthoimage for the Crater Near Geddes Crater region on Mercury. This data product class of this data is observational and has been constructed to examine the visible and topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. The visible image has been orthorectified using a digital elevation model (DEM) created from Mercury Dual Imaging System (MDIS) stereo pair images. The DEM used to generate the orthoimage has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. The orthoimage was then projected onto the DEM and exported. This ortho image has been generated at a resolution of 33m/pixel.]] } local treks_MSGR_Degas_Crater_Ortho_30m = { Identifier = "MSGR_Degas_Crater_Ortho_30m", Name = [[MSGR MDIS Mosaic, Degas Crater]], - FilePath = asset.localResource("MSGR_MDIS_Mosaic/Degas_Crater.vrt"), + FilePath = asset.resource("MSGR_MDIS_Mosaic/Degas_Crater.vrt"), Description = [[This is a visible orthoimage for the Degas Crater region on Mercury. This data product class of this data is observational and has been constructed to examine the visible and topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. The visible image has been orthorectified using a digital elevation model (DEM) created from Mercury Dual Imaging System (MDIS) stereo pair images. The DEM used to generate the orthoimage has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. The orthoimage was then projected onto the DEM and exported. This ortho image has been generated at a resolution of 30m/pixel.]] } local treks_MSGR_Kertesz_Crater_Ortho_30m = { Identifier = "MSGR_Kertesz_Crater_Ortho_30m", Name = [[MSGR MDIS Mosaic, Kertesz Crater]], - FilePath = asset.localResource("MSGR_MDIS_Mosaic/Kertesz_Crater.vrt"), + FilePath = asset.resource("MSGR_MDIS_Mosaic/Kertesz_Crater.vrt"), Description = [[This is a visible orthoimage for the KerteszCrater region on Mercury. This data product class of this data is observational and has been constructed to examine the visible and topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. The visible image has been orthorectified using a digital elevation model (DEM) created from Mercury Dual Imaging System (MDIS) stereo pair images. The DEM used to generate the orthoimage has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. The orthoimage was then projected onto the DEM and exported. This ortho image has been generated at a resolution of 30m/pixel.]] } local treks_MSGR_nw_Degas_Crater_Ortho_26m = { Identifier = "MSGR_nw_Degas_Crater_Ortho_26m", Name = [[MSGR MDIS Mosaic, North-West of Degas Crater]], - FilePath = asset.localResource("MSGR_MDIS_Mosaic/North-West_of_Degas_Crater.vrt"), + FilePath = asset.resource("MSGR_MDIS_Mosaic/North-West_of_Degas_Crater.vrt"), Description = [[This is a visible orthoimage for the region northwest of Degas Crater on Mercury. This data product class of this data is observational and has been constructed to examine the visible and topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. The visible image has been orthorectified using a digital elevation model (DEM) created from Mercury Dual Imaging System (MDIS) stereo pair images. The DEM used to generate the orthoimage has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. The orthoimage was then projected onto the DEM and exported. This ortho image has been generated at a resolution of 26m/pixel.]] } local treks_MSGR_Praxiteles_Peak_Ring_Ortho_20m = { Identifier = "MSGR_Praxiteles_Peak_Ring_Ortho_20m", Name = [[MSGR MDIS Mosaic, Praxiteles Peak Ring]], - FilePath = asset.localResource("MSGR_MDIS_Mosaic/Praxiteles_Peak_Ring.vrt"), + FilePath = asset.resource("MSGR_MDIS_Mosaic/Praxiteles_Peak_Ring.vrt"), Description = [[This is a visible orthoimage for the Praxiteles Peak Ring region on Mercury. This data product class of this data is observational and has been constructed to examine the visible and topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. The visible image has been orthorectified using a digital elevation model (DEM) created from Mercury Dual Imaging System (MDIS) stereo pair images. The DEM used to generate the orthoimage has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. The orthoimage was then projected onto the DEM and exported. This ortho image has been generated at a resolution of 20m/pixel.]] } local treks_MSGR_Raditladi_Crater_Ortho_40m = { Identifier = "MSGR_Raditladi_Crater_Ortho_40m", Name = [[MSGR MDIS Mosaic, Raditladi Crater]], - FilePath = asset.localResource("MSGR_MDIS_Mosaic/Raditladi_Crater.vrt"), + FilePath = asset.resource("MSGR_MDIS_Mosaic/Raditladi_Crater.vrt"), Description = [[This is a visible orthoimage for the Raditladi Crater region on Mercury. This data product class of this data is observational and has been constructed to examine the visible and topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. The visible image has been orthorectified using a digital elevation model (DEM) created from Mercury Dual Imaging System (MDIS) stereo pair images. The DEM used to generate the orthoimage has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. The orthoimage was then projected onto the DEM and exported. This ortho image has been generated at a resolution of 40m/pixel.]] } local treks_MSGR_Sander_Crater_Ortho_22m = { Identifier = "MSGR_Sander_Crater_Ortho_22m", Name = [[MSGR MDIS Mosaic, Sander Crater]], - FilePath = asset.localResource("MSGR_MDIS_Mosaic/Sander_Crater.vrt"), + FilePath = asset.resource("MSGR_MDIS_Mosaic/Sander_Crater.vrt"), Description = [[This is a visible orthoimage for the Sander Crater region on Mercury. This data product class of this data is observational and has been constructed to examine the visible and topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. The visible image has been orthorectified using a digital elevation model (DEM) created from Mercury Dual Imaging System (MDIS) stereo pair images. The DEM used to generate the orthoimage has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. The orthoimage was then projected onto the DEM and exported. This ortho image has been generated at a resolution of 22m/pixel.]] } local treks_MSGR_Sholem_Aleichem_Crater_Wall_Ortho_8m = { Identifier = "MSGR_Sholem_Aleichem_Crater_Wall_Ortho_8m", Name = [[MSGR MDIS Mosaic, Sholem Aleichem Crater Wall]], - FilePath = asset.localResource("MSGR_MDIS_Mosaic/Sholem_Aleichem_Crater_Wall.vrt"), + FilePath = asset.resource("MSGR_MDIS_Mosaic/Sholem_Aleichem_Crater_Wall.vrt"), Description = [[This is a visible orthoimage for the Sholem Aleichem Crater Wall region on Mercury. This data product class of this data is observational and has been constructed to examine the visible and topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. The visible image has been orthorectified using a digital elevation model (DEM) created from Mercury Dual Imaging System (MDIS) stereo pair images. The DEM used to generate the orthoimage has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. The orthoimage was then projected onto the DEM and exported. This ortho image has been generated at a resolution of 8m/pixel.]] } diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/nasa-treks/MSGR_MDIS_Slope.asset b/data/assets/scene/solarsystem/planets/mercury/layers/nasa-treks/MSGR_MDIS_Slope.asset index a86bf3230a..0149e2d412 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/nasa-treks/MSGR_MDIS_Slope.asset +++ b/data/assets/scene/solarsystem/planets/mercury/layers/nasa-treks/MSGR_MDIS_Slope.asset @@ -9,70 +9,70 @@ local globeIdentifier = asset.require("scene/solarsystem//planets/mercury/mercur local treks_MSGR_Aksakov_Crater_Peak_Ring_Slope_100m = { Identifier = "MSGR_Aksakov_Crater_Peak_Ring_Slope_100m", Name = [[MSGR MDIS Slope, Aksakov Crater Peak Ring]], - FilePath = asset.localResource("MSGR_MDIS_Slope/Aksakov_Crater_Peak_Ring.vrt"), + FilePath = asset.resource("MSGR_MDIS_Slope/Aksakov_Crater_Peak_Ring.vrt"), Description = [[This is a slope product of the digital elevation model (DEM) for the Aksakov Crater Peak Ring region on Mercury. This data product class of this data is observational and has been constructed to examine the topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. This DEM has been derived from Mercury Dual Imaging System (MDIS) data and has been generated at a resolution of 100m/pixel. The DEM has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. Vertical offsets in this DEM have been roughly corrected relative to the USGS's 665m Global DEM of Mercury. DEM elevation values are in meters and referred to a radius of 2440000m. Slope values are in degrees with a minimum value of 0 and a maximum value of 41.818.]] } local treks_MSGR_near_Dali_Crater_Slope_60m = { Identifier = "MSGR_near_Dali_Crater_Slope_60m", Name = [[MSGR MDIS Slope, Crater near Dali Crater]], - FilePath = asset.localResource("MSGR_MDIS_Slope/Crater_near_Dali_Crater.vrt"), + FilePath = asset.resource("MSGR_MDIS_Slope/Crater_near_Dali_Crater.vrt"), Description = [[This is a slope product of the digital elevation model (DEM) for the Crater Near Dali Crater region on Mercury. This data product class of this data is observational and has been constructed to examine the topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. This DEM has been derived from Mercury Dual Imaging System (MDIS) data and has been generated at a resolution of 60m/pixel. The DEM has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. Vertical offsets in this DEM have been roughly corrected relative to the USGS's 665m Global DEM of Mercury. DEM elevation values are in meters and referred to a radius of 2440000m. Slope values are in degrees with a minimum value of 0 and a maximum value of 50.112.]] } local treks_MSGR_near_Geddes_Crater_Slope_100m = { Identifier = "MSGR_near_Geddes_Crater_Slope_100m", Name = [[MSGR MDIS Slope, Crater near Geddes Crater]], - FilePath = asset.localResource("MSGR_MDIS_Slope/Crater_near_Geddes_Crater.vrt"), + FilePath = asset.resource("MSGR_MDIS_Slope/Crater_near_Geddes_Crater.vrt"), Description = [[This is a slope product of the digital elevation model (DEM) for the Crater Near Geddes Crater region on Mercury. This data product class of this data is observational and has been constructed to examine the topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. This DEM has been derived from Mercury Dual Imaging System (MDIS) data and has been generated at a resolution of 100m/pixel. The DEM has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. Vertical offsets in this DEM have been roughly corrected relative to the USGS's 665m Global DEM of Mercury. DEM elevation values are in meters and referred to a radius of 2440000m. Slope values are in degrees with a minimum value of 0 and a maximum value of 42.451.]] } local treks_MSGR_Degas_Crater_Slope_90m = { Identifier = "MSGR_Degas_Crater_Slope_90m", Name = [[MSGR MDIS Slope, Degas Crater]], - FilePath = asset.localResource("MSGR_MDIS_Slope/Degas_Crater.vrt"), + FilePath = asset.resource("MSGR_MDIS_Slope/Degas_Crater.vrt"), Description = [[This is a slope product of the digital elevation model (DEM) for the Degas Crater region on Mercury. This data product class of this data is observational and has been constructed to examine the topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. This DEM has been derived from Mercury Dual Imaging System (MDIS) data and has been generated at a resolution of 90m/pixel. The DEM has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. Vertical offsets in this DEM have been roughly corrected relative to the USGS's 665m Global DEM of Mercury. DEM elevation values are in meters and referred to a radius of 2440000m. Slope values are in degrees with a minimum value of 0 and a maximum value of 53.812.]] } local treks_MSGR_Kertesz_Crater_Slope_100m = { Identifier = "MSGR_Kertesz_Crater_Slope_100m", Name = [[MSGR MDIS Slope, Kertesz Crater]], - FilePath = asset.localResource("MSGR_MDIS_Slope/Kertesz_Crater.vrt"), + FilePath = asset.resource("MSGR_MDIS_Slope/Kertesz_Crater.vrt"), Description = [[This is a slope product of the digital elevation model (DEM) for the Kertesz Crater region on Mercury. This data product class of this data is observational and has been constructed to examine the topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. This DEM has been derived from Mercury Dual Imaging System (MDIS) data and has been generated at a resolution of 100m/pixel. The DEM has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. Vertical offsets in this DEM have been roughly corrected relative to the USGS's 665m Global DEM of Mercury. DEM elevation values are in meters and referred to a radius of 2440000m. Slope values are in degrees with a minimum value of 0 and a maximum value of 51.033.]] } local treks_MSGR_nw_Degas_Crater_Slope_80m = { Identifier = "MSGR_nw_Degas_Crater_Slope_80m", Name = [[MSGR MDIS Slope, North-West of Degas Crater]], - FilePath = asset.localResource("MSGR_MDIS_Slope/North-West_of_Degas_Crater.vrt"), + FilePath = asset.resource("MSGR_MDIS_Slope/North-West_of_Degas_Crater.vrt"), Description = [[This is a slope product of the digital elevation model (DEM) for the northwest region of Degas Crater on Mercury. This data product class of this data is observational and has been constructed to examine the topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. This DEM has been derived from Mercury Dual Imaging System (MDIS) data and has been generated at a resolution of 80m/pixel. The DEM has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. Vertical offsets in this DEM have been roughly corrected relative to the USGS's 665m Global DEM of Mercury. DEM elevation values are in meters and referred to a radius of 2440000m. Slope values are in degrees with a minimum value of 0 and a maximum value of 42.616.]] } local treks_MSGR_Praxiteles_Peak_Ring_Slope_60m = { Identifier = "MSGR_Praxiteles_Peak_Ring_Slope_60m", Name = [[MSGR MDIS Slope, Praxiteles Peak Ring]], - FilePath = asset.localResource("MSGR_MDIS_Slope/Praxiteles_Peak_Ring.vrt"), + FilePath = asset.resource("MSGR_MDIS_Slope/Praxiteles_Peak_Ring.vrt"), Description = [[This is a colorized slope product of the digital elevation model (DEM) for the Praxiteles Peak Ring region on Mercury. This data product class of this data is observational and has been constructed to examine the topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. This DEM has been derived from Mercury Dual Imaging System (MDIS) data and has been generated at a resolution of 60m/pixel. The DEM has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. Vertical offsets in this DEM have been roughly corrected relative to the USGS's 665m Global DEM of Mercury. DEM elevation values are in meters and referred to a radius of 2440000m. Slope values are in degrees with a minimum value of 0 and a maximum value of 46.484.]] } local treks_MSGR_Raditladi_Crater_Slope_120m = { Identifier = "MSGR_Raditladi_Crater_Slope_120m", Name = [[MSGR MDIS Slope, Raditladi Crater]], - FilePath = asset.localResource("MSGR_MDIS_Slope/Raditladi_Crater.vrt"), + FilePath = asset.resource("MSGR_MDIS_Slope/Raditladi_Crater.vrt"), Description = [[This is a slope product of the digital elevation model (DEM) for the Raditladi Crater region on Mercury. This data product class of this data is observational and has been constructed to examine the topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. This DEM has been derived from Mercury Dual Imaging System (MDIS) data and has been generated at a resolution of 120m/pixel. The DEM has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. Vertical offsets in this DEM have been roughly corrected relative to the USGS's 665m Global DEM of Mercury. DEM elevation values are in meters and referred to a radius of 2440000m. Slope values are in degrees with a minimum value of 0 and a maximum value of 39.538.]] } local treks_MSGR_Sander_Crater_Slope_80m = { Identifier = "MSGR_Sander_Crater_Slope_80m", Name = [[MSGR MDIS Slope, Sander Crater]], - FilePath = asset.localResource("MSGR_MDIS_Slope/Sander_Crater.vrt"), + FilePath = asset.resource("MSGR_MDIS_Slope/Sander_Crater.vrt"), Description = [[This is a slope product of the digital elevation model (DEM) for the Sander Crater region on Mercury. This data product class of this data is observational and has been constructed to examine the topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. This DEM has been derived from Mercury Dual Imaging System (MDIS) data and has been generated at a resolution of 80m/pixel. The DEM has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. Vertical offsets in this DEM have been roughly corrected relative to the USGS's 665m Global DEM of Mercury. DEM elevation values are in meters and referred to a radius of 2440000m. Slope values are in degrees with a minimum value of 0 and a maximum value of 41.517.]] } local treks_MSGR_Sholem_Aleichem_Crater_Wall_Slope_25m = { Identifier = "MSGR_Sholem_Aleichem_Crater_Wall_Slope_25m", Name = [[MSGR MDIS Slope, Sholem Aleichem Crater Wall]], - FilePath = asset.localResource("MSGR_MDIS_Slope/Sholem_Aleichem_Crater_Wall.vrt"), + FilePath = asset.resource("MSGR_MDIS_Slope/Sholem_Aleichem_Crater_Wall.vrt"), Description = [[This is a colorized slope product of the digital elevation model (DEM) for the Sholem Aleichem Crater Wall region on Mercury. This data product class of this data is observational and has been constructed to examine the topographic settings of landforms around Mercury's hollows. Observations of topography, specifically the relationships of hollows to their surroundings, can be used to investigate hollow formation. This DEM has been derived from Mercury Dual Imaging System (MDIS) data and has been generated at a resolution of 25m/pixel. The DEM has been aligned and controlled to Mercury Laser Altimeter (MLA) individual elevation points. Vertical offsets in this DEM have been roughly corrected relative to the USGS's 665m Global DEM of Mercury. DEM elevation values are in meters and referred to a radius of 2440000m. Slope values are in degrees with a minimum value of 0 and a maximum value of 40.746.]] } diff --git a/data/assets/scene/solarsystem/planets/mercury/mercury.asset b/data/assets/scene/solarsystem/planets/mercury/mercury.asset index 3a4cacf78e..6dde12aa39 100644 --- a/data/assets/scene/solarsystem/planets/mercury/mercury.asset +++ b/data/assets/scene/solarsystem/planets/mercury/mercury.asset @@ -4,7 +4,7 @@ local transforms = asset.require("./transforms") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Mercury Labels", Type = "HttpSynchronization", Identifier = "mercury_labels", diff --git a/data/assets/scene/solarsystem/planets/neptune/kernels.asset b/data/assets/scene/solarsystem/planets/neptune/kernels.asset index 4bfad9a74f..e1c2feb317 100644 --- a/data/assets/scene/solarsystem/planets/neptune/kernels.asset +++ b/data/assets/scene/solarsystem/planets/neptune/kernels.asset @@ -1,4 +1,4 @@ -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Neptune Spice Kernels", Type = "HttpSynchronization", Identifier = "neptune_kernels", diff --git a/data/assets/scene/solarsystem/planets/neptune/layers/colorlayers/neptune_texture.asset b/data/assets/scene/solarsystem/planets/neptune/layers/colorlayers/neptune_texture.asset index 1e5705d57f..428d3bae4b 100644 --- a/data/assets/scene/solarsystem/planets/neptune/layers/colorlayers/neptune_texture.asset +++ b/data/assets/scene/solarsystem/planets/neptune/layers/colorlayers/neptune_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../neptune") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Neptune textures", Type = "HttpSynchronization", Identifier = "neptune_textures", diff --git a/data/assets/scene/solarsystem/planets/neptune/triton/layers/colorlayers/triton_voyager2_clrmosaic_globalfill_600m.asset b/data/assets/scene/solarsystem/planets/neptune/triton/layers/colorlayers/triton_voyager2_clrmosaic_globalfill_600m.asset index 46e83c352b..34b6996f44 100644 --- a/data/assets/scene/solarsystem/planets/neptune/triton/layers/colorlayers/triton_voyager2_clrmosaic_globalfill_600m.asset +++ b/data/assets/scene/solarsystem/planets/neptune/triton/layers/colorlayers/triton_voyager2_clrmosaic_globalfill_600m.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../triton") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Triton Textures", Type = "HttpSynchronization", Identifier = "triton_textures", diff --git a/data/assets/scene/solarsystem/planets/saturn/dione/dione.asset b/data/assets/scene/solarsystem/planets/saturn/dione/dione.asset index a7a939eec5..fd6705e03c 100644 --- a/data/assets/scene/solarsystem/planets/saturn/dione/dione.asset +++ b/data/assets/scene/solarsystem/planets/saturn/dione/dione.asset @@ -4,7 +4,7 @@ local kernel = asset.require("../kernels") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Saturn Labels", Type = "HttpSynchronization", Identifier = "saturn_labels", diff --git a/data/assets/scene/solarsystem/planets/saturn/dione/layers/colorlayers/dione_texture.asset b/data/assets/scene/solarsystem/planets/saturn/dione/layers/colorlayers/dione_texture.asset index caca2f9069..7d5fdb4020 100644 --- a/data/assets/scene/solarsystem/planets/saturn/dione/layers/colorlayers/dione_texture.asset +++ b/data/assets/scene/solarsystem/planets/saturn/dione/layers/colorlayers/dione_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../dione") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Dione textures", Type = "HttpSynchronization", Identifier = "dione_textures", diff --git a/data/assets/scene/solarsystem/planets/saturn/enceladus/enceladus.asset b/data/assets/scene/solarsystem/planets/saturn/enceladus/enceladus.asset index 8cde73ffd0..26f5465764 100644 --- a/data/assets/scene/solarsystem/planets/saturn/enceladus/enceladus.asset +++ b/data/assets/scene/solarsystem/planets/saturn/enceladus/enceladus.asset @@ -4,7 +4,7 @@ local kernel = asset.require("../kernels") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Saturn Labels", Type = "HttpSynchronization", Identifier = "saturn_labels", diff --git a/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/enceladus_texture.asset b/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/enceladus_texture.asset index 0dd079b028..e14e4cf7c4 100644 --- a/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/enceladus_texture.asset +++ b/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/enceladus_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../enceladus") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Enceladus textures", Type = "HttpSynchronization", Identifier = "enceladus_textures", diff --git a/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/global_mosaic_100m_hpf_newyork.asset b/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/global_mosaic_100m_hpf_newyork.asset index 2f886bfc0e..2591573846 100644 --- a/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/global_mosaic_100m_hpf_newyork.asset +++ b/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/global_mosaic_100m_hpf_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Global_Mosaic_100m_HPF_NewYork", Name = "Cassini Global Mosaic 100m HPF [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("global_mosaic_100m_hpf_newyork.wms"), + FilePath = asset.resource("global_mosaic_100m_hpf_newyork.wms"), Description = [[This mosaic represents the completion of a global control network of Enceladus containing Cassini Imaging Science Subsystem (ISS) images. A total of 586 images in CLR, GRN, UV3, and IR3 filters were selected for the control diff --git a/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/global_mosaic_100m_hpf_sweden.asset b/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/global_mosaic_100m_hpf_sweden.asset index fbfdbb5193..e3fc211cc3 100644 --- a/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/global_mosaic_100m_hpf_sweden.asset +++ b/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/global_mosaic_100m_hpf_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Global_Mosaic_100m_HPF_Sweden", Name = "Cassini Global Mosaic 100m HPF [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("global_mosaic_100m_hpf_sweden.wms"), + FilePath = asset.resource("global_mosaic_100m_hpf_sweden.wms"), Description = [[This mosaic represents the completion of a global control network of Enceladus containing Cassini Imaging Science Subsystem (ISS) images. A total of 586 images in CLR, GRN, UV3, and IR3 filters were selected for the control diff --git a/data/assets/scene/solarsystem/planets/saturn/hyperion/hyperion.asset b/data/assets/scene/solarsystem/planets/saturn/hyperion/hyperion.asset index 3652eef7fc..97c95a15b3 100644 --- a/data/assets/scene/solarsystem/planets/saturn/hyperion/hyperion.asset +++ b/data/assets/scene/solarsystem/planets/saturn/hyperion/hyperion.asset @@ -4,7 +4,7 @@ local kernel = asset.require("../kernels") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Saturn Labels", Type = "HttpSynchronization", Identifier = "saturn_labels", diff --git a/data/assets/scene/solarsystem/planets/saturn/iapetus/iapetus.asset b/data/assets/scene/solarsystem/planets/saturn/iapetus/iapetus.asset index c8ac165115..bac29a64f0 100644 --- a/data/assets/scene/solarsystem/planets/saturn/iapetus/iapetus.asset +++ b/data/assets/scene/solarsystem/planets/saturn/iapetus/iapetus.asset @@ -4,7 +4,7 @@ local kernel = asset.require("../kernels") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Saturn Labels", Type = "HttpSynchronization", Identifier = "saturn_labels", diff --git a/data/assets/scene/solarsystem/planets/saturn/iapetus/layers/colorlayers/iapetus_texture.asset b/data/assets/scene/solarsystem/planets/saturn/iapetus/layers/colorlayers/iapetus_texture.asset index b3b19e7464..9a228ca1c2 100644 --- a/data/assets/scene/solarsystem/planets/saturn/iapetus/layers/colorlayers/iapetus_texture.asset +++ b/data/assets/scene/solarsystem/planets/saturn/iapetus/layers/colorlayers/iapetus_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../iapetus") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Iapetus textures", Type = "HttpSynchronization", Identifier = "iapetus_textures", diff --git a/data/assets/scene/solarsystem/planets/saturn/kernels.asset b/data/assets/scene/solarsystem/planets/saturn/kernels.asset index 5a659764a9..a1dcf4b882 100644 --- a/data/assets/scene/solarsystem/planets/saturn/kernels.asset +++ b/data/assets/scene/solarsystem/planets/saturn/kernels.asset @@ -1,4 +1,4 @@ -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Saturn Spice Kernels", Type = "HttpSynchronization", Identifier = "saturn_kernels", diff --git a/data/assets/scene/solarsystem/planets/saturn/layers/colorlayers/saturn_texture.asset b/data/assets/scene/solarsystem/planets/saturn/layers/colorlayers/saturn_texture.asset index a3e7ca57ad..fd266c5ff1 100644 --- a/data/assets/scene/solarsystem/planets/saturn/layers/colorlayers/saturn_texture.asset +++ b/data/assets/scene/solarsystem/planets/saturn/layers/colorlayers/saturn_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../saturn") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Type = "HttpSynchronization", Name = "Saturn textures", Identifier = "saturn_textures", diff --git a/data/assets/scene/solarsystem/planets/saturn/mimas/layers/colorlayers/mimas_texture.asset b/data/assets/scene/solarsystem/planets/saturn/mimas/layers/colorlayers/mimas_texture.asset index 6c000042f2..5de7b88fe3 100644 --- a/data/assets/scene/solarsystem/planets/saturn/mimas/layers/colorlayers/mimas_texture.asset +++ b/data/assets/scene/solarsystem/planets/saturn/mimas/layers/colorlayers/mimas_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../mimas") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Mimas textures", Type = "HttpSynchronization", Identifier = "mimas_textures", diff --git a/data/assets/scene/solarsystem/planets/saturn/mimas/mimas.asset b/data/assets/scene/solarsystem/planets/saturn/mimas/mimas.asset index 36aad15d4c..31da7dcaa2 100644 --- a/data/assets/scene/solarsystem/planets/saturn/mimas/mimas.asset +++ b/data/assets/scene/solarsystem/planets/saturn/mimas/mimas.asset @@ -4,7 +4,7 @@ local kernel = asset.require("../kernels") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Saturn Labels", Type = "HttpSynchronization", Identifier = "saturn_labels", 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 734d32c3e3..0ffa5bd9b2 100644 --- a/data/assets/scene/solarsystem/planets/saturn/minor/shepherd_group.asset +++ b/data/assets/scene/solarsystem/planets/saturn/minor/shepherd_group.asset @@ -2,7 +2,7 @@ local transforms = asset.require("../transforms") -local syncedKernels = asset.syncedResource({ +local syncedKernels = asset.resource({ Name = "Saturn Shepherd Moons Spice Kernels", Type = "HttpSynchronization", Identifier = "saturn_shepherd_kernels", diff --git a/data/assets/scene/solarsystem/planets/saturn/rhea/layers/colorlayers/rhea_texture.asset b/data/assets/scene/solarsystem/planets/saturn/rhea/layers/colorlayers/rhea_texture.asset index 9ff9287019..5c27a33a62 100644 --- a/data/assets/scene/solarsystem/planets/saturn/rhea/layers/colorlayers/rhea_texture.asset +++ b/data/assets/scene/solarsystem/planets/saturn/rhea/layers/colorlayers/rhea_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../rhea") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Rhea textures", Type = "HttpSynchronization", Identifier = "rhea_textures", diff --git a/data/assets/scene/solarsystem/planets/saturn/rhea/rhea.asset b/data/assets/scene/solarsystem/planets/saturn/rhea/rhea.asset index 9aaf757c80..64f3c2263c 100644 --- a/data/assets/scene/solarsystem/planets/saturn/rhea/rhea.asset +++ b/data/assets/scene/solarsystem/planets/saturn/rhea/rhea.asset @@ -4,7 +4,7 @@ local kernel = asset.require("../kernels") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Saturn Labels", Type = "HttpSynchronization", Identifier = "saturn_labels", diff --git a/data/assets/scene/solarsystem/planets/saturn/saturn.asset b/data/assets/scene/solarsystem/planets/saturn/saturn.asset index 188a5c824f..68753c4355 100644 --- a/data/assets/scene/solarsystem/planets/saturn/saturn.asset +++ b/data/assets/scene/solarsystem/planets/saturn/saturn.asset @@ -4,7 +4,7 @@ local transforms = asset.require("./transforms") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Type = "HttpSynchronization", Name = "Saturn textures", Identifier = "saturn_textures", diff --git a/data/assets/scene/solarsystem/planets/saturn/tethys/layers/colorlayers/tethys_texture.asset b/data/assets/scene/solarsystem/planets/saturn/tethys/layers/colorlayers/tethys_texture.asset index 5e76f7b274..ceecd82b78 100644 --- a/data/assets/scene/solarsystem/planets/saturn/tethys/layers/colorlayers/tethys_texture.asset +++ b/data/assets/scene/solarsystem/planets/saturn/tethys/layers/colorlayers/tethys_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../tethys") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Tethys textures", Type = "HttpSynchronization", Identifier = "tethys_textures", diff --git a/data/assets/scene/solarsystem/planets/saturn/tethys/tethys.asset b/data/assets/scene/solarsystem/planets/saturn/tethys/tethys.asset index ec844427cf..0f66813926 100644 --- a/data/assets/scene/solarsystem/planets/saturn/tethys/tethys.asset +++ b/data/assets/scene/solarsystem/planets/saturn/tethys/tethys.asset @@ -4,7 +4,7 @@ local kernel = asset.require("../kernels") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Saturn Labels", Type = "HttpSynchronization", Identifier = "saturn_labels", diff --git a/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_iss_global_mosaic_4km_local.asset b/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_iss_global_mosaic_4km_local.asset index 2e069072a2..06cbdfaccb 100644 --- a/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_iss_global_mosaic_4km_local.asset +++ b/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_iss_global_mosaic_4km_local.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../titan") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Type = "HttpSynchronization", Name = "Titan textures", Identifier = "titan_textures", diff --git a/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_iss_global_mosaic_4km_newyork.asset b/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_iss_global_mosaic_4km_newyork.asset index 8084c7797f..aba41f9d82 100644 --- a/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_iss_global_mosaic_4km_newyork.asset +++ b/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_iss_global_mosaic_4km_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Cassini_ISS_Global_Mosaic_4km_NewYork", Name = "Cassini ISS Global Mosaic [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("cassini_iss_global_mosaic_4km_newyork.wms"), + FilePath = asset.resource("cassini_iss_global_mosaic_4km_newyork.wms"), Description = [[This global digital map of Saturn's moon Titan was created using images taken by the Cassini spacecraft's Imaging Science Subsystem (ISS). The map was produced in June 2015 using data collected through Cassini's flyby on April 7, diff --git a/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_iss_global_mosaic_4km_sweden.asset b/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_iss_global_mosaic_4km_sweden.asset index bf3cee518d..0e658e9e61 100644 --- a/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_iss_global_mosaic_4km_sweden.asset +++ b/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_iss_global_mosaic_4km_sweden.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Cassini_ISS_Global_Mosaic_4km_LiU", Name = "Cassini ISS Global Mosaic [Sweden]", Enabled = asset.enabled, - FilePath = asset.localResource("cassini_iss_global_mosaic_4km_sweden.wms"), + FilePath = asset.resource("cassini_iss_global_mosaic_4km_sweden.wms"), Description = [[This global digital map of Saturn's moon Titan was created using images taken by the Cassini spacecraft's Imaging Science Subsystem (ISS). The map was produced in June 2015 using data collected through Cassini's flyby on April 7, diff --git a/data/assets/scene/solarsystem/planets/saturn/titan/titan.asset b/data/assets/scene/solarsystem/planets/saturn/titan/titan.asset index 53b332a6f6..6347aeeaa0 100644 --- a/data/assets/scene/solarsystem/planets/saturn/titan/titan.asset +++ b/data/assets/scene/solarsystem/planets/saturn/titan/titan.asset @@ -4,7 +4,7 @@ local kernel = asset.require("../kernels") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Saturn Labels", Type = "HttpSynchronization", Identifier = "saturn_labels", diff --git a/data/assets/scene/solarsystem/planets/uranus/kernels.asset b/data/assets/scene/solarsystem/planets/uranus/kernels.asset index d7dcbf10c6..22ebcd1447 100644 --- a/data/assets/scene/solarsystem/planets/uranus/kernels.asset +++ b/data/assets/scene/solarsystem/planets/uranus/kernels.asset @@ -1,4 +1,4 @@ -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "Uranus Spice Kernels", Type = "HttpSynchronization", Identifier = "uranus_kernels", diff --git a/data/assets/scene/solarsystem/planets/uranus/layers/colorlayers/uranus_texture.asset b/data/assets/scene/solarsystem/planets/uranus/layers/colorlayers/uranus_texture.asset index b8702a1d72..a351c817a9 100644 --- a/data/assets/scene/solarsystem/planets/uranus/layers/colorlayers/uranus_texture.asset +++ b/data/assets/scene/solarsystem/planets/uranus/layers/colorlayers/uranus_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../uranus") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Uranus Textures", Type = "HttpSynchronization", Identifier = "uranus_textures", diff --git a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo.asset b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo.asset index 504cdfad08..2086f4ee46 100644 --- a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo.asset +++ b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../venus") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Venus Textures", Type = "HttpSynchronization", Identifier = "venus_textures", @@ -30,7 +30,7 @@ local Layer = { TileProvider = { Identifier = "Magellan_Mosaic_Utah", Name = "Magellan Mosaic [Utah]", - FilePath = asset.localResource("magellan_mosaic_utah.vrt"), + FilePath = asset.resource("magellan_mosaic_utah.vrt"), BlendMode = "Color", Settings = { Gamma = 2.0 } } diff --git a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo_newyork.asset b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo_newyork.asset index 172fee7f3a..79c648a45d 100644 --- a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo_newyork.asset +++ b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/clouds_magellan_combo_newyork.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../venus") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Venus Textures", Type = "HttpSynchronization", Identifier = "venus_textures", @@ -30,7 +30,7 @@ local Layer = { TileProvider = { Identifier = "Magellan_Mosaic_NewYork", Name = "Magellan Mosaic [New York]", - FilePath = asset.localResource("magellan_mosaic_newyork.vrt"), + FilePath = asset.resource("magellan_mosaic_newyork.vrt"), BlendMode = "Color", Settings = { Gamma = 2.0 } } diff --git a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/magellan_mosaic_newyork.asset b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/magellan_mosaic_newyork.asset index 5b4a771047..8c01b2e223 100644 --- a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/magellan_mosaic_newyork.asset +++ b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/magellan_mosaic_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Magellan_Mosaic_NewYork", Name = "Magellan Mosaic [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("magellan_mosaic_newyork.vrt"), + FilePath = asset.resource("magellan_mosaic_newyork.vrt"), BlendMode = "Color", Settings = { Gamma = 2.0 }, Description = [[Color layer for Venus. This mosaic was created from the Magellan diff --git a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/magellan_mosaic_utah.asset b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/magellan_mosaic_utah.asset index 45d05e246e..bb0655c803 100644 --- a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/magellan_mosaic_utah.asset +++ b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/magellan_mosaic_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "Magellan_Mosaic_Utah", Name = "Magellan Mosaic [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("magellan_mosaic_utah.vrt"), + FilePath = asset.resource("magellan_mosaic_utah.vrt"), BlendMode = "Color", Settings = { Gamma = 2.0 }, Description = [[Color layer for Venus. This mosaic was created from the Magellan diff --git a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/venus_texture.asset b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/venus_texture.asset index d327130a11..2343b4ca84 100644 --- a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/venus_texture.asset +++ b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/venus_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../venus") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Name = "Venus Textures", Type = "HttpSynchronization", Identifier = "venus_textures", diff --git a/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_newyork.asset b/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_newyork.asset index 102ea3fcaa..a783800fbc 100644 --- a/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_newyork.asset +++ b/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_newyork.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "MagellanElevation_NewYork", Name = "Magellan Elevation [New York]", Enabled = asset.enabled, - FilePath = asset.localResource("magellan_newyork.wms"), + FilePath = asset.resource("magellan_newyork.wms"), TilePixelSize = 129, Settings = { Gamma = 1.72, diff --git a/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_utah.asset b/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_utah.asset index 83a7c0125a..54a22bf790 100644 --- a/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_utah.asset +++ b/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_utah.asset @@ -6,7 +6,7 @@ local Layer = { Identifier = "MagellanElevation_Utah", Name = "Magellan Elevation [Utah]", Enabled = asset.enabled, - FilePath = asset.localResource("magellan_utah.wms"), + FilePath = asset.resource("magellan_utah.wms"), TilePixelSize = 129, Settings = { Gamma = 1.72, diff --git a/data/assets/scene/solarsystem/planets/venus/venus.asset b/data/assets/scene/solarsystem/planets/venus/venus.asset index 5b2d452429..7cc76365aa 100644 --- a/data/assets/scene/solarsystem/planets/venus/venus.asset +++ b/data/assets/scene/solarsystem/planets/venus/venus.asset @@ -4,7 +4,7 @@ local transforms = asset.require("./transforms") -local labelsPath = asset.syncedResource({ +local labelsPath = asset.resource({ Name = "Venus Labels", Type = "HttpSynchronization", Identifier = "venus_labels", diff --git a/data/assets/scene/solarsystem/sssb/amor_asteroid.asset b/data/assets/scene/solarsystem/sssb/amor_asteroid.asset index 2c5d7f0979..62ffe4b0a1 100644 --- a/data/assets/scene/solarsystem/sssb/amor_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/amor_asteroid.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local sssb = asset.syncedResource({ +local sssb = asset.resource({ Name = "Small SolarSystem Body Data (Amor Asteroid)", Type = "HttpSynchronization", Identifier = "sssb_data_amor_asteroid", diff --git a/data/assets/scene/solarsystem/sssb/apollo_asteroid.asset b/data/assets/scene/solarsystem/sssb/apollo_asteroid.asset index 4b051e11ff..675eefbcb8 100644 --- a/data/assets/scene/solarsystem/sssb/apollo_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/apollo_asteroid.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local sssb = asset.syncedResource({ +local sssb = asset.resource({ Name = "Small SolarSystem Body Data (Apollo Asteroid)", Type = "HttpSynchronization", Identifier = "sssb_data_apollo_asteroid", diff --git a/data/assets/scene/solarsystem/sssb/astraea.asset b/data/assets/scene/solarsystem/sssb/astraea.asset index bb8c721d1a..b46aaa56c3 100644 --- a/data/assets/scene/solarsystem/sssb/astraea.asset +++ b/data/assets/scene/solarsystem/sssb/astraea.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local horizons = asset.syncedResource({ +local horizons = asset.resource({ Name = "5 Astraea Trajectory", Type = "HttpSynchronization", Identifier = "astraea_horizons", diff --git a/data/assets/scene/solarsystem/sssb/aten_asteroid.asset b/data/assets/scene/solarsystem/sssb/aten_asteroid.asset index ae3d5f0f72..57a63305a2 100644 --- a/data/assets/scene/solarsystem/sssb/aten_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/aten_asteroid.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local sssb = asset.syncedResource({ +local sssb = asset.resource({ Name = "Small SolarSystem Body Data (Aten Asteroid)", Type = "HttpSynchronization", Identifier = "sssb_data_aten_asteroid", diff --git a/data/assets/scene/solarsystem/sssb/atira_asteroid.asset b/data/assets/scene/solarsystem/sssb/atira_asteroid.asset index ac1f7023ec..e9119fbe3e 100644 --- a/data/assets/scene/solarsystem/sssb/atira_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/atira_asteroid.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local sssb = asset.syncedResource({ +local sssb = asset.resource({ Name = "Small SolarSystem Body Data (Atira Asteroid)", Type = "HttpSynchronization", Identifier = "sssb_data_atira_asteroid", diff --git a/data/assets/scene/solarsystem/sssb/c2019y4atlas.asset b/data/assets/scene/solarsystem/sssb/c2019y4atlas.asset index 8704ad96e6..dcf5dda490 100644 --- a/data/assets/scene/solarsystem/sssb/c2019y4atlas.asset +++ b/data/assets/scene/solarsystem/sssb/c2019y4atlas.asset @@ -2,7 +2,7 @@ local sunTransforms = asset.require("scene/solarsystem/sun/transforms") -local orbit = asset.syncedResource({ +local orbit = asset.resource({ Name = "Comet C/2019 Y4 ATLAS", Type = "HttpSynchronization", Identifier = "horizons_c2019y4atlas", diff --git a/data/assets/scene/solarsystem/sssb/centaur_asteroid.asset b/data/assets/scene/solarsystem/sssb/centaur_asteroid.asset index 8b2468a1bf..b34557cfba 100644 --- a/data/assets/scene/solarsystem/sssb/centaur_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/centaur_asteroid.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local sssb = asset.syncedResource({ +local sssb = asset.resource({ Name = "Small SolarSystem Body Data (Centaur Asteroid)", Type = "HttpSynchronization", Identifier = "sssb_data_centaur_asteroid", diff --git a/data/assets/scene/solarsystem/sssb/chiron-type_comet.asset b/data/assets/scene/solarsystem/sssb/chiron-type_comet.asset index 48b7f01a89..fb3b172b15 100644 --- a/data/assets/scene/solarsystem/sssb/chiron-type_comet.asset +++ b/data/assets/scene/solarsystem/sssb/chiron-type_comet.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local sssb = asset.syncedResource({ +local sssb = asset.resource({ Name = "Small SolarSystem Body Data (Chiron-type Comet)", Type = "HttpSynchronization", Identifier = "sssb_data_chiron-type_comet", diff --git a/data/assets/scene/solarsystem/sssb/encke-type_comet.asset b/data/assets/scene/solarsystem/sssb/encke-type_comet.asset index 6ebc6a16a8..932eaeac9a 100644 --- a/data/assets/scene/solarsystem/sssb/encke-type_comet.asset +++ b/data/assets/scene/solarsystem/sssb/encke-type_comet.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local sssb = asset.syncedResource({ +local sssb = asset.resource({ Name = "Small SolarSystem Body Data (Encke-type Comet)", Type = "HttpSynchronization", Identifier = "sssb_data_encke-type_comet", diff --git a/data/assets/scene/solarsystem/sssb/halley-type_comet.asset b/data/assets/scene/solarsystem/sssb/halley-type_comet.asset index 81b8efafec..92a5fd4b5c 100644 --- a/data/assets/scene/solarsystem/sssb/halley-type_comet.asset +++ b/data/assets/scene/solarsystem/sssb/halley-type_comet.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local sssb = asset.syncedResource({ +local sssb = asset.resource({ Name = "Small SolarSystem Body Data (Halley-type Comet)", Type = "HttpSynchronization", Identifier = "sssb_data_halley-type_comet", 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 17ea63d52d..fb4fb38c7b 100644 --- a/data/assets/scene/solarsystem/sssb/inner_main_belt_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/inner_main_belt_asteroid.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local sssb = asset.syncedResource({ +local sssb = asset.resource({ Name = "Small SolarSystem Body Data (Inner Main Belt Asteroid)", Type = "HttpSynchronization", Identifier = "sssb_data_inner_main_belt_asteroid", diff --git a/data/assets/scene/solarsystem/sssb/itokawa.asset b/data/assets/scene/solarsystem/sssb/itokawa.asset index 743ff3747f..758ff32a7f 100644 --- a/data/assets/scene/solarsystem/sssb/itokawa.asset +++ b/data/assets/scene/solarsystem/sssb/itokawa.asset @@ -3,14 +3,14 @@ local sun = asset.require("scene/solarsystem/sun/sun") -local orbit = asset.syncedResource({ +local orbit = asset.resource({ Name = "Itokawa Orbit", Type = "HttpSynchronization", Identifier = "itokawa_horizons", Version = 2 }) -local model = asset.syncedResource({ +local model = asset.resource({ Name = "Itokawa Model", Type = "HttpSynchronization", Identifier = "itokawa_model", diff --git a/data/assets/scene/solarsystem/sssb/jupiter-family_comet.asset b/data/assets/scene/solarsystem/sssb/jupiter-family_comet.asset index fc9aa2e9e2..3382de82d3 100644 --- a/data/assets/scene/solarsystem/sssb/jupiter-family_comet.asset +++ b/data/assets/scene/solarsystem/sssb/jupiter-family_comet.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local sssb = asset.syncedResource({ +local sssb = asset.resource({ Name = "Small SolarSystem Body Data (Jupiter Family Comet)", Type = "HttpSynchronization", Identifier = "sssb_data_jupiter-family_comet", diff --git a/data/assets/scene/solarsystem/sssb/jupiter_trojan_asteroid.asset b/data/assets/scene/solarsystem/sssb/jupiter_trojan_asteroid.asset index f2ad637137..26312b1a70 100644 --- a/data/assets/scene/solarsystem/sssb/jupiter_trojan_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/jupiter_trojan_asteroid.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local sssb = asset.syncedResource({ +local sssb = asset.resource({ Name = "Small SolarSystem Body Data (Jupiter Trojan Asteroid)", Type = "HttpSynchronization", Identifier = "sssb_data_jupiter_trojan_asteroid", diff --git a/data/assets/scene/solarsystem/sssb/main_belt_asteroid.asset b/data/assets/scene/solarsystem/sssb/main_belt_asteroid.asset index 850e3d9b9a..546adb701b 100644 --- a/data/assets/scene/solarsystem/sssb/main_belt_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/main_belt_asteroid.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local sssb = asset.syncedResource({ +local sssb = asset.resource({ Name = "Small SolarSystem Body Data (Main Belt Asteroid)", Type = "HttpSynchronization", Identifier = "sssb_data_main_belt_asteroid", diff --git a/data/assets/scene/solarsystem/sssb/mars-crossing_asteroid.asset b/data/assets/scene/solarsystem/sssb/mars-crossing_asteroid.asset index ed44f28a94..2b54bdce9a 100644 --- a/data/assets/scene/solarsystem/sssb/mars-crossing_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/mars-crossing_asteroid.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local sssb = asset.syncedResource({ +local sssb = asset.resource({ Name = "Small SolarSystem Body Data (Mars-Crossing Asteroid)", Type = "HttpSynchronization", Identifier = "sssb_data_mars-crossing_asteroid", 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 3047d60dfa..34e8062385 100644 --- a/data/assets/scene/solarsystem/sssb/outer_main_belt_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/outer_main_belt_asteroid.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local sssb = asset.syncedResource({ +local sssb = asset.resource({ Name = "Small SolarSystem Body Data (Outer Main Belt Asteroid)", Type = "HttpSynchronization", Identifier = "sssb_data_outer_main_belt_asteroid", diff --git a/data/assets/scene/solarsystem/sssb/pha.asset b/data/assets/scene/solarsystem/sssb/pha.asset index ddc49f421e..6061eb8b9c 100644 --- a/data/assets/scene/solarsystem/sssb/pha.asset +++ b/data/assets/scene/solarsystem/sssb/pha.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local sssb = asset.syncedResource({ +local sssb = asset.resource({ Name = "Small SolarSystem Body Data (Potentially hazardous Asteroids)", Type = "HttpSynchronization", Identifier = "sssb_data_pha", diff --git a/data/assets/scene/solarsystem/sssb/swifttuttle.asset b/data/assets/scene/solarsystem/sssb/swifttuttle.asset index e4c119e08f..c19c962dec 100644 --- a/data/assets/scene/solarsystem/sssb/swifttuttle.asset +++ b/data/assets/scene/solarsystem/sssb/swifttuttle.asset @@ -2,7 +2,7 @@ local sunTransforms = asset.require("scene/solarsystem/sun/transforms") -local sync = asset.syncedResource({ +local sync = asset.resource({ Name = "Swift Tuttle Orbit", Type = "HttpSynchronization", Identifier = "swift_tuttle_horizons", diff --git a/data/assets/scene/solarsystem/sssb/tesla_roadster.asset b/data/assets/scene/solarsystem/sssb/tesla_roadster.asset index b1fd429a34..0afdadd5ae 100644 --- a/data/assets/scene/solarsystem/sssb/tesla_roadster.asset +++ b/data/assets/scene/solarsystem/sssb/tesla_roadster.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local orbit = asset.syncedResource({ +local orbit = asset.resource({ Name = "Tesla Roadster Orbit", Type = "HttpSynchronization", Identifier = "tesla_horizons", diff --git a/data/assets/scene/solarsystem/sssb/transneptunian_object_asteroid.asset b/data/assets/scene/solarsystem/sssb/transneptunian_object_asteroid.asset index 33de963562..4bee354119 100644 --- a/data/assets/scene/solarsystem/sssb/transneptunian_object_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/transneptunian_object_asteroid.asset @@ -2,7 +2,7 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") -local sssb = asset.syncedResource({ +local sssb = asset.resource({ Name = "Small SolarSystem Body Data (Trans-Neptunian Object Asteroid)", Type = "HttpSynchronization", Identifier = "sssb_data_transneptunian_object_asteroid", diff --git a/data/assets/scene/solarsystem/sun/EUV_layer.asset b/data/assets/scene/solarsystem/sun/EUV_layer.asset index 2bb83577d3..bd42a64afc 100644 --- a/data/assets/scene/solarsystem/sun/EUV_layer.asset +++ b/data/assets/scene/solarsystem/sun/EUV_layer.asset @@ -4,7 +4,7 @@ local transforms = asset.require("./transforms") -local textureSourcePath = asset.syncedResource({ +local textureSourcePath = asset.resource({ Type = "HttpSynchronization", Name = "euv_textures_bastille_event", Identifier = "euv_textures_bastille_event", diff --git a/data/assets/scene/solarsystem/sun/glare.asset b/data/assets/scene/solarsystem/sun/glare.asset index de5227e4f5..d519859748 100644 --- a/data/assets/scene/solarsystem/sun/glare.asset +++ b/data/assets/scene/solarsystem/sun/glare.asset @@ -3,7 +3,7 @@ local transforms = asset.require("./transforms") -local textures = asset.syncedResource({ +local textures = asset.resource({ Type = "HttpSynchronization", Name = "Sun textures", Identifier = "sun_textures", diff --git a/data/assets/scene/solarsystem/sun/layers/colorlayers/sun_texture.asset b/data/assets/scene/solarsystem/sun/layers/colorlayers/sun_texture.asset index e0a558a030..c53274744c 100644 --- a/data/assets/scene/solarsystem/sun/layers/colorlayers/sun_texture.asset +++ b/data/assets/scene/solarsystem/sun/layers/colorlayers/sun_texture.asset @@ -2,7 +2,7 @@ local globe = asset.require("../../sun") -local texturesPath = asset.syncedResource({ +local texturesPath = asset.resource({ Type = "HttpSynchronization", Name = "Sun textures", Identifier = "sun_textures", diff --git a/data/assets/scene/solarsystem/sun/marker.asset b/data/assets/scene/solarsystem/sun/marker.asset index d1623e569c..b4fe9cc5c0 100644 --- a/data/assets/scene/solarsystem/sun/marker.asset +++ b/data/assets/scene/solarsystem/sun/marker.asset @@ -3,7 +3,7 @@ local transforms = asset.require("./transforms") -local textures = asset.syncedResource({ +local textures = asset.resource({ Type = "HttpSynchronization", Name = "Sun textures", Identifier = "sun_textures", diff --git a/data/assets/scene/solarsystem/sun/transforms_heliosphere.asset b/data/assets/scene/solarsystem/sun/transforms_heliosphere.asset index eb7447a536..2ebbf05274 100644 --- a/data/assets/scene/solarsystem/sun/transforms_heliosphere.asset +++ b/data/assets/scene/solarsystem/sun/transforms_heliosphere.asset @@ -16,7 +16,7 @@ local HEEQ180ReferenceFrame = { Type = "SpiceRotation", SourceFrame = "HEEQ180", DestinationFrame = "GALACTIC", - Kernels = asset.localResource("kernels/HEEQ180.tf") + Kernels = asset.resource("kernels/HEEQ180.tf") } }, GUI = { diff --git a/data/assets/scene/solarsystem/telescopes/gaia/gaia.asset b/data/assets/scene/solarsystem/telescopes/gaia/gaia.asset index f23ee9bb27..70de7b2c03 100644 --- a/data/assets/scene/solarsystem/telescopes/gaia/gaia.asset +++ b/data/assets/scene/solarsystem/telescopes/gaia/gaia.asset @@ -3,7 +3,7 @@ local sun = asset.require("scene/solarsystem/sun/sun") -local model = asset.syncedResource({ +local model = asset.resource({ Name = "Gaia Model", Type = "HttpSynchronization", Identifier = "gaia_model", diff --git a/data/assets/scene/solarsystem/telescopes/gaia/trail.asset b/data/assets/scene/solarsystem/telescopes/gaia/trail.asset index a1ba231f95..8f0173dbe1 100644 --- a/data/assets/scene/solarsystem/telescopes/gaia/trail.asset +++ b/data/assets/scene/solarsystem/telescopes/gaia/trail.asset @@ -3,7 +3,7 @@ local sunTransforms = asset.require("scene/solarsystem/sun/transforms") -local trail = asset.syncedResource({ +local trail = asset.resource({ Name = "Gaia Trail", Type = "HttpSynchronization", Identifier = "gaia_trail", diff --git a/data/assets/scene/solarsystem/telescopes/gaia/transforms.asset b/data/assets/scene/solarsystem/telescopes/gaia/transforms.asset index 9d2375f100..920d928b04 100644 --- a/data/assets/scene/solarsystem/telescopes/gaia/transforms.asset +++ b/data/assets/scene/solarsystem/telescopes/gaia/transforms.asset @@ -2,7 +2,7 @@ local earthTransforms = asset.require("scene/solarsystem/planets/earth/transform -local trail = asset.syncedResource({ +local trail = asset.resource({ Name = "Gaia Trail", Type = "HttpSynchronization", Identifier = "gaia_trail", diff --git a/data/assets/scene/solarsystem/telescopes/jwst/jwst.asset b/data/assets/scene/solarsystem/telescopes/jwst/jwst.asset index 4c992a9fcf..e0c49a2b6d 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/jwst.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/jwst.asset @@ -7,14 +7,14 @@ local transforms = asset.require("./transforms") -local models = asset.syncedResource({ +local models = asset.resource({ Name = "JWST Model", Type = "HttpSynchronization", Identifier = "jwst_model", Version = 3 }) -local band = asset.syncedResource({ +local band = asset.resource({ Name = "JWST band texture", Type = "HttpSynchronization", Identifier = "jwst_band_texture", diff --git a/data/assets/scene/solarsystem/telescopes/jwst/targets/crab_image.asset b/data/assets/scene/solarsystem/telescopes/jwst/targets/crab_image.asset index fb77d04dcf..ebde46633a 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/targets/crab_image.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/targets/crab_image.asset @@ -1,4 +1,4 @@ -local image = asset.syncedResource({ +local image = asset.resource({ Name = "Crab Nebula Image", Type = "HttpSynchronization", Identifier = "crab_image", diff --git a/data/assets/scene/solarsystem/telescopes/jwst/targets/hd84406_image.asset b/data/assets/scene/solarsystem/telescopes/jwst/targets/hd84406_image.asset index c119d7cd01..a126e76547 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/targets/hd84406_image.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/targets/hd84406_image.asset @@ -1,4 +1,4 @@ -local image = asset.syncedResource({ +local image = asset.resource({ Name = "HD 84406 Star Image", Type = "HttpSynchronization", Identifier = "hd84406_image", diff --git a/data/assets/scene/solarsystem/telescopes/jwst/targets/hh212_image.asset b/data/assets/scene/solarsystem/telescopes/jwst/targets/hh212_image.asset index 775e2dddf9..0f9cb45f3e 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/targets/hh212_image.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/targets/hh212_image.asset @@ -1,4 +1,4 @@ -local image = asset.syncedResource({ +local image = asset.resource({ Name = "HH 212 Image", Type = "HttpSynchronization", Identifier = "hh212_image", diff --git a/data/assets/scene/solarsystem/telescopes/jwst/targets/hudf_image.asset b/data/assets/scene/solarsystem/telescopes/jwst/targets/hudf_image.asset index a2deb3c480..a3c4f9c2f1 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/targets/hudf_image.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/targets/hudf_image.asset @@ -1,4 +1,4 @@ -local image = asset.syncedResource({ +local image = asset.resource({ Name = "HUDF Image", Type = "HttpSynchronization", Identifier = "hudf_image", diff --git a/data/assets/scene/solarsystem/telescopes/jwst/targets/m51_image.asset b/data/assets/scene/solarsystem/telescopes/jwst/targets/m51_image.asset index 5526cfe9d3..e0b91f84f9 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/targets/m51_image.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/targets/m51_image.asset @@ -1,4 +1,4 @@ -local image = asset.syncedResource({ +local image = asset.resource({ Name = "M51 Galaxy Image", Type = "HttpSynchronization", Identifier = "m51_image", diff --git a/data/assets/scene/solarsystem/telescopes/jwst/targets/m82_image.asset b/data/assets/scene/solarsystem/telescopes/jwst/targets/m82_image.asset index adf6985ee0..306d7cbae2 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/targets/m82_image.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/targets/m82_image.asset @@ -1,4 +1,4 @@ -local image = asset.syncedResource({ +local image = asset.resource({ Name = "M82 Galaxy Image", Type = "HttpSynchronization", Identifier = "m82_image", diff --git a/data/assets/scene/solarsystem/telescopes/jwst/targets/orion_image.asset b/data/assets/scene/solarsystem/telescopes/jwst/targets/orion_image.asset index d719b6a388..0aa94d7e76 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/targets/orion_image.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/targets/orion_image.asset @@ -1,4 +1,4 @@ -local image = asset.syncedResource({ +local image = asset.resource({ Name = "Orion Image", Type = "HttpSynchronization", Identifier = "orion_image", diff --git a/data/assets/scene/solarsystem/telescopes/jwst/targets/ring_image.asset b/data/assets/scene/solarsystem/telescopes/jwst/targets/ring_image.asset index f2824dead8..9efc570156 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/targets/ring_image.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/targets/ring_image.asset @@ -1,4 +1,4 @@ -local image = asset.syncedResource({ +local image = asset.resource({ Name = "Ring Nebula Image", Type = "HttpSynchronization", Identifier = "ring_image", diff --git a/data/assets/scene/solarsystem/telescopes/jwst/targets/sn1987a_image.asset b/data/assets/scene/solarsystem/telescopes/jwst/targets/sn1987a_image.asset index 9816a43368..49fa958ce1 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/targets/sn1987a_image.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/targets/sn1987a_image.asset @@ -1,4 +1,4 @@ -local image = asset.syncedResource({ +local image = asset.resource({ Name = "Supernova SN 1987a Image", Type = "HttpSynchronization", Identifier = "sn1987a_image", diff --git a/data/assets/scene/solarsystem/telescopes/jwst/targets/trifid_image.asset b/data/assets/scene/solarsystem/telescopes/jwst/targets/trifid_image.asset index b0a6896142..2150250c01 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/targets/trifid_image.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/targets/trifid_image.asset @@ -1,4 +1,4 @@ -local image = asset.syncedResource({ +local image = asset.resource({ Name = "Trifid Nebula Image", Type = "HttpSynchronization", Identifier = "trifid_image", diff --git a/data/assets/scene/solarsystem/telescopes/jwst/trail.asset b/data/assets/scene/solarsystem/telescopes/jwst/trail.asset index bacd2e67cb..070f11312c 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/trail.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/trail.asset @@ -5,7 +5,7 @@ local sunTransforms = asset.require("scene/solarsystem/sun/transforms") -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "JWST Kernel", Type = "HttpSynchronization", Identifier = "jwst_kernels", diff --git a/data/assets/scene/solarsystem/telescopes/jwst/transforms.asset b/data/assets/scene/solarsystem/telescopes/jwst/transforms.asset index 421a9a91f5..e77f23d6f4 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/transforms.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/transforms.asset @@ -5,7 +5,7 @@ local sunTransforms = asset.require("scene/solarsystem/sun/transforms") -local kernels = asset.syncedResource({ +local kernels = asset.resource({ Name = "JWST Kernel", Type = "HttpSynchronization", Identifier = "jwst_kernels", diff --git a/data/assets/spice/base.asset b/data/assets/spice/base.asset index 31fd1fef3a..24408b5898 100644 --- a/data/assets/spice/base.asset +++ b/data/assets/spice/base.asset @@ -1,18 +1,18 @@ -local lsk = asset.syncedResource({ +local lsk = asset.resource({ Name = "General LSK Kernels", Type = "HttpSynchronization", Identifier = "general_lsk", Version = 1 }) -local pck = asset.syncedResource({ +local pck = asset.resource({ Name = "General PCK Kernels", Type = "HttpSynchronization", Identifier = "general_pck", Version = 1 }) -local spk = asset.syncedResource({ +local spk = asset.resource({ Name = "General SPK Kernels", Type = "HttpSynchronization", Identifier = "general_spk", diff --git a/data/assets/util/add_marker.asset b/data/assets/util/add_marker.asset index d7424f417a..f287a79b22 100644 --- a/data/assets/util/add_marker.asset +++ b/data/assets/util/add_marker.asset @@ -1,4 +1,4 @@ -local icons = asset.syncedResource({ +local icons = asset.resource({ Name = "Icons", Type = "HttpSynchronization", Identifier = "icons", diff --git a/data/assets/util/constellations_helper.asset b/data/assets/util/constellations_helper.asset index 8e3b8e7627..ffbce5157c 100644 --- a/data/assets/util/constellations_helper.asset +++ b/data/assets/util/constellations_helper.asset @@ -1,4 +1,4 @@ -local data = asset.syncedResource({ +local data = asset.resource({ Name = "Constellation Files", Type = "HttpSynchronization", Identifier = "digitaluniverse_constellations_data", diff --git a/data/assets/util/launcher_images.asset b/data/assets/util/launcher_images.asset index 01a474b765..9801bea354 100644 --- a/data/assets/util/launcher_images.asset +++ b/data/assets/util/launcher_images.asset @@ -1,4 +1,4 @@ -local DataPath = asset.syncedResource({ +local DataPath = asset.resource({ Name = "Launcher Images", Type = "HttpSynchronization", Identifier = "launcher_images", diff --git a/data/assets/util/static_server.asset b/data/assets/util/static_server.asset index b894061f56..b6a4c39804 100644 --- a/data/assets/util/static_server.asset +++ b/data/assets/util/static_server.asset @@ -1,6 +1,6 @@ local BackendHash = "7ca0a34e9c4c065b7bfad0623db0e322bf3e0af9" -local backend = asset.syncedResource({ +local backend = asset.resource({ Identifier = "WebGuiBackend", Name = "Web Gui Backend", Type = "UrlSynchronization", diff --git a/data/assets/util/webgui.asset b/data/assets/util/webgui.asset index 19902055cd..35f0e17cd4 100644 --- a/data/assets/util/webgui.asset +++ b/data/assets/util/webgui.asset @@ -6,7 +6,7 @@ local guiCustomization = asset.require("customization/gui") -- Select which commit hashes to use for the frontend and backend local frontendHash = "c4fccbef3051522c7b8bcd96aeb20b8126ac2286" -local frontend = asset.syncedResource({ +local frontend = asset.resource({ Identifier = "WebGuiFrontend", Name = "Web Gui Frontend", Type = "UrlSynchronization", diff --git a/src/scene/assetmanager.cpp b/src/scene/assetmanager.cpp index f29e23fb14..1a9c0ec6a7 100644 --- a/src/scene/assetmanager.cpp +++ b/src/scene/assetmanager.cpp @@ -460,8 +460,7 @@ void AssetManager::setUpAssetLuaTable(Asset* asset) { // AssetInfo // |- Exports (table) // |- Asset - // | |- localResource - // | |- syncedResource + // | |- resource // | |- require // | |- exists // | |- export @@ -498,31 +497,7 @@ void AssetManager::setUpAssetLuaTable(Asset* asset) { const int assetTableIndex = lua_gettop(*_luaState); // Register local resource function - // string localResource(string path) - ghoul::lua::push(*_luaState, asset); - lua_pushcclosure( - *_luaState, - [](lua_State* L) { - ZoneScoped; - - Asset* thisAsset = ghoul::lua::userData(L, 1); - ghoul::lua::checkArgumentsAndThrow(L, { 0, 1 }, "lua::localResourceLua"); - - auto [name] = ghoul::lua::values>(L); - std::filesystem::path path = - name.has_value() ? - thisAsset->path().parent_path() / *name : - thisAsset->path().parent_path(); - - ghoul::lua::push(L, path); - return 1; - }, - 1 - ); - lua_setfield(*_luaState, assetTableIndex, "localResource"); - - // Register synced resource function - // string syncedResource(table) + // string resource(string path or table) ghoul::lua::push(*_luaState, this, asset); lua_pushcclosure( *_luaState, @@ -531,40 +506,82 @@ void AssetManager::setUpAssetLuaTable(Asset* asset) { AssetManager* manager = ghoul::lua::userData(L, 1); Asset* thisAsset = ghoul::lua::userData(L, 2); - ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::syncedResourceLua"); - ghoul::Dictionary d = ghoul::lua::value(L); - std::unique_ptr s = - ResourceSynchronization::createFromDictionary(d); + ghoul::lua::checkArgumentsAndThrow(L, { 0, 1 }, "lua::resource"); - std::string uid = d.value("Type") + "/" + s->generateUid(); - SyncItem* syncItem = nullptr; - auto it = manager->_synchronizations.find(uid); - if (it == manager->_synchronizations.end()) { - auto si = std::make_unique(); - si->synchronization = std::move(s); - si->assets.push_back(thisAsset); - syncItem = si.get(); - manager->_synchronizations[uid] = std::move(si); + if (ghoul::lua::hasValue(L)) { + ghoul::Dictionary d = ghoul::lua::value(L); + std::unique_ptr s = + ResourceSynchronization::createFromDictionary(d); + + std::string uid = d.value("Type") + "/" + s->generateUid(); + SyncItem* syncItem = nullptr; + auto it = manager->_synchronizations.find(uid); + if (it == manager->_synchronizations.end()) { + auto si = std::make_unique(); + si->synchronization = std::move(s); + si->assets.push_back(thisAsset); + syncItem = si.get(); + manager->_synchronizations[uid] = std::move(si); + } + else { + syncItem = it->second.get(); + syncItem->assets.push_back(thisAsset); + } + + if (!syncItem->synchronization->isResolved()) { + manager->_unfinishedSynchronizations.push_back(syncItem); + } + + thisAsset->addSynchronization(syncItem->synchronization.get()); + std::filesystem::path path = syncItem->synchronization->directory(); + path += std::filesystem::path::preferred_separator; + ghoul::lua::push(L, path); + } + else if (ghoul::lua::hasValue>(L)) { + auto [name] = ghoul::lua::values>(L); + std::filesystem::path path = + name.has_value() ? + thisAsset->path().parent_path() / *name : + thisAsset->path().parent_path(); + ghoul::lua::push(L, path); } else { - syncItem = it->second.get(); - syncItem->assets.push_back(thisAsset); + ghoul::lua::luaError(L, "Invalid parameter"); } - if (!syncItem->synchronization->isResolved()) { - manager->_unfinishedSynchronizations.push_back(syncItem); - } - - thisAsset->addSynchronization(syncItem->synchronization.get()); - std::filesystem::path path = syncItem->synchronization->directory(); - path += std::filesystem::path::preferred_separator; - ghoul::lua::push(L, path); return 1; }, 2 ); + lua_setfield(*_luaState, assetTableIndex, "resource"); + + lua_pushcclosure( + *_luaState, + [](lua_State* L) { + return ghoul::lua::luaError( + L, + "'asset.localResource' has been deprecrated and should be replaced with " + "'asset.resource' instead. No change to the parameters are needed" + ); + }, + 0 + ); + lua_setfield(*_luaState, assetTableIndex, "localResource"); + + lua_pushcclosure( + *_luaState, + [](lua_State* L) { + return ghoul::lua::luaError( + L, + "'asset.syncedResource' has been deprecrated and should be replaced with " + "'asset.resource' instead. No change to the parameters are needed" + ); + }, + 0 + ); lua_setfield(*_luaState, assetTableIndex, "syncedResource"); + // Register require function // Asset require(string path, bool? explicitEnable = true) ghoul::lua::push(*_luaState, this, asset); diff --git a/tests/AssetLoaderTest/assetfunctionsexist.asset b/tests/AssetLoaderTest/assetfunctionsexist.asset index 3eb012cb33..ef16c5c9bf 100644 --- a/tests/AssetLoaderTest/assetfunctionsexist.asset +++ b/tests/AssetLoaderTest/assetfunctionsexist.asset @@ -1,6 +1,6 @@ assert(type(asset.require) == "function", "require should be function") -assert(type(asset.localResource) == "function", "localResource should be function") -assert(type(asset.syncedResource) == "function", "syncedResource should be function") +assert(type(asset.resource) == "function", "localResource should be function") +assert(type(asset.resource) == "function", "syncedResource should be function") assert(type(asset.export) == "function", "export should be function") assert(type(asset.onInitialize) == "function", "onInitialize should be function") -assert(type(asset.onDeinitialize) == "function", "onDeinitialize should be function") \ No newline at end of file +assert(type(asset.onDeinitialize) == "function", "onDeinitialize should be function") From af24a98940c8f343a2654d925c8e6c03d719a96b Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 19 Oct 2023 12:06:52 +0200 Subject: [PATCH 152/701] Ask for version in bug report template --- .github/ISSUE_TEMPLATE/bug_report.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index cd840e9382..b99f755ddc 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -4,7 +4,21 @@ about: Create a report to help us improve title: '' labels: 'Type: Bug' assignees: '' - +body: + - type: dropdown + id: version + attributes: + label: Version + description: What version of OpenSpace are you running? + options: + - `master` branch + - 0.19.2 + - 0.19.1 + - 0.19.0 + - 0.18.2 + - 0.18.1 + - 0.18.0 + default: 0 --- **Describe the bug** From 63c339af581d3786f385b63bee043755eaccce7d Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 19 Oct 2023 12:07:24 +0200 Subject: [PATCH 153/701] Update bug_report.md --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index b99f755ddc..31613c3feb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -11,7 +11,7 @@ body: label: Version description: What version of OpenSpace are you running? options: - - `master` branch + - master branch - 0.19.2 - 0.19.1 - 0.19.0 From 6ef7fba5c3fff1a23621b902479de18f356c36fb Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 30 Oct 2023 13:44:13 +1100 Subject: [PATCH 154/701] Clarify Code of Conduct --- CODE_OF_CONDUCT.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index f8489b2b7a..c6c9c1b098 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -4,11 +4,11 @@ In the interest of fostering an open and welcoming environment, we as contributo ## Our Standards Examples of behavior that contributes to creating a positive environment include: - - Using welcoming and inclusive language + - Using welcoming and inclusive language. Politeness is expected at all times. Be kind and courteous. - Being respectful of differing viewpoints and experiences - Gracefully accepting constructive criticism - Focusing on what is best for the community - - Showing empathy towards other community members + - Showing empathy towards other community members and always assume positive intent from others. Examples of unacceptable behavior by participants include: From ad99d01046ce1181ce3d727a9c764b16e00a6169 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 30 Oct 2023 14:35:28 +1100 Subject: [PATCH 155/701] Add first version of mailmap script --- .mailmap | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 .mailmap diff --git a/.mailmap b/.mailmap new file mode 100644 index 0000000000..fb93aab2ef --- /dev/null +++ b/.mailmap @@ -0,0 +1,84 @@ +Adam Rohdin +Adam Rohdin Arohdin +Adam Rohdin Arohdin + +Alexander Bock +Alexander Bock + +Anton Arbring antar420 + +Elon Olsson Elon +Elon Olsson ElonOlsson +Elon Olsson OLSSON + +Emil Axelsson +Emil Axelsson = +Emil Axelsson +Emil Axelsson + +Emilie Ho Emilie + +Emma Broman +Emma Broman +Emma Broman + +Eric Myers + +Erik Broberg +Erik Broberg nusic + +Erik Sunden eriksunden +Erik Sunden eriksunden + +Gene Payne GPayne +Gene Payne +Gene Payne + +Hans-Christian Helltegen HC Helltegen +Hans-Christian Helltegen + +Ingela Rossing Lingis +Ingela Rossing unknown + +Joakim Kilby + +Jonas Strandstedt jonasstrandstedt + +Jonathas Costa + +Kalle Bladin kalbl +Kalle Bladin Kalle +Kalle Bladin kbladin +Kalle Bladin Karl Bladin + +Karin Reidarman KarRei + +Lovisa Hassler liuloppan +Lovisa Hassler +Lovisa Hassler Your Name + +Malin Ejdbo Malin E + +Matthew Territo +Matthew Territo +Matthew Territo +Matthew Territo +Matthew Territo wundahlful +Matthew Territo wundahful +Matthew Territo + +Micah Acinapura +Micah Acinapura micahnyc +Micah Acinapura Micah +Micah Acinapura Micah + +Michal Marcinkowski michal + +Sebastian Piwell piwell + +Stefan Seibert + +Ylva Selling +Ylva Selling +Ylva Selling ENG-VIDAVIZ-0\ylvas +Ylva Selling sylvass From 549f360be6c058931a9f20b6ba3a79cc8ff69cc1 Mon Sep 17 00:00:00 2001 From: Joakim Kilby Date: Mon, 30 Oct 2023 08:38:32 +0100 Subject: [PATCH 156/701] update ghoul submodule to include hasValue optional support (#2929) --- ext/ghoul | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/ghoul b/ext/ghoul index fb549390c1..16d676f1d9 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit fb549390c101cfcaac34f490185854faeb18911d +Subproject commit 16d676f1d9b33d7fea3d01ec9d183b6310c18ba7 From 870850db07030d55d5b802981c8443a8dc9d15b1 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Sun, 5 Nov 2023 22:16:06 +0100 Subject: [PATCH 157/701] Enable warnings for missing case labels and subsequent cleanup. Updated ghoul, sgct, and codegen repository for same --- apps/OpenSpace/ext/sgct | 2 +- ext/ghoul | 2 +- modules/base/rendering/renderablelabel.cpp | 50 +++++++++---------- modules/base/rendering/renderablemodel.cpp | 6 +-- modules/base/rendering/renderableplane.cpp | 9 ++-- .../rendering/renderableplanescloud.cpp | 5 +- .../rendering/renderablefieldlines.cpp | 2 - modules/globebrowsing/src/geodeticpatch.cpp | 8 +-- modules/globebrowsing/src/gpulayergroup.cpp | 4 -- modules/globebrowsing/src/layer.cpp | 20 ++------ modules/globebrowsing/src/layeradjustment.cpp | 2 - modules/globebrowsing/src/layergroupid.h | 27 +++++++--- .../globebrowsing/src/rawtiledatareader.cpp | 9 ++-- .../src/tileprovider/temporaltileprovider.cpp | 9 ++-- .../src/tileprovider/tileproviderbyindex.cpp | 8 --- .../src/tileprovider/tileproviderbylevel.cpp | 4 -- .../globebrowsing/src/tiletextureinitdata.cpp | 5 +- modules/server/src/topics/enginemodetopic.cpp | 2 - modules/space/horizonsfile.cpp | 4 +- modules/space/kepler.cpp | 2 - modules/video/src/videoplayer.cpp | 15 +++--- src/events/event.cpp | 12 ++--- src/navigation/orbitalnavigator.cpp | 12 ++--- src/navigation/path.cpp | 24 +++++---- src/util/timemanager.cpp | 2 - .../set_openspace_compile_settings.cmake | 16 ++++-- support/coding/codegen | 2 +- 27 files changed, 116 insertions(+), 147 deletions(-) diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index cfd94f0e6a..d0003e83eb 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit cfd94f0e6af50772d1ed27136cf5190d105c6b35 +Subproject commit d0003e83eb1d4e98d84867c2ca8cf1f51bed5f95 diff --git a/ext/ghoul b/ext/ghoul index 16d676f1d9..84675b277a 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit 16d676f1d9b33d7fea3d01ec9d183b6310c18ba7 +Subproject commit 84675b277a1a6e2880661fe1c830a392a24a3636 diff --git a/modules/base/rendering/renderablelabel.cpp b/modules/base/rendering/renderablelabel.cpp index 54e1bbba80..06b91995c4 100644 --- a/modules/base/rendering/renderablelabel.cpp +++ b/modules/base/rendering/renderablelabel.cpp @@ -292,8 +292,6 @@ RenderableLabel::RenderableLabel(const ghoul::Dictionary& dictionary) case BlendMode::Additive: setRenderBin(Renderable::RenderBin::PreDeferredTransparent); break; - default: - throw ghoul::MissingCaseException(); } }); @@ -505,37 +503,37 @@ float RenderableLabel::computeFadeFactor(float distanceNodeToCamera) const { float RenderableLabel::unit(int unit) const { switch (static_cast(unit)) { - case Meter: return 1.f; - case Kilometer: return 1e3f; - case Megameter: return 1e6f; - case Gigameter: return 1e9f; + case Meter: return 1.f; + case Kilometer: return 1e3f; + case Megameter: return 1e6f; + case Gigameter: return 1e9f; case AstronomicalUnit: return 149597870700.f; - case Terameter: return 1e12f; - case Petameter: return 1e15f; - case Parsec: return static_cast(PARSEC); - case KiloParsec: return static_cast(1e3 * PARSEC); - case MegaParsec: return static_cast(1e6 * PARSEC); - case GigaParsec: return static_cast(1e9 * PARSEC); - case GigaLightyear: return static_cast(306391534.73091 * PARSEC); - default: throw std::logic_error("Missing case label"); + case Terameter: return 1e12f; + case Petameter: return 1e15f; + case Parsec: return static_cast(PARSEC); + case KiloParsec: return static_cast(1e3 * PARSEC); + case MegaParsec: return static_cast(1e6 * PARSEC); + case GigaParsec: return static_cast(1e9 * PARSEC); + case GigaLightyear: return static_cast(306391534.73091 * PARSEC); + default: throw ghoul::MissingCaseException(); } } std::string_view RenderableLabel::toString(int unit) const { switch (static_cast(unit)) { - case Meter: return MeterUnit; - case Kilometer: return KilometerUnit; - case Megameter: return MegameterUnit; - case Gigameter: return GigameterUnit; + case Meter: return MeterUnit; + case Kilometer: return KilometerUnit; + case Megameter: return MegameterUnit; + case Gigameter: return GigameterUnit; case AstronomicalUnit: return AstronomicalUnitUnit; - case Terameter: return TerameterUnit; - case Petameter: return PetameterUnit; - case Parsec: return ParsecUnit; - case KiloParsec: return KiloparsecUnit; - case MegaParsec: return MegaparsecUnit; - case GigaParsec: return GigaparsecUnit; - case GigaLightyear: return GigalightyearUnit; - default: throw std::logic_error("Missing case label"); + case Terameter: return TerameterUnit; + case Petameter: return PetameterUnit; + case Parsec: return ParsecUnit; + case KiloParsec: return KiloparsecUnit; + case MegaParsec: return MegaparsecUnit; + case GigaParsec: return GigaparsecUnit; + case GigaLightyear: return GigalightyearUnit; + default: throw ghoul::MissingCaseException(); } } diff --git a/modules/base/rendering/renderablemodel.cpp b/modules/base/rendering/renderablemodel.cpp index e9d9d0d1a9..c745d57273 100644 --- a/modules/base/rendering/renderablemodel.cpp +++ b/modules/base/rendering/renderablemodel.cpp @@ -430,8 +430,6 @@ RenderableModel::RenderableModel(const ghoul::Dictionary& dictionary) case Parameters::AnimationMode::Once: _animationMode = AnimationMode::Once; break; - default: - throw ghoul::MissingCaseException(); } } @@ -1048,7 +1046,7 @@ void RenderableModel::update(const UpdateData& data) { if (_geometry->hasAnimation() && !_animationStart.empty()) { - double relativeTime; + double relativeTime = 0.0; double now = data.time.j2000Seconds(); double startTime = data.time.convertTime(_animationStart); double duration = _geometry->animationDuration(); @@ -1109,8 +1107,6 @@ void RenderableModel::update(const UpdateData& data) { relativeTime = duration; } break; - default: - throw ghoul::MissingCaseException(); } _geometry->update(relativeTime); } diff --git a/modules/base/rendering/renderableplane.cpp b/modules/base/rendering/renderableplane.cpp index 37e688e08f..ae5cb7d3e5 100644 --- a/modules/base/rendering/renderableplane.cpp +++ b/modules/base/rendering/renderableplane.cpp @@ -156,15 +156,14 @@ RenderablePlane::RenderablePlane(const ghoul::Dictionary& dictionary) { static_cast(BlendMode::Additive), "Additive"} }); _blendMode.onChange([this]() { - switch (_blendMode) { - case static_cast(BlendMode::Normal): + BlendMode m = static_cast(_blendMode.value()); + switch (m) { + case BlendMode::Normal: setRenderBinFromOpacity(); break; - case static_cast(BlendMode::Additive): + case BlendMode::Additive: setRenderBin(Renderable::RenderBin::PreDeferredTransparent); break; - default: - throw ghoul::MissingCaseException(); } }); diff --git a/modules/digitaluniverse/rendering/renderableplanescloud.cpp b/modules/digitaluniverse/rendering/renderableplanescloud.cpp index c599f429fb..ac884fe09f 100644 --- a/modules/digitaluniverse/rendering/renderableplanescloud.cpp +++ b/modules/digitaluniverse/rendering/renderableplanescloud.cpp @@ -266,15 +266,14 @@ RenderablePlanesCloud::RenderablePlanesCloud(const ghoul::Dictionary& dictionary { BlendModeAdditive, "Additive" } }); _blendMode.onChange([this]() { - switch (_blendMode) { + BlendMode m = static_cast(_blendMode.value()); + switch (m) { case BlendModeNormal: setRenderBin(Renderable::RenderBin::Opaque); break; case BlendModeAdditive: setRenderBin(Renderable::RenderBin::PreDeferredTransparent); break; - default: - throw ghoul::MissingCaseException(); } }); diff --git a/modules/fieldlines/rendering/renderablefieldlines.cpp b/modules/fieldlines/rendering/renderablefieldlines.cpp index 220a68a6b8..6a2c56b0ce 100644 --- a/modules/fieldlines/rendering/renderablefieldlines.cpp +++ b/modules/fieldlines/rendering/renderablefieldlines.cpp @@ -359,8 +359,6 @@ void RenderableFieldlines::loadSeedPoints() { case SeedPointSourceTable: loadSeedPointsFromTable(); break; - default: - throw ghoul::MissingCaseException(); } } diff --git a/modules/globebrowsing/src/geodeticpatch.cpp b/modules/globebrowsing/src/geodeticpatch.cpp index 7d8167f8dd..1dd0102f3d 100644 --- a/modules/globebrowsing/src/geodeticpatch.cpp +++ b/modules/globebrowsing/src/geodeticpatch.cpp @@ -106,10 +106,10 @@ Geodetic2 GeodeticPatch::size() const { Geodetic2 GeodeticPatch::corner(Quad q) const { switch (q) { - case NORTH_WEST: return Geodetic2{ maxLat(), minLon() };// northWestCorner(); - case NORTH_EAST: return Geodetic2{ maxLat(), maxLon() };// northEastCorner(); - case SOUTH_WEST: return Geodetic2{ minLat(), minLon() };// southWestCorner(); - case SOUTH_EAST: return Geodetic2{ minLat(), maxLon() };// southEastCorner(); + case NORTH_WEST: return Geodetic2{ maxLat(), minLon() }; // northWestCorner(); + case NORTH_EAST: return Geodetic2{ maxLat(), maxLon() }; // northEastCorner(); + case SOUTH_WEST: return Geodetic2{ minLat(), minLon() }; // southWestCorner(); + case SOUTH_EAST: return Geodetic2{ minLat(), maxLon() }; // southEastCorner(); default: throw ghoul::MissingCaseException(); } } diff --git a/modules/globebrowsing/src/gpulayergroup.cpp b/modules/globebrowsing/src/gpulayergroup.cpp index 8aa8a347b1..c94916a6e3 100644 --- a/modules/globebrowsing/src/gpulayergroup.cpp +++ b/modules/globebrowsing/src/gpulayergroup.cpp @@ -99,8 +99,6 @@ void GPULayerGroup::setValue(ghoul::opengl::ProgramObject& program, case layers::Layer::ID::SolidColor: program.setUniform(galuc.color, al.solidColor()); break; - default: - throw ghoul::MissingCaseException(); } if (gal.isHeightLayer) { @@ -165,8 +163,6 @@ void GPULayerGroup::bind(ghoul::opengl::ProgramObject& p, const LayerGroup& laye case layers::Layer::ID::SolidColor: galuc.color = p.uniformLocation(name + "color"); break; - default: - throw ghoul::MissingCaseException(); } if (gal.isHeightLayer) { diff --git a/modules/globebrowsing/src/layer.cpp b/modules/globebrowsing/src/layer.cpp index 867bfcbc94..f82930fe5d 100644 --- a/modules/globebrowsing/src/layer.cpp +++ b/modules/globebrowsing/src/layer.cpp @@ -209,16 +209,10 @@ Layer::Layer(layers::Group::ID id, const ghoul::Dictionary& layerDict, LayerGrou { const Parameters p = codegen::bake(layerDict); - layers::Layer::ID typeID; - if (p.type.has_value()) { - typeID = ghoul::from_string(*p.type); - if (typeID == layers::Layer::ID::Unknown) { - throw ghoul::RuntimeError("Unknown layer type"); - } - } - else { - typeID = layers::Layer::ID::DefaultTileProvider; - } + layers::Layer::ID typeID = + p.type.has_value() ? + ghoul::from_string(*p.type) : + layers::Layer::ID::DefaultTileProvider; initializeBasedOnType(typeID, layerDict); @@ -330,8 +324,6 @@ Layer::Layer(layers::Group::ID id, const ghoul::Dictionary& layerDict, LayerGrou case layers::Layer::ID::SolidColor: removeProperty(_solidColor); break; - default: - throw ghoul::MissingCaseException(); } _typeId = static_cast(_typeOption.value()); @@ -502,8 +494,6 @@ void Layer::initializeBasedOnType(layers::Layer::ID id, ghoul::Dictionary initDi _solidColor = initDict.value(ColorInfo.identifier); } break; - default: - throw ghoul::MissingCaseException(); } } @@ -527,8 +517,6 @@ void Layer::addVisibleProperties() { case layers::Layer::ID::SolidColor: addProperty(_solidColor); break; - default: - throw ghoul::MissingCaseException(); } } diff --git a/modules/globebrowsing/src/layeradjustment.cpp b/modules/globebrowsing/src/layeradjustment.cpp index 7df1815327..448acee1ae 100644 --- a/modules/globebrowsing/src/layeradjustment.cpp +++ b/modules/globebrowsing/src/layeradjustment.cpp @@ -126,8 +126,6 @@ void LayerAdjustment::setValuesFromDictionary(const ghoul::Dictionary& adjustmen case Parameters::Type::TransferFunction: _typeOption = static_cast(layers::Adjustment::ID::TransferFunction); break; - default: - throw ghoul::MissingCaseException(); } } diff --git a/modules/globebrowsing/src/layergroupid.h b/modules/globebrowsing/src/layergroupid.h index 146482621f..525c859d8f 100644 --- a/modules/globebrowsing/src/layergroupid.h +++ b/modules/globebrowsing/src/layergroupid.h @@ -88,8 +88,7 @@ struct Layer { TileProviderByLevel, SolidColor, SpoutImageProvider, - VideoTileProvider, - Unknown + VideoTileProvider }; ID id; @@ -206,9 +205,15 @@ constexpr openspace::globebrowsing::layers::Layer::ID from_string(std::string_vi return li.identifier == string; } ); - return it != openspace::globebrowsing::layers::Layers.end() ? - it->id : - openspace::globebrowsing::layers::Layer::ID::Unknown; + + if (it != openspace::globebrowsing::layers::Layers.end()) { + return it->id; + } + else { + throw ghoul::RuntimeError(fmt::format( + "Could not find Layer of type '{}'", string + )); + } } template <> @@ -221,9 +226,15 @@ constexpr openspace::globebrowsing::layers::Group::ID from_string(std::string_vi return gi.identifier == string; } ); - return it != openspace::globebrowsing::layers::Groups.end() ? - it->id : - openspace::globebrowsing::layers::Group::ID::Unknown; + + if (it != openspace::globebrowsing::layers::Groups.end()) { + return it->id; + } + else { + throw ghoul::RuntimeError(fmt::format( + "Could not find Group of type '{}'", string + )); + } } template <> diff --git a/modules/globebrowsing/src/rawtiledatareader.cpp b/modules/globebrowsing/src/rawtiledatareader.cpp index c0678b88e1..14fe3a01a8 100644 --- a/modules/globebrowsing/src/rawtiledatareader.cpp +++ b/modules/globebrowsing/src/rawtiledatareader.cpp @@ -109,9 +109,12 @@ GDALDataType toGDALDataType(GLenum glType) { case GL_DOUBLE: return GDT_Float64; default: - LERRORC("GDALRawTileDataReader", fmt::format( - "OpenGL data type unknown to GDAL: {}", static_cast(glType) - )); + LERRORC( + "GDALRawTileDataReader", + fmt::format( + "OpenGL data type unknown to GDAL: {}", static_cast(glType) + ) + ); throw ghoul::MissingCaseException(); } } diff --git a/modules/globebrowsing/src/tileprovider/temporaltileprovider.cpp b/modules/globebrowsing/src/tileprovider/temporaltileprovider.cpp index e080d59bc7..8124b89df0 100644 --- a/modules/globebrowsing/src/tileprovider/temporaltileprovider.cpp +++ b/modules/globebrowsing/src/tileprovider/temporaltileprovider.cpp @@ -452,7 +452,8 @@ DefaultTileProvider* TemporalTileProvider::retrieveTileProvider(const Time& t) { ); return std::string_view(it->second); } - default: throw ghoul::MissingCaseException(); + default: + throw ghoul::MissingCaseException(); }; }(); @@ -650,7 +651,8 @@ TileProvider* TemporalTileProvider::tileProvider(const Time& time) { return tileProvider(time); case Mode::Prototype: return tileProvider(time); - default: throw ghoul::MissingCaseException(); + default: + throw ghoul::MissingCaseException(); } } else { @@ -659,7 +661,8 @@ TileProvider* TemporalTileProvider::tileProvider(const Time& time) { return tileProvider(time); case Mode::Prototype: return tileProvider(time); - default: throw ghoul::MissingCaseException(); + default: + throw ghoul::MissingCaseException(); } } } diff --git a/modules/globebrowsing/src/tileprovider/tileproviderbyindex.cpp b/modules/globebrowsing/src/tileprovider/tileproviderbyindex.cpp index 4b05839083..4b603e88df 100644 --- a/modules/globebrowsing/src/tileprovider/tileproviderbyindex.cpp +++ b/modules/globebrowsing/src/tileprovider/tileproviderbyindex.cpp @@ -73,10 +73,6 @@ TileProviderByIndex::TileProviderByIndex(const ghoul::Dictionary& dictionary) { if (p.defaultProvider.hasValue("Type")) { std::string type = p.defaultProvider.value("Type"); typeID = ghoul::from_string(type); - - if (typeID == layers::Layer::ID::Unknown) { - throw ghoul::RuntimeError("Unknown layer type: " + type); - } } _defaultTileProvider = createFromDictionary(typeID, p.defaultProvider); @@ -92,10 +88,6 @@ TileProviderByIndex::TileProviderByIndex(const ghoul::Dictionary& dictionary) { if (ip.tileProvider.hasValue("Type")) { std::string type = ip.tileProvider.value("Type"); providerID = ghoul::from_string(type); - - if (providerID == layers::Layer::ID::Unknown) { - throw ghoul::RuntimeError("Unknown layer type: " + type); - } } std::unique_ptr stp = createFromDictionary( diff --git a/modules/globebrowsing/src/tileprovider/tileproviderbylevel.cpp b/modules/globebrowsing/src/tileprovider/tileproviderbylevel.cpp index 0e0f439bfc..7683db051d 100644 --- a/modules/globebrowsing/src/tileprovider/tileproviderbylevel.cpp +++ b/modules/globebrowsing/src/tileprovider/tileproviderbylevel.cpp @@ -67,10 +67,6 @@ TileProviderByLevel::TileProviderByLevel(const ghoul::Dictionary& dictionary) { if (tileProviderDict.hasValue("Type")) { std::string type = tileProviderDict.value("Type"); typeID = ghoul::from_string(type); - - if (typeID == layers::Layer::ID::Unknown) { - throw ghoul::RuntimeError("Unknown layer type: " + type); - } } std::unique_ptr tp = createFromDictionary(typeID, tileProviderDict); diff --git a/modules/globebrowsing/src/tiletextureinitdata.cpp b/modules/globebrowsing/src/tiletextureinitdata.cpp index 6b195aae4b..052a0b1168 100644 --- a/modules/globebrowsing/src/tiletextureinitdata.cpp +++ b/modules/globebrowsing/src/tiletextureinitdata.cpp @@ -39,7 +39,6 @@ size_t numberOfRasters(ghoul::opengl::Texture::Format format) { case ghoul::opengl::Texture::Format::BGRA: return 4; default: - ghoul_assert(false, "Unknown format"); throw ghoul::MissingCaseException(); } } @@ -56,7 +55,6 @@ size_t numberOfBytes(GLenum glType) { case GL_FLOAT: return sizeof(GLfloat); case GL_DOUBLE: return sizeof(GLdouble); default: - ghoul_assert(false, "Unknown data type"); throw ghoul::MissingCaseException(); } } @@ -151,9 +149,8 @@ TileTextureInitData tileTextureInitData(layers::Group::ID id, ghoul::opengl::Texture::Format::BGRA ); } - default: { + default: throw ghoul::MissingCaseException(); - } } } diff --git a/modules/server/src/topics/enginemodetopic.cpp b/modules/server/src/topics/enginemodetopic.cpp index 0cae8f820d..843ba71dce 100644 --- a/modules/server/src/topics/enginemodetopic.cpp +++ b/modules/server/src/topics/enginemodetopic.cpp @@ -101,8 +101,6 @@ void EngineModeTopic::sendJsonData() { case OpenSpaceEngine::Mode::CameraPath: modeString = "camera_path"; break; - default: - throw ghoul::MissingCaseException(); } stateJson["mode"] = modeString; diff --git a/modules/space/horizonsfile.cpp b/modules/space/horizonsfile.cpp index 83ceae3953..08442195ee 100644 --- a/modules/space/horizonsfile.cpp +++ b/modules/space/horizonsfile.cpp @@ -92,8 +92,8 @@ std::string constructHorizonsUrl(HorizonsType type, const std::string& target, case HorizonsType::Observer: url = ObserverUrl; break; - default: - throw ghoul::MissingCaseException(); + case HorizonsType::Invalid: + break; } url += fmt::format( diff --git a/modules/space/kepler.cpp b/modules/space/kepler.cpp index 1af07182bb..ef5e40e508 100644 --- a/modules/space/kepler.cpp +++ b/modules/space/kepler.cpp @@ -756,8 +756,6 @@ std::vector readFile(std::filesystem::path file, Format format) { case Format::SBDB: res = readSbdbFile(file); break; - default: - throw ghoul::MissingCaseException(); } LINFO(fmt::format("Saving cache {} for Kepler file {}", cachedFile, file)); diff --git a/modules/video/src/videoplayer.cpp b/modules/video/src/videoplayer.cpp index ca44dc492c..32e9a81b06 100644 --- a/modules/video/src/videoplayer.cpp +++ b/modules/video/src/videoplayer.cpp @@ -266,15 +266,12 @@ VideoPlayer::VideoPlayer(const ghoul::Dictionary& dictionary) if (p.playbackMode.has_value()) { switch (*p.playbackMode) { - case Parameters::PlaybackMode::RealTimeLoop: - _playbackMode = PlaybackMode::RealTimeLoop; - break; - case Parameters::PlaybackMode::MapToSimulationTime: - _playbackMode = PlaybackMode::MapToSimulationTime; - break; - default: - LERROR("Missing playback mode in VideoTileProvider"); - throw ghoul::MissingCaseException(); + case Parameters::PlaybackMode::RealTimeLoop: + _playbackMode = PlaybackMode::RealTimeLoop; + break; + case Parameters::PlaybackMode::MapToSimulationTime: + _playbackMode = PlaybackMode::MapToSimulationTime; + break; } } diff --git a/src/events/event.cpp b/src/events/event.cpp index 1bcc037f4e..587e9079cd 100644 --- a/src/events/event.cpp +++ b/src/events/event.cpp @@ -107,7 +107,8 @@ void log(int i, const EventCameraFocusTransition& e) { return "Receding"; case EventCameraFocusTransition::Transition::Exiting: return "Exiting"; - default: throw ghoul::MissingCaseException(); + default: + throw ghoul::MissingCaseException(); } }(e.transition); @@ -349,8 +350,6 @@ ghoul::Dictionary toParameter(const Event& e) { case EventParallelConnection::State::HostshipLost: d.setValue("State", "HostshipLost"s); break; - default: - throw ghoul::MissingCaseException(); } break; case Event::Type::ApplicationShutdown: @@ -400,8 +399,6 @@ ghoul::Dictionary toParameter(const Event& e) { case EventCameraFocusTransition::Transition::Exiting: d.setValue("Transition", "Exiting"s); break; - default: - throw ghoul::MissingCaseException(); } break; case Event::Type::PlanetEclipsed: @@ -592,11 +589,12 @@ void logAllEvents(const Event* e) { case Event::Type::CameraPathFinished: log(i, *static_cast(e)); break; + case Event::Type::CameraMovedPosition: + log(i, *static_cast(e)); + break; case Event::Type::Custom: log(i, *static_cast(e)); break; - default: - throw ghoul::MissingCaseException(); } i++; diff --git a/src/navigation/orbitalnavigator.cpp b/src/navigation/orbitalnavigator.cpp index cb194b3047..d4b663dae6 100644 --- a/src/navigation/orbitalnavigator.cpp +++ b/src/navigation/orbitalnavigator.cpp @@ -1634,14 +1634,10 @@ void OrbitalNavigator::rotateAroundAnchorUp(double deltaTime, double speedScale, { const glm::dvec3 axis = [](UpDirectionChoice upAxis) { switch (upAxis) { - case UpDirectionChoice::XAxis: - return glm::dvec3(1.0, 0.0, 0.0); - case UpDirectionChoice::YAxis: - return glm::dvec3(0.0, 1.0, 0.0); - case UpDirectionChoice::ZAxis: - return glm::dvec3(0.0, 0.0, 1.0); - default: - throw ghoul::MissingCaseException(); + case UpDirectionChoice::XAxis: return glm::dvec3(1.0, 0.0, 0.0); + case UpDirectionChoice::YAxis: return glm::dvec3(0.0, 1.0, 0.0); + case UpDirectionChoice::ZAxis: return glm::dvec3(0.0, 0.0, 1.0); + default: throw ghoul::MissingCaseException(); } }(UpDirectionChoice(_upToUseForRotation.value())); diff --git a/src/navigation/path.cpp b/src/navigation/path.cpp index d6cd9b1a04..e4a723c08f 100644 --- a/src/navigation/path.cpp +++ b/src/navigation/path.cpp @@ -96,9 +96,10 @@ namespace { namespace openspace::interaction { -Path::Path(Waypoint start, Waypoint end, Type type, - std::optional duration) - : _start(start), _end(end), _type(type) +Path::Path(Waypoint start, Waypoint end, Type type, std::optional duration) + : _start(start) + , _end(end) + , _type(type) { switch (_type) { case Type::AvoidCollision: @@ -111,9 +112,6 @@ Path::Path(Waypoint start, Waypoint end, Type type, case Type::ZoomOutOverview: _curve = std::make_unique(_start, _end); break; - default: - LERROR("Could not create curve. Type does not exist"); - throw ghoul::MissingCaseException(); } _prevPose = _start.pose(); @@ -133,11 +131,17 @@ Path::Path(Waypoint start, Waypoint end, Type type, } } -Waypoint Path::startPoint() const { return _start; } +Waypoint Path::startPoint() const { + return _start; +} -Waypoint Path::endPoint() const { return _end; } +Waypoint Path::endPoint() const { + return _end; +} -double Path::pathLength() const { return _curve->length(); } +double Path::pathLength() const { + return _curve->length(); +} std::vector Path::controlPoints() const { return _curve->points(); @@ -570,8 +574,6 @@ Path createPathFromDictionary(const ghoul::Dictionary& dictionary, waypoints = { computeWaypointFromNodeInfo(info, startPoint, isLinear) }; break; } - default: - throw ghoul::MissingCaseException(); } // @TODO (emmbr) Allow for an instruction to represent a list of multiple waypoints diff --git a/src/util/timemanager.cpp b/src/util/timemanager.cpp index 94ed7f7700..c25030813a 100644 --- a/src/util/timemanager.cpp +++ b/src/util/timemanager.cpp @@ -952,8 +952,6 @@ void TimeManager::setTimeFromProfile(const Profile& p) { case Profile::Time::Type::Absolute: _currentTime.data() = Time(p.time->value); break; - default: - throw ghoul::MissingCaseException(); } setPause(p.time->startPaused); diff --git a/support/cmake/set_openspace_compile_settings.cmake b/support/cmake/set_openspace_compile_settings.cmake index 7c5aa040f0..ed62bc3fdf 100644 --- a/support/cmake/set_openspace_compile_settings.cmake +++ b/support/cmake/set_openspace_compile_settings.cmake @@ -28,6 +28,11 @@ function (set_openspace_compile_settings target) set(MSVC_WARNINGS "/MP" # Multi-threading support "/W4" # Highest warning level + "/w44062" # missing case label + "/w44289" # using for-loop variable outside of loop + "/w44296" # expression is always true/false + "/w45041" # out-of-line definition for constexpr data is deprecated + "/w45204" # virtual class has non-virtual trivial destructor "/wd4127" # conditional expression is constant [raised by: websocketpp] "/wd4201" # nonstandard extension used : nameless struct/union [raised by: GLM] "/wd5030" # attribute 'attribute' is not recognized [raised by: codegen] @@ -185,10 +190,13 @@ function (set_openspace_compile_settings target) target_compile_options(${target} PRIVATE ${MSVC_WARNINGS}) # Boost as of 1.64 still uses unary_function unless we define this - target_compile_definitions(${target} PRIVATE "_HAS_AUTO_PTR_ETC") - target_compile_definitions(${target} PRIVATE "NOMINMAX") - target_compile_definitions(${target} PRIVATE "WIN32_LEAN_AND_MEAN") - target_compile_definitions(${target} PRIVATE "VC_EXTRALEAN") + target_compile_definitions(${target} + PRIVATE "_HAS_AUTO_PTR_ETC" + PUBLIC "_CRT_SECURE_NO_WARNINGS" + PRIVATE "NOMINMAX" + PRIVATE "WIN32_LEAN_AND_MEAN" + PRIVATE "VC_EXTRALEAN" + ) elseif (NOT LINUX AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") # Apple has "deprecated" OpenGL and offers nothing but warnings instead target_compile_definitions(${target} PRIVATE "GL_SILENCE_DEPRECATION") diff --git a/support/coding/codegen b/support/coding/codegen index 4c174e8c13..abe1b74019 160000 --- a/support/coding/codegen +++ b/support/coding/codegen @@ -1 +1 @@ -Subproject commit 4c174e8c13c758cde84cdcfda9dc6d62c8d09cff +Subproject commit abe1b74019f332c1e5a62774776bf11d42cf8f85 From e5672e2652f3a0e058f553538301c2c6b9d1b9f4 Mon Sep 17 00:00:00 2001 From: Andreas Engberg <48772850+engbergandreas@users.noreply.github.com> Date: Mon, 6 Nov 2023 11:06:35 +0100 Subject: [PATCH 158/701] Update HttpSynchronization to keep track of files downloaded (#2587) (#2930) * Update HttpSynchronization to keep track of files downloaded (#2587) Reads ossync file on synchronization and download files that are missing * Apply suggestions from code review Co-authored-by: Alexander Bock * Apply suggestions from code review * Fixed merge conflict errors * Fixed asset being rejected on successful sync * Add enum for download fail/success, sleep between download retries. Removed comments and todos * Fixed PR comments --------- Co-authored-by: Alexander Bock --- .../openspace/util/resourcesynchronization.h | 2 +- modules/sync/syncs/httpsynchronization.cpp | 168 ++++++++++++++++-- modules/sync/syncs/httpsynchronization.h | 24 ++- src/util/resourcesynchronization.cpp | 2 +- 4 files changed, 182 insertions(+), 14 deletions(-) diff --git a/include/openspace/util/resourcesynchronization.h b/include/openspace/util/resourcesynchronization.h index 6dcd442f24..1849a4b7ba 100644 --- a/include/openspace/util/resourcesynchronization.h +++ b/include/openspace/util/resourcesynchronization.h @@ -181,7 +181,7 @@ protected: /// Creates a file next to the directory that indicates that this /// ResourceSynchronization has successfully synchronized its contents - void createSyncFile() const; + virtual void createSyncFile(bool isFullySynchronized = true) const; /// Returns whether the synchronization file create in #createSyncFile exists bool hasSyncFile() const; diff --git a/modules/sync/syncs/httpsynchronization.cpp b/modules/sync/syncs/httpsynchronization.cpp index 6404c86f18..75999567ed 100644 --- a/modules/sync/syncs/httpsynchronization.cpp +++ b/modules/sync/syncs/httpsynchronization.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include namespace { @@ -36,6 +37,9 @@ namespace { constexpr int ApplicationVersion = 1; + constexpr std::string_view OssyncVersionNumber = "1.0"; + constexpr std::string_view SynchronizationToken = "Synchronized"; + struct [[codegen::Dictionary(HttpSynchronization)]] Parameters { // The unique identifier for this resource that is used to request a set of files // from the synchronization servers @@ -97,11 +101,16 @@ void HttpSynchronization::start() { } _state = State::Syncing; - if (hasSyncFile()) { + bool isSynced = isEachFileDownloaded(); + if (isSynced) { _state = State::Resolved; return; } + if (isRejected()) { + return; + } + std::string query = fmt::format( "?identifier={}&file_version={}&application_version={}", _identifier, _version, ApplicationVersion @@ -110,14 +119,32 @@ void HttpSynchronization::start() { _syncThread = std::thread( [this](const std::string& q) { for (const std::string& url : _syncRepositories) { - const bool success = trySyncFromUrl(url + q); - if (success) { - createSyncFile(); - _state = State::Resolved; - return; + const SynchronizationState syncState = trySyncFromUrl(url + q); + + // Could not get this sync repository list of files. + if (syncState == SynchronizationState::ListDownloadFail) { + continue; } + + if (syncState == SynchronizationState::Success) { + _state = State::Resolved; + createSyncFile(true); + } + else if (syncState == SynchronizationState::FileDownloadFail) { + // If it was not successful we should add any files that were + // potentially downloaded to avoid downloading from other repositories + _existingSyncedFiles.insert( + _existingSyncedFiles.end(), + _newSyncedFiles.begin(), + _newSyncedFiles.end() + ); + _newSyncedFiles.clear(); + createSyncFile(false); + } + break; } - if (!_shouldCancel) { + + if (!isResolved() && !_shouldCancel) { _state = State::Rejected; } }, @@ -134,7 +161,88 @@ std::string HttpSynchronization::generateUid() { return fmt::format("{}/{}", _identifier, _version); } -bool HttpSynchronization::trySyncFromUrl(std::string listUrl) { +void HttpSynchronization::createSyncFile(bool isFullySynchronized) const { + std::filesystem::path dir = directory(); + std::filesystem::create_directories(dir); + + dir.replace_extension("ossync"); + std::ofstream syncFile(dir, std::ofstream::out); + + syncFile << fmt::format( + "{}\n{}\n", + OssyncVersionNumber, + (isFullySynchronized ? SynchronizationToken : "Partial Synchronized") + ); + + if (isFullySynchronized) { + // All files successfully downloaded, no need to write anything else to file + return; + } + + // Store all files that successfully downloaded + for (const std::string& fileURL : _existingSyncedFiles) { + syncFile << fileURL << '\n'; + } +} + +bool HttpSynchronization::isEachFileDownloaded() { + std::filesystem::path path = directory(); + path.replace_extension("ossync"); + // Check if file exists at all + if (!std::filesystem::is_regular_file(path)) { + return false; + } + + // Read contents of file + std::ifstream file(path); + std::string line; + + file >> line; + // Ossync files that does not have a version number are already resolved + // As they are of the previous format. + if (line == SynchronizationToken) { + return true; + } + // Otherwise first line is the version number. + std::string ossyncVersion = line; + + /* + Format of 1.0 ossync: + Version number: E.g., 1.0 + Synchronization status: Synchronized or Partial Synchronized + Optionally list of already synched files + */ + + if (ossyncVersion == OssyncVersionNumber) { + std::getline(file >> std::ws, line); // Read synchronization status + if (line == SynchronizationToken) { + return true; + } + // File is only partially synchronized, + // store file urls that have been synched already + while (file >> line) { + if (line.empty() || line[0] == '#') { + // Skip all empty lines and commented out lines + continue; + } + _existingSyncedFiles.push_back(line); + } + } + else { + LERROR(fmt::format( + "{}: Unknown ossync version number read." + "Got {} while {} and below are valid.", + _identifier, + ossyncVersion, + OssyncVersionNumber + )); + _state = State::Rejected; + } + return false; +} + +HttpSynchronization::SynchronizationState +HttpSynchronization::trySyncFromUrl(std::string listUrl) { HttpMemoryDownload fileListDownload(std::move(listUrl)); fileListDownload.onProgress([&c = _shouldCancel](int64_t, std::optional) { return !c; @@ -145,7 +253,7 @@ bool HttpSynchronization::trySyncFromUrl(std::string listUrl) { const std::vector& buffer = fileListDownload.downloadedData(); if (!success) { LERRORC("HttpSynchronization", std::string(buffer.begin(), buffer.end())); - return false; + return SynchronizationState::ListDownloadFail; } _nSynchronizedBytes = 0; @@ -184,6 +292,18 @@ bool HttpSynchronization::trySyncFromUrl(std::string listUrl) { continue; } + // If the file is among the stored files in ossync we ignore that download + auto it = std::find( + _existingSyncedFiles.begin(), + _existingSyncedFiles.end(), + line + ); + + if (it != _existingSyncedFiles.end()) { + // File has already been synced + continue; + } + auto download = std::make_unique( line, destination, @@ -222,6 +342,28 @@ bool HttpSynchronization::trySyncFromUrl(std::string listUrl) { } startedAllDownloads = true; + constexpr int MaxDownloadRetries = 5; + int downloadTry = 0; + // If a download has failed try to restart it + while (downloadTry < MaxDownloadRetries) { + bool downloadSucceeded = true; + + for (const std::unique_ptr& d : downloads) { + d->wait(); + if (d->hasFailed()) { + d->start(); + downloadSucceeded = false; + } + } + if (downloadSucceeded) { + break; + } + else { + ++downloadTry; + std::this_thread::sleep_for(std::chrono::seconds(1)); + } + } + bool failed = false; for (const std::unique_ptr& d : downloads) { d->wait(); @@ -278,10 +420,14 @@ bool HttpSynchronization::trySyncFromUrl(std::string listUrl) { } if (failed) { for (const std::unique_ptr& d : downloads) { - d->cancel(); + // Store all files that were synced to the ossync + if (d->hasSucceeded()) { + _newSyncedFiles.push_back(d->url()); + } } + return SynchronizationState::FileDownloadFail; } - return !failed; + return SynchronizationState::Success; } } // namespace openspace diff --git a/modules/sync/syncs/httpsynchronization.h b/modules/sync/syncs/httpsynchronization.h index fa7d768221..ed7c6c0317 100644 --- a/modules/sync/syncs/httpsynchronization.h +++ b/modules/sync/syncs/httpsynchronization.h @@ -92,9 +92,25 @@ public: static documentation::Documentation Documentation(); +protected: + /// Creates a file next to the directory that indicates that this + /// ResourceSynchronization has successfully synchronized its contents + void createSyncFile(bool isFullySynchronized = true) const override; + + /// Check ossync file and returns true if all files are downloaded or false + /// if partially synched or if there is an ossync file error (rejected) + bool isEachFileDownloaded(); + + /// Representation of 'global' synchronization state that encodes where a fail happen. + enum class SynchronizationState { + Success, + ListDownloadFail, + FileDownloadFail + }; + private: /// Tries to get a reply from the provided URL and returns that success to the caller - bool trySyncFromUrl(std::string url); + SynchronizationState trySyncFromUrl(std::string url); /// Contains a flag whether the current transfer should be cancelled std::atomic_bool _shouldCancel = false; @@ -110,6 +126,12 @@ private: // The thread that will be doing the synchronization std::thread _syncThread; + + // The files that have already been synchronized + std::vector _existingSyncedFiles; + + // The files that have been synchronized this time + std::vector _newSyncedFiles; }; } // namespace openspace diff --git a/src/util/resourcesynchronization.cpp b/src/util/resourcesynchronization.cpp index 1a7165bb7f..411719457b 100644 --- a/src/util/resourcesynchronization.cpp +++ b/src/util/resourcesynchronization.cpp @@ -105,7 +105,7 @@ const std::string& ResourceSynchronization::name() const { return _name; } -void ResourceSynchronization::createSyncFile() const { +void ResourceSynchronization::createSyncFile(bool isFullySynchronized) const { std::filesystem::path dir = directory(); std::filesystem::create_directories(dir); From d0efe88aa2d1564da2e0c2f3c40e38bd17e6090e Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 6 Nov 2023 16:25:41 +0100 Subject: [PATCH 159/701] Fix capitalization of lagrange points GuiPath (closes #2934) --- .../solarsystem/planets/earth/lagrange_points/l5.asset | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l5.asset b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l5.asset index b0368bd06c..952e5efe30 100644 --- a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l5.asset +++ b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l5.asset @@ -33,7 +33,7 @@ local L5Position = { Tag = { "lagrange_points_earth", "lagrange_points_earth_l5" }, GUI = { Name = "L5 Position", - Path = "/Solar System/Planets/Earth/Lagrange points", + Path = "/Solar System/Planets/Earth/Lagrange Points", Hidden = true } } @@ -51,7 +51,7 @@ local L5 = { Tag = { "lagrange_points_earth", "lagrange_points_earth_l5" }, GUI = { Name = "L5", - Path = "/Solar System/Planets/Earth/Lagrange points" + Path = "/Solar System/Planets/Earth/Lagrange Points" } } @@ -71,7 +71,7 @@ local L5Label = { Tag = { "lagrange_points_earth", "lagrange_points_earth_l5" }, GUI = { Name = "L5 Label", - Path = "/Solar System/Planets/Earth/Lagrange points", + Path = "/Solar System/Planets/Earth/Lagrange Points", Description = "Main label for L5" } } From d38f2583caaab7b8f93db48745c886685ab07ceb Mon Sep 17 00:00:00 2001 From: Andreas Engberg Date: Tue, 7 Nov 2023 09:19:22 +0100 Subject: [PATCH 160/701] Fixed: Stopping all http downloads if user exits program --- modules/sync/syncs/httpsynchronization.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/sync/syncs/httpsynchronization.cpp b/modules/sync/syncs/httpsynchronization.cpp index 75999567ed..199e78c7f9 100644 --- a/modules/sync/syncs/httpsynchronization.cpp +++ b/modules/sync/syncs/httpsynchronization.cpp @@ -350,12 +350,18 @@ HttpSynchronization::trySyncFromUrl(std::string listUrl) { for (const std::unique_ptr& d : downloads) { d->wait(); + + // If the user exits the program we don't want to start new downloads + if (_shouldCancel) { + break; + } + if (d->hasFailed()) { d->start(); downloadSucceeded = false; } } - if (downloadSucceeded) { + if (downloadSucceeded || _shouldCancel) { break; } else { From eeb536c9e1c1bddbfe130b1f4ec0eaa10fadb8af Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Tue, 7 Nov 2023 16:19:59 +0100 Subject: [PATCH 161/701] Add the ability to set individual commandline options at the expense of a generic Lua script Note breaking change: Previously `--config` specified one or more Lua scripts that were executed to update the configuration state, now the `--config` sets the path to the window configuration instead --- .../ext/launcher/include/launcherwindow.h | 2 +- apps/OpenSpace/main.cpp | 109 ++- ext/ghoul | 2 +- include/openspace/engine/configuration.h | 2 +- include/openspace/engine/openspaceengine.h | 7 +- src/engine/configuration.cpp | 9 +- tests/CMakeLists.txt | 1 - tests/main.cpp | 3 +- tests/test_configuration.cpp | 650 ------------------ 9 files changed, 81 insertions(+), 704 deletions(-) delete mode 100644 tests/test_configuration.cpp diff --git a/apps/OpenSpace/ext/launcher/include/launcherwindow.h b/apps/OpenSpace/ext/launcher/include/launcherwindow.h index f925167355..840aabb6e4 100644 --- a/apps/OpenSpace/ext/launcher/include/launcherwindow.h +++ b/apps/OpenSpace/ext/launcher/include/launcherwindow.h @@ -55,7 +55,7 @@ public: */ LauncherWindow(bool profileEnabled, const openspace::configuration::Configuration& globalConfig, - bool sgctConfigEnabled, std::string sgctConfigName, QWidget* parent); + bool sgctConfigEnabled, std::string sgctConfigName, QWidget* parent); /** * Returns bool for whether "start OpenSpace" was chosen when this window closed. diff --git a/apps/OpenSpace/main.cpp b/apps/OpenSpace/main.cpp index 5906e528fc..f618d43216 100644 --- a/apps/OpenSpace/main.cpp +++ b/apps/OpenSpace/main.cpp @@ -1047,16 +1047,14 @@ void checkCommandLineForSettings(int& argc, char** argv, bool& hasSGCT, bool& ha } std::string setWindowConfigPresetForGui(const std::string labelFromCfgFile, - bool haveCliSGCTConfig, - const std::string& sgctFunctionName) + bool haveCliSGCTConfig) { configuration::Configuration& config = *global::configuration; std::string preset; bool sgctConfigFileSpecifiedByLuaFunction = !config.sgctConfigNameInitialized.empty(); if (haveCliSGCTConfig) { - preset = sgctFunctionName.empty() ? config.windowConfiguration : sgctFunctionName; - preset += " (from CLI)"; + preset = fmt::format("{} (from CLI)", config.windowConfiguration); } else if (sgctConfigFileSpecifiedByLuaFunction) { preset = config.sgctConfigNameInitialized + labelFromCfgFile; @@ -1162,23 +1160,35 @@ int main(int argc, char* argv[]) { CommandlineArguments commandlineArguments; parser.addCommand(std::make_unique>( - commandlineArguments.configurationName, "--file", "-f", + commandlineArguments.configuration, "--file", "-f", "Provides the path to the OpenSpace configuration file. Only the '${TEMPORARY}' " "path token is available and any other path has to be specified relative to the " "current working directory" )); - - parser.addCommand(std::make_unique>( - commandlineArguments.configurationOverride, "--config", "-c", - "Provides the ability to pass arbitrary Lua code to the application that will be " - "evaluated after the configuration file has been loaded but before the other " - "commandline arguments are triggered. This can be used to manipulate the " - "configuration file without editing the file on disk, for example in a " - "planetarium environment. Please not that the Lua script must not contain any - " - "or they will be interpreted as a new command. Similar, in Bash, ${...} will be " - "evaluated before it is passed to OpenSpace. Windows does not approve of using \"" - "either, so it is recommended to deliniate strings with [[ ]] instead. For " - "example: OpenSpace --config Profile=[[jwst]]" + parser.addCommand(std::make_unique>( + commandlineArguments.windowConfig, "--config", "-c", + "Specifies the window configuration file that should be used to start OpenSpace " + "and that will override whatever is specified in the `openspace.cfg` or the " + "settings. This value can include path tokens, so for example " + "`${CONFIG}/single.json` is a valid value." + )); + parser.addCommand(std::make_unique>( + commandlineArguments.profile, "--profile", "-p", + "Specifies the profile that should be used to start OpenSpace and that overrides " + "the profile specified in the `openspace.cfg` and the settings." + )); + parser.addCommand(std::make_unique>( + commandlineArguments.propertyVisibility, "--propertyVisibility", "", + "Specifies UI visibility settings for properties that this OpenSpace is using. " + "This value overrides the values specified in the `openspace.cfg` and the " + "settings and also the environment variable, if that value is provided. Allowed " + "values for this parameter are: `Developer`, `AdvancedUser`, `User`, and " + "`NoviceUser`." + )); + parser.addCommand(std::make_unique( + commandlineArguments.bypassLauncher, "--bypassLauncher", "-b", + "Specifies whether the Launcher should be shown at startup or not. This value " + "overrides the value specified in the `openspace.cfg` and the settings." )); // setCommandLine returns a reference to the vector that will be filled later @@ -1210,8 +1220,8 @@ int main(int argc, char* argv[]) { try { // Find configuration std::filesystem::path configurationFilePath; - if (!commandlineArguments.configurationName.empty()) { - configurationFilePath = absPath(commandlineArguments.configurationName); + if (commandlineArguments.configuration.has_value()) { + configurationFilePath = absPath(*commandlineArguments.configuration); } else { LDEBUG("Finding configuration"); @@ -1249,16 +1259,47 @@ int main(int argc, char* argv[]) { // Loading configuration from disk LDEBUG("Loading configuration from disk"); - std::string override; - for (const std::string& arg : commandlineArguments.configurationOverride) { - override += arg + ";"; - } *global::configuration = configuration::loadConfigurationFromFile( configurationFilePath.string(), - size, - override + size ); + // Override configuration with commandline arguments + if (commandlineArguments.windowConfig.has_value()) { + global::configuration->windowConfiguration = + *commandlineArguments.windowConfig; + } + if (commandlineArguments.profile.has_value()) { + global::configuration->profile = *commandlineArguments.profile; + } + if (commandlineArguments.propertyVisibility.has_value()) { + if (commandlineArguments.propertyVisibility == "NoviceUser") { + global::configuration->propertyVisibility = + properties::Property::Visibility::NoviceUser; + } + else if (commandlineArguments.propertyVisibility == "User") { + global::configuration->propertyVisibility = + properties::Property::Visibility::User; + } + else if (commandlineArguments.propertyVisibility == "AdvancedUser") { + global::configuration->propertyVisibility = + properties::Property::Visibility::AdvancedUser; + } + else if (commandlineArguments.propertyVisibility == "Developer") { + global::configuration->propertyVisibility = + properties::Property::Visibility::Developer; + } + else { + throw ghoul::RuntimeError(fmt::format( + "Unknown property visibility value '{}'", + *commandlineArguments.propertyVisibility + )); + } + } + if (commandlineArguments.bypassLauncher.has_value()) { + global::configuration->bypassLauncher = *commandlineArguments.bypassLauncher; + } + // Determining SGCT configuration file LDEBUG("SGCT Configuration file: " + global::configuration->windowConfiguration); @@ -1282,17 +1323,11 @@ int main(int argc, char* argv[]) { global::openSpaceEngine->registerPathTokens(); - bool hasSGCTConfig = false; - bool hasProfile = false; - std::string sgctFunctionName; - checkCommandLineForSettings(argc, argv, hasSGCTConfig, hasProfile, sgctFunctionName); - // Call profile GUI const std::string labelFromCfgFile = " (from .cfg)"; std::string windowCfgPreset = setWindowConfigPresetForGui( labelFromCfgFile, - hasSGCTConfig, - sgctFunctionName + commandlineArguments.windowConfig.has_value() ); //TODO consider LFATAL if ${USER} doens't exist rather then recurisve create. @@ -1308,9 +1343,7 @@ int main(int argc, char* argv[]) { QApplication app(qac, nullptr); #endif // __APPLE__ - bool skipLauncher = - (hasProfile && hasSGCTConfig) || global::configuration->bypassLauncher; - if (!skipLauncher) { + if (!global::configuration->bypassLauncher) { #ifndef __APPLE__ int qac = 0; QApplication app(qac, nullptr); @@ -1330,9 +1363,9 @@ int main(int argc, char* argv[]) { } LauncherWindow win( - !hasProfile, + !commandlineArguments.profile.has_value(), *global::configuration, - !hasSGCTConfig, + !commandlineArguments.windowConfig.has_value(), windowCfgPreset, nullptr ); @@ -1347,7 +1380,7 @@ int main(int argc, char* argv[]) { global::configuration->profile = win.selectedProfile(); windowConfiguration = selectedSgctProfileFromLauncher( win, - hasSGCTConfig, + commandlineArguments.windowConfig.has_value(), windowConfiguration, labelFromCfgFile ); diff --git a/ext/ghoul b/ext/ghoul index 84675b277a..412e90e49a 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit 84675b277a1a6e2880661fe1c830a392a24a3636 +Subproject commit 412e90e49aaf12a8ae974acd93755514af61fd48 diff --git a/include/openspace/engine/configuration.h b/include/openspace/engine/configuration.h index 3445f8a5b9..16e301e43c 100644 --- a/include/openspace/engine/configuration.h +++ b/include/openspace/engine/configuration.h @@ -148,7 +148,7 @@ struct Configuration { std::filesystem::path findConfiguration(const std::string& filename = "openspace.cfg"); Configuration loadConfigurationFromFile(const std::filesystem::path& filename, - const glm::ivec2& primaryMonitorResolution, std::string_view overrideScript); + const glm::ivec2& primaryMonitorResolution); } // namespace openspace::configuration diff --git a/include/openspace/engine/openspaceengine.h b/include/openspace/engine/openspaceengine.h index b21c04cba3..73a97a54e8 100644 --- a/include/openspace/engine/openspaceengine.h +++ b/include/openspace/engine/openspaceengine.h @@ -64,8 +64,11 @@ struct ShutdownInformation { }; struct CommandlineArguments { - std::string configurationName; - std::vector configurationOverride; + std::optional configuration; + std::optional windowConfig; + std::optional profile; + std::optional propertyVisibility; + std::optional bypassLauncher; }; class OpenSpaceEngine : public properties::PropertyOwner { diff --git a/src/engine/configuration.cpp b/src/engine/configuration.cpp index 8646d7849b..8ddb7a6711 100644 --- a/src/engine/configuration.cpp +++ b/src/engine/configuration.cpp @@ -484,8 +484,7 @@ std::filesystem::path findConfiguration(const std::string& filename) { } Configuration loadConfigurationFromFile(const std::filesystem::path& filename, - const glm::ivec2& primaryMonitorResolution, - std::string_view overrideScript) + const glm::ivec2& primaryMonitorResolution) { ghoul_assert(std::filesystem::is_regular_file(filename), "File must exist"); @@ -506,12 +505,6 @@ Configuration loadConfigurationFromFile(const std::filesystem::path& filename, // Load the configuration file into the state ghoul::lua::runScriptFile(result.state, filename.string()); - if (!overrideScript.empty()) { - LDEBUGC("Configuration", "Executing Lua script passed through the commandline:"); - LDEBUGC("Configuration", overrideScript); - ghoul::lua::runScript(result.state, overrideScript); - } - parseLuaState(result); return result; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 7aa711c631..ed0d17c326 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -28,7 +28,6 @@ add_executable( test_assetloader.cpp test_concurrentqueue.cpp test_distanceconversion.cpp - test_configuration.cpp test_documentation.cpp test_horizons.cpp test_iswamanager.cpp diff --git a/tests/main.cpp b/tests/main.cpp index 0da1022ff9..a6afbb6ad7 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -65,8 +65,7 @@ int main(int argc, char** argv) { *global::configuration = configuration::loadConfigurationFromFile( configFile.string(), - glm::ivec2(0), - "" + glm::ivec2(0) ); global::openSpaceEngine->registerPathTokens(); global::openSpaceEngine->initialize(); diff --git a/tests/test_configuration.cpp b/tests/test_configuration.cpp deleted file mode 100644 index 01cd0b8839..0000000000 --- a/tests/test_configuration.cpp +++ /dev/null @@ -1,650 +0,0 @@ -/***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2023 * - * * - * 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 - -using namespace openspace::configuration; - -namespace { - // The absolute minimal configuration that is still expected to be loaded - std::string MinimalConfig = R"( -Paths = {} -FontSize = { - FrameInfo = 1.0, - Shutdown = 2.0, - Log = 3.0, - CameraInfo = 4.0, - VersionInfo = 5.0 -} -)"; - - void writeConfig(const std::string& filename, std::string_view content) { - std::ofstream f(filename); - f << MinimalConfig << '\n' << MinimalConfig << content; - } - - Configuration loadConfiguration(const std::string& tag, std::string_view content) { - std::string filename = fmt::format("test_configuration_{}.cfg", tag); - std::filesystem::path path = std::filesystem::temp_directory_path(); - std::string file = (path / filename).string(); - writeConfig(file, content); - try { - Configuration conf = loadConfigurationFromFile(file, glm::ivec2(0), content); - std::filesystem::remove(file); - return conf; - } - catch (...) { - std::filesystem::remove(file); - throw; - } - } -} // namespace - -TEST_CASE("Configuration: minimal", "[configuration]") { - loadConfiguration("minimal", ""); -} - -TEST_CASE("Configuration: windowConfiguration", "[configuration]") { - constexpr std::string_view Extra = R"(SGCTConfig = "foobar")"; - const Configuration c = loadConfiguration("windowConfiguration", Extra); - CHECK(c.windowConfiguration == "foobar"); -} - -TEST_CASE("Configuration: asset", "[configuration]") { - constexpr std::string_view Extra = R"(Asset = "foobar")"; - const Configuration c = loadConfiguration("asset", Extra); - CHECK(c.asset == "foobar"); -} - -TEST_CASE("Configuration: profile", "[configuration]") { - constexpr std::string_view Extra = R"(Profile = "foobar")"; - const Configuration c = loadConfiguration("profile", Extra); - CHECK(c.profile == "foobar"); -} - -TEST_CASE("Configuration: globalCustomizationScripts", "[configuration]") { - constexpr std::string_view Extra = R"(GlobalCustomizationScripts = { "foo", "bar" })"; - const Configuration c = loadConfiguration("globalCustomization", Extra); - CHECK(c.globalCustomizationScripts.size() == 2); - CHECK(c.globalCustomizationScripts == std::vector{ "foo", "bar" }); -} - -TEST_CASE("Configuration: paths", "[configuration]") { - constexpr std::string_view Extra = R"(Paths = { foo = "1", bar = "2" })"; - const Configuration c = loadConfiguration("paths", Extra); - CHECK(c.pathTokens.size() == 2); - CHECK( - c.pathTokens == - std::map{ { "foo", "1" }, { "bar", "2" } } - ); -} - -TEST_CASE("Configuration: fonts", "[configuration]") { - constexpr std::string_view Extra = R"(Fonts = { foo = "1", bar = "2" })"; - const Configuration c = loadConfiguration("fonts", Extra); - CHECK(c.fonts.size() == 2); - CHECK( - c.fonts == - std::map{ { "foo", "1" }, { "bar", "2" } } - ); -} - -TEST_CASE("Configuration: logging", "[configuration]") { - Configuration defaultConf; - { - // Empty - constexpr std::string_view Extra = R"(Logging = {})"; - const Configuration c = loadConfiguration("logging1", Extra); - - CHECK(c.logging.level == defaultConf.logging.level); - CHECK(c.logging.forceImmediateFlush == defaultConf.logging.forceImmediateFlush); - CHECK( - c.logging.capabilitiesVerbosity == - defaultConf.logging.capabilitiesVerbosity - ); - CHECK(c.logging.logs == defaultConf.logging.logs); - } - { - // level - constexpr std::string_view Extra = R"(Logging = { LogLevel = "Fatal" })"; - const Configuration c = loadConfiguration("logging2", Extra); - - CHECK(c.logging.level == "Fatal"); - CHECK(c.logging.forceImmediateFlush == defaultConf.logging.forceImmediateFlush); - CHECK( - c.logging.capabilitiesVerbosity == - defaultConf.logging.capabilitiesVerbosity - ); - CHECK(c.logging.logs == defaultConf.logging.logs); - } - { - // forceimmediate - constexpr std::string_view Extra = R"(Logging = { ImmediateFlush = false })"; - const Configuration c = loadConfiguration("logging3", Extra); - - CHECK(c.logging.level == defaultConf.logging.level); - CHECK(c.logging.forceImmediateFlush == false); - CHECK( - c.logging.capabilitiesVerbosity == - defaultConf.logging.capabilitiesVerbosity - ); - CHECK(c.logging.logs == defaultConf.logging.logs); - } - { - // logs - constexpr std::string_view Extra = R"( -Logging = { - Logs = { - { Type = "html", File = "foobar", Append = false } - } -} -)"; - const Configuration c = loadConfiguration("logging4", Extra); - - CHECK(c.logging.level == defaultConf.logging.level); - CHECK(c.logging.forceImmediateFlush == defaultConf.logging.forceImmediateFlush); - CHECK( - c.logging.capabilitiesVerbosity == - defaultConf.logging.capabilitiesVerbosity - ); - REQUIRE(c.logging.logs.size() == 1); - const ghoul::Dictionary& d = c.logging.logs[0]; - REQUIRE(d.hasValue("Type")); - CHECK(d.value("Type") == "html"); - REQUIRE(d.hasValue("File")); - CHECK(d.value("File") == "foobar"); - REQUIRE(d.hasValue("Append")); - CHECK(d.value("Append") == false); - } - { - // capabilities verbosity - constexpr std::string_view Extra = R"(Logging = { CapabilitiesVerbosity = "Full" })"; - const Configuration c = loadConfiguration("logging5", Extra); - - CHECK(c.logging.level == defaultConf.logging.level); - CHECK(c.logging.forceImmediateFlush == defaultConf.logging.forceImmediateFlush); - CHECK(c.logging.capabilitiesVerbosity == "Full"); - CHECK(c.logging.logs == defaultConf.logging.logs); - } -} - -TEST_CASE("Configuration: scriptlog", "[configuration]") { - constexpr std::string_view Extra = R"(ScriptLog = "foobar")"; - const Configuration c = loadConfiguration("scriptlog", Extra); - CHECK(c.scriptLog == "foobar"); -} - -TEST_CASE("Configuration: documentationpath", "[configuration]") { - constexpr std::string_view Extra = R"(Documentation = { Path = "foobar" })"; - const Configuration c = loadConfiguration("documentationpath", Extra); - CHECK(c.documentation.path == "foobar"); -} - -TEST_CASE("Configuration: versioncheckurl", "[configuration]") { - constexpr std::string_view Extra = R"(VersionCheckUrl = "foobar")"; - const Configuration c = loadConfiguration("versioncheckurl", Extra); - CHECK(c.versionCheckUrl == "foobar"); -} - -TEST_CASE("Configuration: useMultithreadedInit", "[configuration]") { - constexpr std::string_view Extra = R"(UseMultithreadedInitialization = true)"; - const Configuration c = loadConfiguration("useMultithreadedInit", Extra); - CHECK(c.useMultithreadedInitialization == true); -} - -TEST_CASE("Configuration: loadingscreen", "[configuration]") { - Configuration defaultConf; - - { - // empty - constexpr std::string_view Extra = R"(LoadingScreen = {})"; - const Configuration c = loadConfiguration("loadingscreen1", Extra); - CHECK( - c.loadingScreen.isShowingMessages == - defaultConf.loadingScreen.isShowingMessages - ); - CHECK( - c.loadingScreen.isShowingProgressbar == - defaultConf.loadingScreen.isShowingProgressbar - ); - CHECK( - c.loadingScreen.isShowingNodeNames == - defaultConf.loadingScreen.isShowingNodeNames - ); - } - { - // isShowingMessages - constexpr std::string_view Extra = R"(LoadingScreen = { ShowMessage = true })"; - const Configuration c = loadConfiguration("loadingscreen2", Extra); - CHECK(c.loadingScreen.isShowingMessages == true); - CHECK( - c.loadingScreen.isShowingProgressbar == - defaultConf.loadingScreen.isShowingProgressbar - ); - CHECK( - c.loadingScreen.isShowingNodeNames == - defaultConf.loadingScreen.isShowingNodeNames - ); - } - { - // isShowingProgressbar - constexpr std::string_view Extra = R"(LoadingScreen = { ShowProgressbar = true })"; - const Configuration c = loadConfiguration("loadingscreen3", Extra); - CHECK( - c.loadingScreen.isShowingMessages == - defaultConf.loadingScreen.isShowingMessages - ); - CHECK(c.loadingScreen.isShowingProgressbar == true); - CHECK( - c.loadingScreen.isShowingNodeNames == - defaultConf.loadingScreen.isShowingNodeNames - ); - } - { - // isShowingNodeNames - constexpr std::string_view Extra = R"(LoadingScreen = { ShowNodeNames = true })"; - const Configuration c = loadConfiguration("loadingscreen4", Extra); - CHECK( - c.loadingScreen.isShowingMessages == - defaultConf.loadingScreen.isShowingMessages - ); - CHECK( - c.loadingScreen.isShowingProgressbar == - defaultConf.loadingScreen.isShowingProgressbar - ); - CHECK(c.loadingScreen.isShowingNodeNames == true); - } -} - -TEST_CASE("Configuration: isCheckingOpenGLState", "[configuration]") { - constexpr std::string_view Extra = R"(CheckOpenGLState = true)"; - const Configuration c = loadConfiguration("isCheckingOpenGLState", Extra); - CHECK(c.isCheckingOpenGLState == true); -} - -TEST_CASE("Configuration: isLoggingOpenGLCalls", "[configuration]") { - constexpr std::string_view Extra = R"(LogEachOpenGLCall = true)"; - const Configuration c = loadConfiguration("isLoggingOpenGLCalls", Extra); - CHECK(c.isLoggingOpenGLCalls == true); -} - -TEST_CASE("Configuration: shutdownCountdown", "[configuration]") { - constexpr std::string_view Extra = R"(ShutdownCountdown = 0.5)"; - const Configuration c = loadConfiguration("shutdownCountdown", Extra); - CHECK(c.shutdownCountdown == 0.5f); -} - -TEST_CASE("Configuration: shouldUseScreenshotDate", "[configuration]") { - constexpr std::string_view Extra = R"(ScreenshotUseDate = true)"; - const Configuration c = loadConfiguration("shouldUseScreenshotDate", Extra); - CHECK(c.shouldUseScreenshotDate == true); -} - -TEST_CASE("Configuration: onScreenTextScaling", "[configuration]") { - constexpr std::string_view Extra = R"(OnScreenTextScaling = "framebuffer")"; - const Configuration c = loadConfiguration("onScreenTextScaling", Extra); - CHECK(c.onScreenTextScaling == "framebuffer"); -} - -TEST_CASE("Configuration: usePerProfileCache", "[configuration]") { - constexpr std::string_view Extra = R"(PerProfileCache = true)"; - const Configuration c = loadConfiguration("usePerProfileCache", Extra); - CHECK(c.usePerProfileCache == true); -} - -TEST_CASE("Configuration: isRenderingOnMasterDisabled", "[configuration]") { - constexpr std::string_view Extra = R"(DisableRenderingOnMaster = true)"; - const Configuration c = loadConfiguration("isRenderingOnMasterDisabled", Extra); - CHECK(c.isRenderingOnMasterDisabled == true); -} - -TEST_CASE("Configuration: globalRotation", "[configuration]") { - constexpr std::string_view Extra = R"(GlobalRotation = { 1.0, 2.0, 3.0 })"; - const Configuration c = loadConfiguration("globalRotation", Extra); - CHECK(c.globalRotation == glm::vec3(1.0, 2.0, 3.0)); -} - -TEST_CASE("Configuration: screenSpaceRotation", "[configuration]") { - constexpr std::string_view Extra = R"(ScreenSpaceRotation = { 1.0, 2.0, 3.0 })"; - const Configuration c = loadConfiguration("screenSpaceRotation", Extra); - CHECK(c.screenSpaceRotation == glm::vec3(1.0, 2.0, 3.0)); -} - -TEST_CASE("Configuration: masterRotation", "[configuration]") { - constexpr std::string_view Extra = R"(MasterRotation = { 1.0, 2.0, 3.0 })"; - const Configuration c = loadConfiguration("masterRotation", Extra); - CHECK(c.masterRotation == glm::vec3(1.0, 2.0, 3.0)); -} - -TEST_CASE("Configuration: isConsoleDisabled", "[configuration]") { - constexpr std::string_view Extra = R"(DisableInGameConsole = true)"; - const Configuration c = loadConfiguration("isConsoleDisabled", Extra); - CHECK(c.isConsoleDisabled == true); -} - -TEST_CASE("Configuration: bypassLauncher", "[configuration]") { - constexpr std::string_view Extra = R"(BypassLauncher = true)"; - const Configuration c = loadConfiguration("bypassLauncher", Extra); - CHECK(c.bypassLauncher == true); -} - -TEST_CASE("Configuration: moduleConfigurations", "[configuration]") { - { - // empty - constexpr std::string_view Extra = R"(ModuleConfigurations = {})"; - const Configuration c = loadConfiguration("moduleConfigurations", Extra); - CHECK(c.moduleConfigurations.empty()); - } - { - // values - constexpr std::string_view Extra = R"( -ModuleConfigurations = { - Foo = { - Foo2 = 1.0, - Foo3 = "abc" - }, - Bar = { - Bar2 = true, - Bar3 = { 1.0, 2.0, 3.0 } - } -} -)"; - const Configuration c = loadConfiguration("moduleConfigurations", Extra); - REQUIRE(c.moduleConfigurations.size() == 2); - ghoul::Dictionary foo = c.moduleConfigurations.at("Foo"); - REQUIRE(foo.size() == 2); - REQUIRE(foo.hasValue("Foo2")); - CHECK(foo.value("Foo2") == 1.0); - REQUIRE(foo.hasValue("Foo3")); - CHECK(foo.value("Foo3") == std::string("abc")); - - ghoul::Dictionary bar = c.moduleConfigurations.at("Bar"); - REQUIRE(bar.size() == 2); - REQUIRE(bar.hasValue("Bar2")); - CHECK(bar.value("Bar2") == true); - REQUIRE(bar.hasValue("Bar3")); - CHECK(bar.value("Bar3") == glm::dvec3(1.0, 2.0, 3.0)); - } -} - -TEST_CASE("Configuration: openGLDebugContext", "[configuration]") { - Configuration defaultConf; - { - // empty-ish / activate - constexpr std::string_view Extra = R"(OpenGLDebugContext = { Activate = true })"; - const Configuration c = loadConfiguration("openGLDebugContext1", Extra); - CHECK(c.openGLDebugContext.isActive == true); - CHECK(c.openGLDebugContext.printStacktrace == false); - CHECK( - c.openGLDebugContext.isSynchronous == - defaultConf.openGLDebugContext.isSynchronous - ); - REQUIRE( - c.openGLDebugContext.identifierFilters.size() == - defaultConf.openGLDebugContext.identifierFilters.size() - ); - for (size_t i = 0; i < c.openGLDebugContext.identifierFilters.size(); i += 1) { - CHECK( - c.openGLDebugContext.identifierFilters[i].identifier == - defaultConf.openGLDebugContext.identifierFilters[i].identifier - ); - CHECK( - c.openGLDebugContext.identifierFilters[i].source == - defaultConf.openGLDebugContext.identifierFilters[i].source - ); - CHECK( - c.openGLDebugContext.identifierFilters[i].type == - defaultConf.openGLDebugContext.identifierFilters[i].type - ); - } - CHECK( - c.openGLDebugContext.severityFilters == - defaultConf.openGLDebugContext.severityFilters - ); - } - { - // isSynchronous - constexpr std::string_view Extra = R"( -OpenGLDebugContext = { Activate = true, Synchronous = true } -)"; - const Configuration c = loadConfiguration("openGLDebugContext2", Extra); - CHECK(c.openGLDebugContext.isActive == true); - CHECK(c.openGLDebugContext.isSynchronous == true); - REQUIRE( - c.openGLDebugContext.identifierFilters.size() == - defaultConf.openGLDebugContext.identifierFilters.size() - ); - for (size_t i = 0; i < c.openGLDebugContext.identifierFilters.size(); i += 1) { - CHECK( - c.openGLDebugContext.identifierFilters[i].identifier == - defaultConf.openGLDebugContext.identifierFilters[i].identifier - ); - CHECK( - c.openGLDebugContext.identifierFilters[i].source == - defaultConf.openGLDebugContext.identifierFilters[i].source - ); - CHECK( - c.openGLDebugContext.identifierFilters[i].type == - defaultConf.openGLDebugContext.identifierFilters[i].type - ); - } - CHECK( - c.openGLDebugContext.severityFilters == - defaultConf.openGLDebugContext.severityFilters - ); - } - { - // identifierFilters - constexpr std::string_view Extra = R"( -OpenGLDebugContext = { - Activate = true, - PrintStacktrace = true, - FilterIdentifier = { - { Identifier = 1, Source = "API", Type = "Error" }, - { Identifier = 2, Source = "Window System", Type = "Deprecated" }, - { Identifier = 3, Source = "Shader Compiler", Type = "Undefined" }, - { Identifier = 4, Source = "Third Party", Type = "Portability" }, - { Identifier = 5, Source = "Application", Type = "Performance" }, - { Identifier = 6, Source = "Other", Type = "Marker" }, - { Identifier = 7, Source = "Don't care", Type = "Push group" }, - { Identifier = 8, Source = "API", Type = "Pop group" }, - { Identifier = 9, Source = "Window System", Type = "Other" }, - { Identifier = 10, Source = "Shader Compiler", Type = "Don't care" } - } -} -)"; - const Configuration c = loadConfiguration("openGLDebugContext3", Extra); - CHECK(c.openGLDebugContext.isActive == true); - CHECK(c.openGLDebugContext.printStacktrace == true); - CHECK( - c.openGLDebugContext.isSynchronous == - defaultConf.openGLDebugContext.isSynchronous - ); - REQUIRE(c.openGLDebugContext.identifierFilters.size() == 10); - CHECK(c.openGLDebugContext.identifierFilters[0].identifier == 1); - CHECK(c.openGLDebugContext.identifierFilters[0].source == "API"); - CHECK(c.openGLDebugContext.identifierFilters[0].type == "Error"); - CHECK(c.openGLDebugContext.identifierFilters[1].identifier == 2); - CHECK(c.openGLDebugContext.identifierFilters[1].source == "Window System"); - CHECK(c.openGLDebugContext.identifierFilters[1].type == "Deprecated"); - CHECK(c.openGLDebugContext.identifierFilters[2].identifier == 3); - CHECK(c.openGLDebugContext.identifierFilters[2].source == "Shader Compiler"); - CHECK(c.openGLDebugContext.identifierFilters[2].type == "Undefined"); - CHECK(c.openGLDebugContext.identifierFilters[3].identifier == 4); - CHECK(c.openGLDebugContext.identifierFilters[3].source == "Third Party"); - CHECK(c.openGLDebugContext.identifierFilters[3].type == "Portability"); - CHECK(c.openGLDebugContext.identifierFilters[4].identifier == 5); - CHECK(c.openGLDebugContext.identifierFilters[4].source == "Application"); - CHECK(c.openGLDebugContext.identifierFilters[4].type == "Performance"); - CHECK(c.openGLDebugContext.identifierFilters[5].identifier == 6); - CHECK(c.openGLDebugContext.identifierFilters[5].source == "Other"); - CHECK(c.openGLDebugContext.identifierFilters[5].type == "Marker"); - CHECK(c.openGLDebugContext.identifierFilters[6].identifier == 7); - CHECK(c.openGLDebugContext.identifierFilters[6].source == "Don't care"); - CHECK(c.openGLDebugContext.identifierFilters[6].type == "Push group"); - CHECK(c.openGLDebugContext.identifierFilters[7].identifier == 8); - CHECK(c.openGLDebugContext.identifierFilters[7].source == "API"); - CHECK(c.openGLDebugContext.identifierFilters[7].type == "Pop group"); - CHECK(c.openGLDebugContext.identifierFilters[8].identifier == 9); - CHECK(c.openGLDebugContext.identifierFilters[8].source == "Window System"); - CHECK(c.openGLDebugContext.identifierFilters[8].type == "Other"); - CHECK(c.openGLDebugContext.identifierFilters[9].identifier == 10); - CHECK(c.openGLDebugContext.identifierFilters[9].source == "Shader Compiler"); - CHECK(c.openGLDebugContext.identifierFilters[9].type == "Don't care"); - - CHECK( - c.openGLDebugContext.severityFilters == - defaultConf.openGLDebugContext.severityFilters - ); - } - { - // filterSeverity - constexpr std::string_view Extra = R"( -OpenGLDebugContext = { Activate = true, FilterSeverity = { "High", "Medium" } } -)"; - const Configuration c = loadConfiguration("openGLDebugContext4", Extra); - CHECK(c.openGLDebugContext.isActive == true); - CHECK(c.openGLDebugContext.printStacktrace == false); - CHECK( - c.openGLDebugContext.isSynchronous == - defaultConf.openGLDebugContext.isSynchronous - ); - REQUIRE( - c.openGLDebugContext.identifierFilters.size() == - defaultConf.openGLDebugContext.identifierFilters.size() - ); - for (size_t i = 0; i < c.openGLDebugContext.identifierFilters.size(); i += 1) { - CHECK( - c.openGLDebugContext.identifierFilters[i].identifier == - defaultConf.openGLDebugContext.identifierFilters[i].identifier - ); - CHECK( - c.openGLDebugContext.identifierFilters[i].source == - defaultConf.openGLDebugContext.identifierFilters[i].source - ); - CHECK( - c.openGLDebugContext.identifierFilters[i].type == - defaultConf.openGLDebugContext.identifierFilters[i].type - ); - } - REQUIRE(c.openGLDebugContext.severityFilters.size() == 2); - CHECK( - c.openGLDebugContext.severityFilters == - std::vector{ "High", "Medium" } - ); - } -} - -TEST_CASE("Configuration: httpProxy", "[configuration]") { - Configuration defaultConf; - { - // empty-ish / address + port - constexpr std::string_view Extra = R"( -HttpProxy = { - Address = "foobar", - Port = 1234 -} -)"; - const Configuration c = loadConfiguration("httpProxy1", Extra); - CHECK(c.httpProxy.usingHttpProxy == defaultConf.httpProxy.usingHttpProxy); - CHECK(c.httpProxy.address == "foobar"); - CHECK(c.httpProxy.port == 1234); - CHECK(c.httpProxy.authentication == defaultConf.httpProxy.authentication); - CHECK(c.httpProxy.user == defaultConf.httpProxy.user); - CHECK(c.httpProxy.password == defaultConf.httpProxy.password); - } - { - // activate - constexpr std::string_view Extra = R"( -HttpProxy = { - Activate = true, - Address = "foobar", - Port = 1234 -} -)"; - const Configuration c = loadConfiguration("httpProxy2", Extra); - CHECK(c.httpProxy.usingHttpProxy == true); - CHECK(c.httpProxy.address == "foobar"); - CHECK(c.httpProxy.port == 1234); - CHECK(c.httpProxy.authentication == defaultConf.httpProxy.authentication); - CHECK(c.httpProxy.user == defaultConf.httpProxy.user); - CHECK(c.httpProxy.password == defaultConf.httpProxy.password); - } - { - // authentication - constexpr std::string_view Extra = R"( -HttpProxy = { - Address = "foobar", - Port = 1234, - Authentication = "ntlm" -} -)"; - const Configuration c = loadConfiguration("httpProxy3", Extra); - CHECK(c.httpProxy.usingHttpProxy == defaultConf.httpProxy.usingHttpProxy); - CHECK(c.httpProxy.address == "foobar"); - CHECK(c.httpProxy.port == 1234); - CHECK(c.httpProxy.authentication == "ntlm"); - CHECK(c.httpProxy.user == defaultConf.httpProxy.user); - CHECK(c.httpProxy.password == defaultConf.httpProxy.password); - } - { - // user - constexpr std::string_view Extra = R"( -HttpProxy = { - Address = "foobar", - Port = 1234, - User = "user-bar" -} -)"; - const Configuration c = loadConfiguration("httpProxy4", Extra); - CHECK(c.httpProxy.usingHttpProxy == defaultConf.httpProxy.usingHttpProxy); - CHECK(c.httpProxy.address == "foobar"); - CHECK(c.httpProxy.port == 1234); - CHECK(c.httpProxy.authentication == defaultConf.httpProxy.authentication); - CHECK(c.httpProxy.user == "user-bar"); - CHECK(c.httpProxy.password == defaultConf.httpProxy.password); - } - { - // password - constexpr std::string_view Extra = R"( -HttpProxy = { - Address = "foobar", - Port = 1234, - Password = "password-bar" -} -)"; - const Configuration c = loadConfiguration("httpProxy5", Extra); - CHECK(c.httpProxy.usingHttpProxy == defaultConf.httpProxy.usingHttpProxy); - CHECK(c.httpProxy.address == "foobar"); - CHECK(c.httpProxy.port == 1234); - CHECK(c.httpProxy.authentication == defaultConf.httpProxy.authentication); - CHECK(c.httpProxy.user == defaultConf.httpProxy.user); - CHECK(c.httpProxy.password == "password-bar"); - } -} From f2524c27c4b814abba6c031d90e5862ad71e7758 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 8 Nov 2023 07:40:14 +0100 Subject: [PATCH 162/701] Fix Tracy --- apps/OpenSpace/ext/sgct | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index d0003e83eb..287e0b3b2d 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit d0003e83eb1d4e98d84867c2ca8cf1f51bed5f95 +Subproject commit 287e0b3b2dd96d0fcabed3528589feb0ff27fc6b From 49106c336e5d985f75a54450e5342cec15ff2f7a Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 8 Nov 2023 10:26:34 +0100 Subject: [PATCH 163/701] Update Tracy submodules --- apps/OpenSpace/ext/sgct | 2 +- ext/ghoul | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index 287e0b3b2d..a5f0b01420 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit 287e0b3b2dd96d0fcabed3528589feb0ff27fc6b +Subproject commit a5f0b014207b2e518e4f2dd5f5ed004855fff1b8 diff --git a/ext/ghoul b/ext/ghoul index 412e90e49a..f658ead151 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit 412e90e49aaf12a8ae974acd93755514af61fd48 +Subproject commit f658ead151995fe77830b43b6559f95b6eaa2981 From 709cb24bbb2ac37ad1fe87f8b3aac47a4e4d3363 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Thu, 9 Nov 2023 11:18:45 +0100 Subject: [PATCH 164/701] Simplify Apollo LEM Model Rotation - Allows using IdleBehavior to orbit around up (#2916) * Simplify Apollo LEM Model Rotation and allow using IdleBehavior to orbit around up-vector * Add rotation values from Carter --- .../assets/scene/solarsystem/missions/apollo/11/lem.asset | 8 +++++++- .../assets/scene/solarsystem/missions/apollo/17/lem.asset | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/data/assets/scene/solarsystem/missions/apollo/11/lem.asset b/data/assets/scene/solarsystem/missions/apollo/11/lem.asset index 4be3fd6f8c..17ddb2c21b 100644 --- a/data/assets/scene/solarsystem/missions/apollo/11/lem.asset +++ b/data/assets/scene/solarsystem/missions/apollo/11/lem.asset @@ -22,6 +22,12 @@ local Apollo11Lem = { Latitude = 0.67402, Altitude = -1927.65, UseHeightMap = false + }, + Rotation = { + Type = "GlobeRotation", + Globe = moon_asset.Moon.Identifier, + Longitude = -360+23.47306, + Latitude = 0.67402, } }, GUI = { @@ -42,7 +48,7 @@ local Apollo11LemModel = { Renderable = { Type = "RenderableModel", GeometryFile = lem_model .. "LM-2_ver2clean.obj", - RotationVector = { 91.044090, 171.229706, 111.666664 }, + RotationVector = { -90.0, 283.86999, 0 }, LightSources = { sun.LightSource, { diff --git a/data/assets/scene/solarsystem/missions/apollo/17/lem.asset b/data/assets/scene/solarsystem/missions/apollo/17/lem.asset index 10a72ddd3c..eb7158df4f 100644 --- a/data/assets/scene/solarsystem/missions/apollo/17/lem.asset +++ b/data/assets/scene/solarsystem/missions/apollo/17/lem.asset @@ -21,6 +21,12 @@ local Apollo17Lem = { Longitude = -329.22833, Latitude = 20.19092, UseHeightmap = true + }, + Rotation = { + Type = "GlobeRotation", + Globe = moonAsset.Moon.Identifier, + Longitude = -329.22833, + Latitude = 20.19092, } }, GUI = { @@ -43,7 +49,7 @@ local Apollo17LemModel = { Type = "RenderableModel", GeometryFile = model .. "LM-2_ver2clean.obj", SpecularIntensity = 0.0, - RotationVector = { 110.255219, 171.229706, 126.666664 }, + RotationVector = { -90.0, 283.86999, 0 }, LightSources = { sun.LightSource, { From b62e604b2e5aad8ee387cd9b26150c738eb800cd Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 13 Nov 2023 08:52:51 +0100 Subject: [PATCH 165/701] Adds a persistent file used to store user settings (#2931) * Enable the loading of settings * Add a user interface for changing the settings in the launcher Co-authored-by: Emma Broman --- .gitignore | 1 + apps/OpenSpace/ext/launcher/CMakeLists.txt | 2 + .../ext/launcher/include/launcherwindow.h | 6 +- .../ext/launcher/include/settingsdialog.h | 74 ++ .../resources/images/cogwheel-highlight.png | Bin 0 -> 8227 bytes .../launcher/resources/images/cogwheel.png | Bin 0 -> 9197 bytes .../ext/launcher/resources/qss/launcher.qss | 19 + .../ext/launcher/resources/resources.qrc | 4 +- .../ext/launcher/src/launcherwindow.cpp | 36 +- .../ext/launcher/src/settingsdialog.cpp | 410 +++++++++ apps/OpenSpace/main.cpp | 39 +- include/openspace/engine/configuration.h | 9 +- include/openspace/engine/globals.h | 4 +- include/openspace/engine/settings.h | 62 ++ openspace.cfg | 8 - src/CMakeLists.txt | 2 + src/engine/configuration.cpp | 51 +- src/engine/globals.cpp | 8 +- src/engine/openspaceengine.cpp | 4 +- src/engine/settings.cpp | 184 ++++ src/rendering/renderengine.cpp | 2 +- tests/CMakeLists.txt | 1 + tests/main.cpp | 5 +- tests/test_settings.cpp | 863 ++++++++++++++++++ tests/test_sgctedit.cpp | 2 +- 25 files changed, 1754 insertions(+), 42 deletions(-) create mode 100644 apps/OpenSpace/ext/launcher/include/settingsdialog.h create mode 100644 apps/OpenSpace/ext/launcher/resources/images/cogwheel-highlight.png create mode 100644 apps/OpenSpace/ext/launcher/resources/images/cogwheel.png create mode 100644 apps/OpenSpace/ext/launcher/src/settingsdialog.cpp create mode 100644 include/openspace/engine/settings.h create mode 100644 src/engine/settings.cpp create mode 100644 tests/test_settings.cpp diff --git a/.gitignore b/.gitignore index 78bfbc5a7d..bb70a3b337 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,4 @@ COMMIT.md /modules/skybrowser/wwtimagedata doc config/schema/sgct.schema.json +settings.json diff --git a/apps/OpenSpace/ext/launcher/CMakeLists.txt b/apps/OpenSpace/ext/launcher/CMakeLists.txt index f7a465bd3c..42b1c0f042 100644 --- a/apps/OpenSpace/ext/launcher/CMakeLists.txt +++ b/apps/OpenSpace/ext/launcher/CMakeLists.txt @@ -27,6 +27,7 @@ include(${PROJECT_SOURCE_DIR}/support/cmake/set_openspace_compile_settings.cmake set(HEADER_FILES include/filesystemaccess.h include/launcherwindow.h + include/settingsdialog.h include/profile/actiondialog.h include/profile/additionalscriptsdialog.h include/profile/assetsdialog.h @@ -55,6 +56,7 @@ set(HEADER_FILES set(SOURCE_FILES src/launcherwindow.cpp src/filesystemaccess.cpp + src/settingsdialog.cpp src/profile/actiondialog.cpp src/profile/additionalscriptsdialog.cpp src/profile/assetsdialog.cpp diff --git a/apps/OpenSpace/ext/launcher/include/launcherwindow.h b/apps/OpenSpace/ext/launcher/include/launcherwindow.h index 840aabb6e4..f5efc4c1b6 100644 --- a/apps/OpenSpace/ext/launcher/include/launcherwindow.h +++ b/apps/OpenSpace/ext/launcher/include/launcherwindow.h @@ -34,7 +34,7 @@ #include #include -namespace openspace::configuration { struct Configuration; } +namespace openspace { struct Configuration; } class QComboBox; class QLabel; @@ -54,8 +54,8 @@ public: * in the tree structure. */ LauncherWindow(bool profileEnabled, - const openspace::configuration::Configuration& globalConfig, - bool sgctConfigEnabled, std::string sgctConfigName, QWidget* parent); + const openspace::Configuration& globalConfig, bool sgctConfigEnabled, + std::string sgctConfigName, QWidget* parent); /** * Returns bool for whether "start OpenSpace" was chosen when this window closed. diff --git a/apps/OpenSpace/ext/launcher/include/settingsdialog.h b/apps/OpenSpace/ext/launcher/include/settingsdialog.h new file mode 100644 index 0000000000..eb06e92b0d --- /dev/null +++ b/apps/OpenSpace/ext/launcher/include/settingsdialog.h @@ -0,0 +1,74 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2023 * + * * + * 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_UI_LAUNCHER___SETTINGSDIALOG___H__ +#define __OPENSPACE_UI_LAUNCHER___SETTINGSDIALOG___H__ + +#include + +#include + +class QCheckBox; +class QComboBox; +class QDialogButtonBox; +class QLabel; +class QLineEdit; + +class SettingsDialog : public QDialog { +Q_OBJECT +public: + SettingsDialog(openspace::Settings settings, + QWidget* parent = nullptr); + +signals: + void saveSettings(openspace::Settings settings); + +private: + void createWidgets(); + void loadFromSettings(const openspace::Settings& settings); + void updateSaveButton(); + + void save(); + void reject(); + + QLineEdit* _configuration = nullptr; + QCheckBox* _rememberLastConfiguration = nullptr; + QLineEdit* _profile = nullptr; + QCheckBox* _rememberLastProfile = nullptr; + QComboBox* _propertyVisibility = nullptr; + QCheckBox* _bypassLauncher = nullptr; + QLabel* _bypassInformation = nullptr; + + struct { + QCheckBox* isEnabled = nullptr; + QLineEdit* location = nullptr; + } _mrf; + + QDialogButtonBox* _dialogButtons = nullptr; + + // The set of settings that we have while editing + openspace::Settings _currentEdit; +}; + +#endif // __OPENSPACE_UI_LAUNCHER___SETTINGSDIALOG___H__ diff --git a/apps/OpenSpace/ext/launcher/resources/images/cogwheel-highlight.png b/apps/OpenSpace/ext/launcher/resources/images/cogwheel-highlight.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b46943ced9e205ad874c36f3b918e43ba7411d GIT binary patch literal 8227 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 z zW~T%O*Y<0@Z%Nrt6-O(?AWc;=%rYgtgwn#LK&g9QmY1XLLDQIwrRh_?(}npexHW5H zgE@t1DW4+i(Qcmv9~9bdOO)SsFMDJX=wl1OG3|_Bi$hl@#yPm)I7eXahuauW1mMI- z9p)C?Z(S3B2I%QpvC7JWy@n$oaRR-T0?=VB?JRV7OxGsPGzO&M@j5Op{J`LJ<-H2| z8JokDOmJY(FbO5`ZU1oY#C$to5(K@MoGbu5A^_sXw%RRndaG=g4c`|7)PstOl=gOY zeFK9HY587~o2q&vydOs?iPz12W)$W4<{9 literal 0 HcmV?d00001 diff --git a/apps/OpenSpace/ext/launcher/resources/images/cogwheel.png b/apps/OpenSpace/ext/launcher/resources/images/cogwheel.png new file mode 100644 index 0000000000000000000000000000000000000000..9f3465f332762f485ec9a7055abda85dddcc84c1 GIT binary patch literal 9197 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 qss/launcher.qss - images/openspace-horiz-logo-small.png + images/cogwheel.png + images/cogwheel-highlight.png images/launcher-background.png + images/openspace-horiz-logo-small.png images/outline_locked.png images/outline_unlocked.png diff --git a/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp b/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp index f1352e7444..75525bdf7f 100644 --- a/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp +++ b/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp @@ -25,6 +25,7 @@ #include "launcherwindow.h" #include "profile/profileedit.h" +#include "settingsdialog.h" #include #include @@ -60,6 +61,8 @@ namespace { constexpr int SmallItemWidth = 100; constexpr int SmallItemHeight = SmallItemWidth / 4; + constexpr int SettingsIconSize = 35; + namespace geometry { constexpr QRect BackgroundImage(0, 0, ScreenWidth, ScreenHeight); constexpr QRect LogoImage(LeftRuler, TopRuler, ItemWidth, ItemHeight); @@ -85,6 +88,12 @@ namespace { constexpr QRect VersionString( 5, ScreenHeight - SmallItemHeight, ItemWidth, SmallItemHeight ); + constexpr QRect SettingsButton( + ScreenWidth - SettingsIconSize - 5, + ScreenHeight - SettingsIconSize - 5, + SettingsIconSize, + SettingsIconSize + ); } // geometry std::optional loadProfileFromFile(QWidget* parent, std::string filename) { @@ -204,7 +213,7 @@ namespace { using namespace openspace; LauncherWindow::LauncherWindow(bool profileEnabled, - const configuration::Configuration& globalConfig, + const Configuration& globalConfig, bool sgctConfigEnabled, std::string sgctConfigName, QWidget* parent) : QMainWindow(parent) @@ -376,6 +385,31 @@ QWidget* LauncherWindow::createCentralWidget() { versionLabel->setObjectName("version-info"); versionLabel->setGeometry(geometry::VersionString); + QPushButton* settingsButton = new QPushButton(centralWidget); + settingsButton->setObjectName("settings"); + settingsButton->setGeometry(geometry::SettingsButton); + settingsButton->setIconSize(QSize(SettingsIconSize, SettingsIconSize)); + connect( + settingsButton, + &QPushButton::released, + [this]() { + using namespace openspace; + + Settings settings = loadSettings(); + + SettingsDialog dialog(std::move(settings), this); + connect( + &dialog, + &SettingsDialog::saveSettings, + [](Settings settings) { + saveSettings(settings, findSettings()); + } + ); + + dialog.exec(); + } + ); + return centralWidget; } diff --git a/apps/OpenSpace/ext/launcher/src/settingsdialog.cpp b/apps/OpenSpace/ext/launcher/src/settingsdialog.cpp new file mode 100644 index 0000000000..42ea8a0c70 --- /dev/null +++ b/apps/OpenSpace/ext/launcher/src/settingsdialog.cpp @@ -0,0 +1,410 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2023 * + * * + * 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 "settingsdialog.h" + +#include "profile/line.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +SettingsDialog::SettingsDialog(openspace::Settings settings, + QWidget* parent) + : QDialog(parent) + , _currentEdit(settings) +{ + setWindowTitle("Settings"); + createWidgets(); + loadFromSettings(settings); + + // Setting the startup values for the control will have caused the Save button to be + // enabled, so we need to manually disable it again here + _dialogButtons->button(QDialogButtonBox::Save)->setEnabled(false); +} + +void SettingsDialog::createWidgets() { + // Layout of this dialog: + // + // ------------------------------------------------------- + // | Profile | + // | Starting Profile: | [oooooooooooooooooooo] | + // | [] Keep Last Profile | + // | Configuration | + // | Starting Configuration: | [oooooooooooooooooooo] | + // | [] Keep Last Configuration | + // | User Interface | + // | Property Visibility | DDDDDDDDDDDDDDDDDDDDD> | + // | [] Bypass Launcher | + // | Informational text about undoing the bypass setting | + // | MRF Caching | + // | [] Enable caching | + // | Cache location | [oooooooooooooooooooo] | + // | | | + // ------------------------------------------------------- + + QGridLayout* layout = new QGridLayout(this); + layout->setSizeConstraint(QLayout::SetFixedSize); + + { + QLabel* label = new QLabel("Profile"); + label->setObjectName("heading"); + layout->addWidget(label, 0, 0, 1, 2); + + QLabel* conf = new QLabel("Starting Profile"); + conf->setToolTip( + "With this setting, you can choose a profile that will be loaded the next " + "time you start the application" + ); + layout->addWidget(conf, 1, 0); + + _profile = new QLineEdit; + _profile->setToolTip(conf->toolTip()); + connect( + _profile, + &QLineEdit::textChanged, + [this]() { + std::string v = _profile->text().toStdString(); + if (v.empty()) { + _currentEdit.profile = std::nullopt; + } + else { + _currentEdit.profile = v; + } + + updateSaveButton(); + } + ); + layout->addWidget(_profile, 1, 1); + + _rememberLastProfile = new QCheckBox("Keep Last Profile"); + _rememberLastProfile->setToolTip( + "If this setting is checked, the application will remember the profile that " + "was loaded into OpenSpace and will use it at the next startup as well" + ); + connect( + _rememberLastProfile, + &QCheckBox::stateChanged, + [this]() { + if (_rememberLastProfile->isChecked()) { + _currentEdit.rememberLastProfile = true; + } + else { + _currentEdit.rememberLastProfile = std::nullopt; + } + + _profile->setDisabled(_rememberLastProfile->isChecked()); + updateSaveButton(); + } + ); + layout->addWidget(_rememberLastProfile, 2, 0, 1, 2); + } + + layout->addWidget(new Line(), 3, 0, 1, 2); + + { + QLabel* label = new QLabel("Configuration"); + label->setObjectName("heading"); + layout->addWidget(label, 4, 0, 1, 2); + + QLabel* conf = new QLabel("Starting Configuration"); + conf->setToolTip( + "With this setting, you can choose a window configuration that will be " + "loaded the next time you start the application" + ); + layout->addWidget(conf, 5, 0); + + _configuration = new QLineEdit; + _configuration->setToolTip(conf->toolTip()); + connect( + _configuration, + &QLineEdit::textChanged, + [this]() { + std::string v = _configuration->text().toStdString(); + if (v.empty()) { + _currentEdit.configuration = std::nullopt; + } + else { + _currentEdit.configuration = v; + } + + updateSaveButton(); + } + ); + layout->addWidget(_configuration, 5, 1); + + _rememberLastConfiguration = new QCheckBox("Keep Last Configuration"); + _rememberLastConfiguration->setToolTip( + "If this setting is checked, the application will remember the window " + "configuration and will use it at the next startup as well" + ); + connect( + _rememberLastConfiguration, + &QCheckBox::stateChanged, + [this]() { + if (_rememberLastConfiguration->isChecked()) { + _currentEdit.rememberLastConfiguration = true; + } + else { + _currentEdit.rememberLastConfiguration = std::nullopt; + } + _configuration->setDisabled(_rememberLastConfiguration->isChecked()); + updateSaveButton(); + } + ); + layout->addWidget(_rememberLastConfiguration, 6, 0, 1, 2); + } + + layout->addWidget(new Line(), 7, 0, 1, 2); + + { + QLabel* label = new QLabel("User Interface"); + label->setObjectName("heading"); + layout->addWidget(label, 8, 0, 1, 2); + + QLabel* conf = new QLabel("Property Visibility"); + conf->setToolTip( + "This setting sets the default visibility for properties in the application. " + "Note that these values are ordered, so all properties shown as a 'Novice " + "User' are also visible when selecting 'User', etc." + ); + layout->addWidget(conf, 9, 0); + + _propertyVisibility = new QComboBox; + _propertyVisibility->setToolTip(conf->toolTip()); + _propertyVisibility->addItems({ + "Novice User", + "User", + "Advanced User", + "Developer" + }); + _propertyVisibility->setCurrentText("User"); + connect( + _propertyVisibility, + &QComboBox::textActivated, + [this](const QString& value) { + using Visibility = openspace::properties::Property::Visibility; + if (value == "Novice User") { + _currentEdit.visibility = Visibility::NoviceUser; + } + else if (value == "User") { + // This is the default value + _currentEdit.visibility = std::nullopt; + } + else if (value == "Advanced User") { + _currentEdit.visibility = Visibility::AdvancedUser; + } + else if (value == "Developer") { + _currentEdit.visibility = Visibility::Developer; + } + else { + throw ghoul::MissingCaseException(); + } + + updateSaveButton(); + } + ); + layout->addWidget(_propertyVisibility, 9, 1); + + _bypassLauncher = new QCheckBox("Bypass Launcher"); + _bypassLauncher->setToolTip( + "If this value is selected, the Launcher will no longer be shown at startup. " + "Note that this also means that it will not be easy to get back to this " + "setting to reenable the Launcher either." + ); + connect( + _bypassLauncher, + &QCheckBox::stateChanged, + [this]() { + if (_bypassLauncher->isChecked()) { + _currentEdit.bypassLauncher = _bypassLauncher->isChecked(); + } + else { + _currentEdit.bypassLauncher = std::nullopt; + } + _bypassInformation->setVisible(_bypassLauncher->isChecked()); + updateSaveButton(); + } + ); + layout->addWidget(_bypassLauncher, 10, 0, 1, 2); + + _bypassInformation = new QLabel( + "Saving the settings with the bypass launcher enabled will cause this window " + "to not show up again, making it harder to undo this change. In case you " + "need to undo it, you need to open the settings.json and remove the line " + "that says '\"bypass\": true,'" + ); + _bypassInformation->setObjectName("information"); + _bypassInformation->setHidden(true); + _bypassInformation->setWordWrap(true); + layout->addWidget(_bypassInformation, 11, 0, 1, 2); + } + + layout->addWidget(new Line(), 12, 0, 1, 2); + + { + QLabel* label = new QLabel("MRF Caching"); + label->setObjectName("heading"); + layout->addWidget(label, 13, 0, 1, 2); + + _mrf.isEnabled = new QCheckBox("Enable Caching"); + _mrf.isEnabled->setToolTip( + "If this setting is checked, the MRF caching for globe layers will be " + "enabled. This means that all planetary images that are loaded over the " + "internet will also be cached locally and stored between application runs. " + "This will speedup the loading the second time at the expense of hard disk " + "space." + ); + connect( + _mrf.isEnabled, + &QCheckBox::stateChanged, + [this]() { + if (_mrf.isEnabled->isChecked()) { + _currentEdit.mrf.isEnabled = _mrf.isEnabled->isChecked(); + } + else { + _currentEdit.mrf.isEnabled = std::nullopt; + } + + _mrf.location->setDisabled(!_mrf.isEnabled->isChecked()); + updateSaveButton(); + } + ); + layout->addWidget(_mrf.isEnabled, 14, 0, 1, 2); + + QLabel* conf = new QLabel("Cache Location"); + conf->setToolTip( + "This is the place where the MRF cache files are located. Please note that " + "these files can potentially become quite large when using OpenSpace for a " + "long while and when visiting new places regularly. If this value is left " + "blank, the cached files will be stored in the 'mrf_cache' folder in the " + "OpenSpace base folder." + ); + layout->addWidget(conf, 15, 0); + + _mrf.location = new QLineEdit; + _mrf.location->setToolTip(conf->toolTip()); + _mrf.location->setDisabled(true); + connect( + _mrf.location, + &QLineEdit::editingFinished, + [this]() { + if (_mrf.location->text().isEmpty()) { + _currentEdit.mrf.location = std::nullopt; + } + else { + _currentEdit.mrf.location = _mrf.location->text().toStdString(); + } + updateSaveButton(); + } + ); + layout->addWidget(_mrf.location, 15, 1); + } + + layout->addWidget(new Line(), 16, 0, 1, 2); + + _dialogButtons = new QDialogButtonBox; + _dialogButtons->setStandardButtons( + QDialogButtonBox::Save | QDialogButtonBox::Cancel + ); + QObject::connect( + _dialogButtons, &QDialogButtonBox::accepted, + this, &SettingsDialog::save + ); + QObject::connect( + _dialogButtons, &QDialogButtonBox::rejected, + this, &SettingsDialog::reject + ); + layout->addWidget(_dialogButtons, 17, 1, 1, 1, Qt::AlignRight); +} + +void SettingsDialog::loadFromSettings(const openspace::Settings& settings) { + using namespace openspace; + + if (settings.configuration.has_value()) { + _configuration->setText(QString::fromStdString(*settings.configuration)); + } + if (settings.rememberLastConfiguration.has_value()) { + _rememberLastConfiguration->setChecked(*settings.rememberLastConfiguration); + } + + if (settings.profile.has_value()) { + _profile->setText(QString::fromStdString(*settings.profile)); + } + if (settings.rememberLastProfile.has_value()) { + _rememberLastProfile->setChecked(*settings.rememberLastProfile); + } + + if (settings.visibility.has_value()) { + using Visibility = openspace::properties::Property::Visibility; + Visibility vis = *settings.visibility; + switch (vis) { + case Visibility::NoviceUser: + _propertyVisibility->setCurrentText("Novice User"); + break; + case Visibility::User: + _propertyVisibility->setCurrentText("User"); + break; + case Visibility::AdvancedUser: + _propertyVisibility->setCurrentText("Advanced User"); + break; + case Visibility::Developer: + _propertyVisibility->setCurrentText("Developer"); + break; + case Visibility::Always: + case Visibility::Hidden: + break; + } + } + + if (settings.bypassLauncher.has_value()) { + _bypassLauncher->setChecked(*settings.bypassLauncher); + } + + if (settings.mrf.isEnabled.has_value()) { + _mrf.isEnabled->setChecked(*settings.mrf.isEnabled); + } + if (settings.mrf.location.has_value()) { + _mrf.location->setText(QString::fromStdString(*settings.mrf.location)); + } +} + +void SettingsDialog::updateSaveButton() { + _dialogButtons->button(QDialogButtonBox::Save)->setEnabled(true); +} + +void SettingsDialog::save() { + emit saveSettings(_currentEdit); + _dialogButtons->button(QDialogButtonBox::Save)->setEnabled(false); + QDialog::accept(); +} + +void SettingsDialog::reject() { + QDialog::reject(); +} diff --git a/apps/OpenSpace/main.cpp b/apps/OpenSpace/main.cpp index f618d43216..5618fc3522 100644 --- a/apps/OpenSpace/main.cpp +++ b/apps/OpenSpace/main.cpp @@ -22,10 +22,11 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include #include +#include #include #include +#include #include #include #include @@ -288,7 +289,7 @@ void mainInitFunc(GLFWwindow*) { // to them later in the RenderEngine std::filesystem::path screenshotPath = absPath("${SCREENSHOTS}"); FileSys.registerPathToken("${STARTUP_SCREENSHOT}", screenshotPath); - Settings::instance().setCapturePath(screenshotPath.string()); + sgct::Settings::instance().setCapturePath(screenshotPath.string()); LDEBUG("Initializing OpenSpace Engine started"); global::openSpaceEngine->initialize(); @@ -899,7 +900,7 @@ void setSgctDelegateFunctions() { sgctDelegate.takeScreenshot = [](bool applyWarping, std::vector windowIds) { ZoneScoped; - Settings::instance().setCaptureFromBackBuffer(applyWarping); + sgct::Settings::instance().setCaptureFromBackBuffer(applyWarping); Engine::instance().takeScreenshot(std::move(windowIds)); return Engine::instance().screenShotNumber(); }; @@ -976,7 +977,7 @@ void setSgctDelegateFunctions() { return currentWindow->swapGroupFrameNumber(); }; sgctDelegate.setScreenshotFolder = [](std::string path) { - Settings::instance().setCapturePath(std::move(path)); + sgct::Settings::instance().setCapturePath(std::move(path)); }; sgctDelegate.showStatistics = [](bool enabled) { Engine::instance().setStatsGraphVisibility(enabled); @@ -1049,7 +1050,7 @@ void checkCommandLineForSettings(int& argc, char** argv, bool& hasSGCT, bool& ha std::string setWindowConfigPresetForGui(const std::string labelFromCfgFile, bool haveCliSGCTConfig) { - configuration::Configuration& config = *global::configuration; + openspace::Configuration& config = *global::configuration; std::string preset; bool sgctConfigFileSpecifiedByLuaFunction = !config.sgctConfigNameInitialized.empty(); @@ -1225,7 +1226,7 @@ int main(int argc, char* argv[]) { } else { LDEBUG("Finding configuration"); - configurationFilePath = configuration::findConfiguration(); + configurationFilePath = findConfiguration(); } if (!std::filesystem::is_regular_file(configurationFilePath)) { @@ -1259,8 +1260,9 @@ int main(int argc, char* argv[]) { // Loading configuration from disk LDEBUG("Loading configuration from disk"); - *global::configuration = configuration::loadConfigurationFromFile( + *global::configuration = loadConfigurationFromFile( configurationFilePath.string(), + findSettings(), size ); @@ -1413,7 +1415,7 @@ int main(int argc, char* argv[]) { LDEBUG("Creating SGCT Engine"); std::vector arg(argv + 1, argv + argc); - Configuration config = parseArguments(arg); + sgct::Configuration config = parseArguments(arg); config::Cluster cluster = loadCluster(absPath(windowConfiguration).string()); Engine::Callbacks callbacks; @@ -1479,6 +1481,27 @@ int main(int argc, char* argv[]) { // Only timeout after 15 minutes Engine::instance().setSyncParameters(false, 15.f * 60.f); + { + openspace::Settings settings = loadSettings(); + settings.hasStartedBefore = true; + + if (settings.rememberLastProfile) { + std::filesystem::path p = global::configuration->profile; + std::filesystem::path reducedName = p.filename().replace_extension(); + settings.profile = reducedName.string(); + } + + if (settings.rememberLastConfiguration && + !global::configuration->sgctConfigNameInitialized.empty()) + { + // We only want to store the window configuration if it was not a dynamically + // created one + settings.configuration = global::configuration->windowConfiguration; + } + + saveSettings(settings, findSettings()); + } + LINFO("Starting rendering loop"); Engine::instance().exec(); LINFO("Ending rendering loop"); diff --git a/include/openspace/engine/configuration.h b/include/openspace/engine/configuration.h index 16e301e43c..20232bf756 100644 --- a/include/openspace/engine/configuration.h +++ b/include/openspace/engine/configuration.h @@ -34,9 +34,9 @@ #include #include -namespace openspace::documentation { struct Documentation; } +namespace openspace { -namespace openspace::configuration { +namespace documentation { struct Documentation; } struct Configuration { Configuration() = default; @@ -147,9 +147,10 @@ struct Configuration { std::filesystem::path findConfiguration(const std::string& filename = "openspace.cfg"); -Configuration loadConfigurationFromFile(const std::filesystem::path& filename, +Configuration loadConfigurationFromFile(const std::filesystem::path& configurationFile, + const std::filesystem::path& settingsFile, const glm::ivec2& primaryMonitorResolution); -} // namespace openspace::configuration +} // namespace openspace #endif // __OPENSPACE_CORE___CONFIGURATION___H__ diff --git a/include/openspace/engine/globals.h b/include/openspace/engine/globals.h index f6e294552b..55a1cda83e 100644 --- a/include/openspace/engine/globals.h +++ b/include/openspace/engine/globals.h @@ -33,6 +33,7 @@ namespace ghoul::fontrendering { class FontManager; } namespace openspace { +struct Configuration; class Dashboard; class DeferredcasterManager; class DownloadManager; @@ -50,7 +51,6 @@ class SyncEngine; class TimeManager; class VersionChecker; struct WindowDelegate; -namespace configuration { struct Configuration; } namespace interaction { struct JoystickInputStates; struct WebsocketInputStates; @@ -88,7 +88,7 @@ inline SyncEngine* syncEngine; inline TimeManager* timeManager; inline VersionChecker* versionChecker; inline WindowDelegate* windowDelegate; -inline configuration::Configuration* configuration; +inline Configuration* configuration; inline interaction::ActionManager* actionManager; inline interaction::InteractionMonitor* interactionMonitor; inline interaction::JoystickInputStates* joystickInputStates; diff --git a/include/openspace/engine/settings.h b/include/openspace/engine/settings.h new file mode 100644 index 0000000000..c43178def4 --- /dev/null +++ b/include/openspace/engine/settings.h @@ -0,0 +1,62 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2023 * + * * + * 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___SETTINGS___H__ +#define __OPENSPACE_CORE___SETTINGS___H__ + +#include +#include +#include + +namespace openspace { + +struct Settings { + auto operator<=>(const Settings&) const = default; + + std::optional hasStartedBefore; + + std::optional configuration; + std::optional rememberLastConfiguration; + std::optional profile; + std::optional rememberLastProfile; + std::optional visibility; + std::optional bypassLauncher; + + struct MRF { + auto operator<=>(const MRF&) const = default; + + std::optional isEnabled; + std::optional location; + }; + MRF mrf; +}; + +std::filesystem::path findSettings(const std::string& filename = "settings.json"); + +Settings loadSettings(const std::filesystem::path& filename = findSettings()); +void saveSettings(const Settings& settings, const std::filesystem::path& filename); + +} // namespace openspace + +#endif // __OPENSPACE_CORE___SETTINGS___H__ diff --git a/openspace.cfg b/openspace.cfg index 9d39a87a04..29ad549d1e 100644 --- a/openspace.cfg +++ b/openspace.cfg @@ -161,19 +161,11 @@ ModuleConfigurations = { } } }, - WebBrowser = { - Enabled = true - }, WebGui = { Address = "localhost", HttpPort = 4680, WebSocketInterface = "DefaultWebSocketInterface" }, - CefWebGui = { - -- GuiScale = 2.0, - Enabled = true, - Visible = true - }, Space = { ShowExceptions = false } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c54bb478af..c0c383cbe2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -40,6 +40,7 @@ set(OPENSPACE_SOURCE engine/moduleengine_lua.inl engine/openspaceengine.cpp engine/openspaceengine_lua.inl + engine/settings.cpp engine/syncengine.cpp events/event.cpp events/eventengine.cpp @@ -221,6 +222,7 @@ set(OPENSPACE_HEADER ${PROJECT_SOURCE_DIR}/include/openspace/engine/moduleengine.h ${PROJECT_SOURCE_DIR}/include/openspace/engine/moduleengine.inl ${PROJECT_SOURCE_DIR}/include/openspace/engine/openspaceengine.h + ${PROJECT_SOURCE_DIR}/include/openspace/engine/settings.h ${PROJECT_SOURCE_DIR}/include/openspace/engine/syncengine.h ${PROJECT_SOURCE_DIR}/include/openspace/engine/windowdelegate.h ${PROJECT_SOURCE_DIR}/include/openspace/events/event.h diff --git a/src/engine/configuration.cpp b/src/engine/configuration.cpp index 8ddb7a6711..780a4298c6 100644 --- a/src/engine/configuration.cpp +++ b/src/engine/configuration.cpp @@ -25,12 +25,14 @@ #include #include +#include #include #include #include #include #include #include +#include #include namespace { @@ -309,7 +311,7 @@ namespace { #include "configuration_codegen.cpp" } // namespace -namespace openspace::configuration { +namespace openspace { void parseLuaState(Configuration& configuration) { using namespace ghoul::lua; @@ -456,6 +458,38 @@ void parseLuaState(Configuration& configuration) { c.bypassLauncher = p.bypassLauncher.value_or(c.bypassLauncher); } +void patchConfiguration(Configuration& configuration, const Settings& settings) { + if (settings.configuration.has_value()) { + configuration.windowConfiguration = *settings.configuration; + configuration.sgctConfigNameInitialized.clear(); + } + if (settings.profile.has_value()) { + configuration.profile = *settings.profile; + } + if (settings.visibility.has_value()) { + configuration.propertyVisibility = *settings.visibility; + } + if (settings.bypassLauncher.has_value()) { + configuration.bypassLauncher = *settings.bypassLauncher; + } + auto it = configuration.moduleConfigurations.find("GlobeBrowsing"); + // Just in case we have a configuration file that does not specify anything + // about the globebrowsing module + if (it == configuration.moduleConfigurations.end()) { + configuration.moduleConfigurations["GlobeBrowsing"] = ghoul::Dictionary(); + } + if (settings.mrf.isEnabled.has_value()) { + configuration.moduleConfigurations["GlobeBrowsing"].setValue( + "MRFCacheEnabled", *settings.mrf.isEnabled + ); + } + if (settings.mrf.location.has_value()) { + configuration.moduleConfigurations["GlobeBrowsing"].setValue( + "MRFCacheLocation", *settings.mrf.location + ); + } +} + documentation::Documentation Configuration::Documentation = codegen::doc("core_configuration"); @@ -483,10 +517,11 @@ std::filesystem::path findConfiguration(const std::string& filename) { } } -Configuration loadConfigurationFromFile(const std::filesystem::path& filename, +Configuration loadConfigurationFromFile(const std::filesystem::path& configurationFile, + const std::filesystem::path& settingsFile, const glm::ivec2& primaryMonitorResolution) { - ghoul_assert(std::filesystem::is_regular_file(filename), "File must exist"); + ghoul_assert(std::filesystem::is_regular_file(configurationFile), "File must exist"); Configuration result; @@ -503,11 +538,17 @@ Configuration loadConfigurationFromFile(const std::filesystem::path& filename, } // Load the configuration file into the state - ghoul::lua::runScriptFile(result.state, filename.string()); + ghoul::lua::runScriptFile(result.state, configurationFile.string()); parseLuaState(result); + if (std::filesystem::is_regular_file(settingsFile)) { + Settings settings = loadSettings(settingsFile); + + patchConfiguration(result, settings); + } + return result; } -} // namespace openspace::configuration +} // namespace openspace diff --git a/src/engine/globals.cpp b/src/engine/globals.cpp index 0d88e41d5f..047fd8a6a5 100644 --- a/src/engine/globals.cpp +++ b/src/engine/globals.cpp @@ -89,7 +89,7 @@ namespace { sizeof(TimeManager) + sizeof(VersionChecker) + sizeof(WindowDelegate) + - sizeof(configuration::Configuration) + + sizeof(Configuration) + sizeof(interaction::ActionManager) + sizeof(interaction::InteractionMonitor) + sizeof(interaction::WebsocketInputStates) + @@ -266,11 +266,11 @@ void create() { #endif // WIN32 #ifdef WIN32 - configuration = new (currentPos) configuration::Configuration; + configuration = new (currentPos) Configuration; ghoul_assert(configuration, "No configuration"); - currentPos += sizeof(configuration::Configuration); + currentPos += sizeof(Configuration); #else // ^^^ WIN32 / !WIN32 vvv - configuration = new configuration::Configuration; + configuration = new Configuration; #endif // WIN32 #ifdef WIN32 diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index b6eb9c8103..c273cf3bcc 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -321,7 +321,7 @@ void OpenSpaceEngine::initialize() { DocEng.addDocumentation(doc); } } - DocEng.addDocumentation(configuration::Configuration::Documentation); + DocEng.addDocumentation(Configuration::Documentation); // Register the provided shader directories ghoul::opengl::ShaderPreprocessor::addIncludePath(absPath("${SHADERS}")); @@ -519,7 +519,7 @@ void OpenSpaceEngine::initializeGL() { bool synchronous = global::configuration->openGLDebugContext.isSynchronous; setDebugOutput(DebugOutput(debugActive), SynchronousOutput(synchronous)); - for (const configuration::Configuration::OpenGLDebugContext::IdentifierFilter& f : + for (const Configuration::OpenGLDebugContext::IdentifierFilter& f : global::configuration->openGLDebugContext.identifierFilters) { setDebugMessageControl( diff --git a/src/engine/settings.cpp b/src/engine/settings.cpp new file mode 100644 index 0000000000..6ae9451721 --- /dev/null +++ b/src/engine/settings.cpp @@ -0,0 +1,184 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2023 * + * * + * 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 + +namespace openspace { + +namespace { +template +std::optional get_to(nlohmann::json& obj, const std::string& key) +{ + auto it = obj.find(key); + if (it != obj.end()) { + return it->get(); + } + else { + return std::nullopt; + } +} +} // namespace + +namespace version1 { + Settings parseSettings(nlohmann::json json) { + ghoul_assert(json.at("version").get() == 1, "Wrong value"); + + Settings settings; + settings.hasStartedBefore = get_to(json, "started-before"); + settings.configuration = get_to(json, "config"); + settings.rememberLastConfiguration = get_to(json, "config-remember"); + settings.profile = get_to(json, "profile"); + settings.rememberLastProfile = get_to(json, "profile-remember"); + std::optional visibility = get_to(json, "visibility"); + if (visibility.has_value()) { + if (*visibility == "NoviceUser") { + settings.visibility = properties::Property::Visibility::NoviceUser; + } + else if (*visibility == "User") { + settings.visibility = properties::Property::Visibility::User; + } + else if (*visibility == "AdvancedUser") { + settings.visibility = properties::Property::Visibility::AdvancedUser; + } + else if (*visibility == "Developer") { + settings.visibility = properties::Property::Visibility::Developer; + } + else { + throw ghoul::RuntimeError(fmt::format( + "Unknown visibility value {}", *visibility + )); + } + } + settings.bypassLauncher = get_to(json, "bypass"); + + if (auto it = json.find("mrf"); it != json.end()) { + if (!it->is_object()) { + throw ghoul::RuntimeError("'mrf' is not an object"); + } + Settings::MRF mrf; + mrf.isEnabled = get_to(*it, "enabled"); + mrf.location = get_to(*it, "location"); + + if (mrf.isEnabled.has_value() || mrf.location.has_value()) { + settings.mrf = mrf; + } + } + + return settings; + } +} // namespace version1 + +std::filesystem::path findSettings(const std::string& filename) { + // Right now the settings file lives next to the openspace.cfg file + + std::filesystem::path path = findConfiguration(); + std::filesystem::path result = path.parent_path() / filename; + return result; +} + +Settings loadSettings(const std::filesystem::path& filename) { + if (!std::filesystem::is_regular_file(filename)) { + return Settings(); + } + + std::ifstream f(filename); + std::stringstream buffer; + buffer << f.rdbuf(); + std::string contents = buffer.str(); + + nlohmann::json setting = nlohmann::json::parse(contents); + if (setting.empty()) { + return Settings(); + } + + int version = setting.at("version").get(); + if (version == 1) { + return version1::parseSettings(setting); + } + + throw ghoul::RuntimeError(fmt::format( + "Unrecognized version for setting: {}", version + )); +} + +void saveSettings(const Settings& settings, const std::filesystem::path& filename) { + nlohmann::json json = nlohmann::json::object(); + + json["version"] = 1; + + if (settings.hasStartedBefore.has_value()) { + json["started-before"] = *settings.hasStartedBefore; + } + if (settings.configuration.has_value()) { + json["config"] = *settings.configuration; + } + if (settings.rememberLastConfiguration.has_value()) { + json["config-remember"] = *settings.rememberLastConfiguration; + } + if (settings.profile.has_value()) { + json["profile"] = *settings.profile; + } + if (settings.rememberLastProfile.has_value()) { + json["profile-remember"] = *settings.rememberLastProfile; + } + if (settings.visibility.has_value()) { + switch (*settings.visibility) { + case properties::Property::Visibility::NoviceUser: + json["visibility"] = "NoviceUser"; + break; + case properties::Property::Visibility::User: + json["visibility"] = "User"; + break; + case properties::Property::Visibility::AdvancedUser: + json["visibility"] = "AdvancedUser"; + break; + case properties::Property::Visibility::Developer: + json["visibility"] = "Developer"; + break; + + } + } + if (settings.bypassLauncher.has_value()) { + json["bypass"] = *settings.bypassLauncher; + } + nlohmann::json mrf = nlohmann::json::object(); + if (settings.mrf.isEnabled.has_value()) { + mrf["enabled"] = *settings.mrf.isEnabled; + } + if (settings.mrf.location.has_value()) { + mrf["location"] = *settings.mrf.location; + } + + if (!mrf.empty()) { + json["mrf"] = mrf; + } + + std::string content = json.dump(2); + std::ofstream f(filename); + f << content; +} + +} // namespace openspace diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 2061c8b5e1..ec526678e3 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -523,7 +523,7 @@ void RenderEngine::initializeGL() { // initialized window _horizFieldOfView = static_cast(global::windowDelegate->getHorizFieldOfView()); - configuration::Configuration::FontSizes fontSize = global::configuration->fontSize; + Configuration::FontSizes fontSize = global::configuration->fontSize; { ZoneScopedN("Fonts"); TracyGpuZone("Fonts"); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ed0d17c326..98bc129461 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -38,6 +38,7 @@ add_executable( test_profile.cpp test_rawvolumeio.cpp test_scriptscheduler.cpp + test_settings.cpp test_sgctedit.cpp test_spicemanager.cpp test_timeconversion.cpp diff --git a/tests/main.cpp b/tests/main.cpp index a6afbb6ad7..0aa736f681 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -58,13 +58,14 @@ int main(int argc, char** argv) { ghoul::filesystem::FileSystem::Override::Yes ); - std::filesystem::path configFile = configuration::findConfiguration(); + std::filesystem::path configFile = findConfiguration(); // Register the base path as the directory where 'filename' lives std::filesystem::path base = configFile.parent_path(); FileSys.registerPathToken("${BASE}", base); - *global::configuration = configuration::loadConfigurationFromFile( + *global::configuration = loadConfigurationFromFile( configFile.string(), + "", glm::ivec2(0) ); global::openSpaceEngine->registerPathTokens(); diff --git a/tests/test_settings.cpp b/tests/test_settings.cpp new file mode 100644 index 0000000000..81875594be --- /dev/null +++ b/tests/test_settings.cpp @@ -0,0 +1,863 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2023 * + * * + * 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 + +using namespace openspace; + +TEST_CASE("Settings Load: Empty", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1 +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_empty.json"; + { + std::ofstream f(file); + f << Source; + } + + Settings settings = loadSettings(file); + + CHECK(!settings.hasStartedBefore.has_value()); + CHECK(!settings.configuration.has_value()); + CHECK(!settings.rememberLastConfiguration.has_value()); + CHECK(!settings.profile.has_value()); + CHECK(!settings.rememberLastProfile.has_value()); + CHECK(!settings.visibility.has_value()); + CHECK(!settings.bypassLauncher.has_value()); + CHECK(!settings.mrf.isEnabled.has_value()); + CHECK(!settings.mrf.location.has_value()); +} + +TEST_CASE("Settings Load: Really Empty", "[settings]") { + constexpr std::string_view Source = R"( +{ +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_really-empty.json"; + { + std::ofstream f(file); + f << Source; + } + + Settings settings = loadSettings(file); + + CHECK(!settings.hasStartedBefore.has_value()); + CHECK(!settings.configuration.has_value()); + CHECK(!settings.rememberLastConfiguration.has_value()); + CHECK(!settings.profile.has_value()); + CHECK(!settings.rememberLastProfile.has_value()); + CHECK(!settings.visibility.has_value()); + CHECK(!settings.bypassLauncher.has_value()); + CHECK(!settings.mrf.isEnabled.has_value()); + CHECK(!settings.mrf.location.has_value()); +} + +TEST_CASE("Settings Save: Empty", "[settings]") { + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_save_empty.json"; + + Settings srcSettings; + saveSettings(srcSettings, file); + + Settings cmpSettings = loadSettings(file); + CHECK(srcSettings == cmpSettings); +} + +TEST_CASE("Settings Load: Started Before", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "started-before": false +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_started-before.json"; + { + std::ofstream f(file); + f << Source; + } + + Settings settings = loadSettings(file); + + REQUIRE(settings.hasStartedBefore.has_value()); + CHECK(*settings.hasStartedBefore == false); + CHECK(!settings.configuration.has_value()); + CHECK(!settings.rememberLastConfiguration.has_value()); + CHECK(!settings.profile.has_value()); + CHECK(!settings.rememberLastProfile.has_value()); + CHECK(!settings.visibility.has_value()); + CHECK(!settings.bypassLauncher.has_value()); + CHECK(!settings.mrf.isEnabled.has_value()); + CHECK(!settings.mrf.location.has_value()); +} + +TEST_CASE("Settings Save: Started Before", "[settings]") { + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_save_started-before.json"; + + Settings srcSettings = { + .hasStartedBefore = false + }; + saveSettings(srcSettings, file); + + Settings cmpSettings = loadSettings(file); + CHECK(srcSettings == cmpSettings); +} + +TEST_CASE("Settings Load: Configuration", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "config": "abc" +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_config.json"; + { + std::ofstream f(file); + f << Source; + } + + Settings settings = loadSettings(file); + + CHECK(!settings.hasStartedBefore.has_value()); + REQUIRE(settings.configuration.has_value()); + CHECK(*settings.configuration == "abc"); + CHECK(!settings.rememberLastConfiguration.has_value()); + CHECK(!settings.profile.has_value()); + CHECK(!settings.rememberLastProfile.has_value()); + CHECK(!settings.visibility.has_value()); + CHECK(!settings.bypassLauncher.has_value()); + CHECK(!settings.mrf.isEnabled.has_value()); + CHECK(!settings.mrf.location.has_value()); +} + +TEST_CASE("Settings Save: Configuration", "[settings]") { + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_save_config.json"; + + Settings srcSettings = { + .configuration = "abc" + }; + saveSettings(srcSettings, file); + + Settings cmpSettings = loadSettings(file); + CHECK(srcSettings == cmpSettings); +} + +TEST_CASE("Settings Load: Configuration Remember", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "config-remember": true +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_config_remember.json"; + { + std::ofstream f(file); + f << Source; + } + + Settings settings = loadSettings(file); + + CHECK(!settings.hasStartedBefore.has_value()); + CHECK(!settings.configuration.has_value()); + REQUIRE(settings.rememberLastConfiguration.has_value()); + CHECK(*settings.rememberLastConfiguration == true); + CHECK(!settings.profile.has_value()); + CHECK(!settings.rememberLastProfile.has_value()); + CHECK(!settings.visibility.has_value()); + CHECK(!settings.bypassLauncher.has_value()); + CHECK(!settings.mrf.isEnabled.has_value()); + CHECK(!settings.mrf.location.has_value()); +} + +TEST_CASE("Settings Save: Configuration Remember", "[settings]") { + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_save_config_remember.json"; + + Settings srcSettings = { + .rememberLastConfiguration = true + }; + saveSettings(srcSettings, file); + + Settings cmpSettings = loadSettings(file); + CHECK(srcSettings == cmpSettings); +} + +TEST_CASE("Settings Load: Profile", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "profile": "def" +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_profile.json"; + { + std::ofstream f(file); + f << Source; + } + + Settings settings = loadSettings(file); + + CHECK(!settings.hasStartedBefore.has_value()); + CHECK(!settings.configuration.has_value()); + CHECK(!settings.rememberLastConfiguration.has_value()); + REQUIRE(settings.profile.has_value()); + CHECK(*settings.profile == "def"); + CHECK(!settings.rememberLastProfile.has_value()); + CHECK(!settings.visibility.has_value()); + CHECK(!settings.bypassLauncher.has_value()); + CHECK(!settings.mrf.isEnabled.has_value()); + CHECK(!settings.mrf.location.has_value()); +} + +TEST_CASE("Settings Save: Profile", "[settings]") { + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_save_profile.json"; + + Settings srcSettings = { + .profile = "def" + }; + saveSettings(srcSettings, file); + + Settings cmpSettings = loadSettings(file); + CHECK(srcSettings == cmpSettings); +} + +TEST_CASE("Settings Load: Profile Remember", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "profile-remember": false +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_profile_remember.json"; + { + std::ofstream f(file); + f << Source; + } + + Settings settings = loadSettings(file); + + CHECK(!settings.hasStartedBefore.has_value()); + CHECK(!settings.configuration.has_value()); + CHECK(!settings.rememberLastConfiguration.has_value()); + CHECK(!settings.profile.has_value()); + REQUIRE(settings.rememberLastProfile.has_value()); + CHECK(*settings.rememberLastProfile == false); + CHECK(!settings.visibility.has_value()); + CHECK(!settings.bypassLauncher.has_value()); + CHECK(!settings.mrf.isEnabled.has_value()); + CHECK(!settings.mrf.location.has_value()); +} + +TEST_CASE("Settings Save: Profile Remember", "[settings]") { + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_save_profile.json"; + + Settings srcSettings = { + .rememberLastProfile = false + }; + saveSettings(srcSettings, file); + + Settings cmpSettings = loadSettings(file); + CHECK(srcSettings == cmpSettings); +} + +TEST_CASE("Settings Load: Visibility/NoviceUser", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "visibility": "NoviceUser" +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_visibility_novice.json"; + { + std::ofstream f(file); + f << Source; + } + + Settings settings = loadSettings(file); + + CHECK(!settings.hasStartedBefore.has_value()); + CHECK(!settings.configuration.has_value()); + CHECK(!settings.rememberLastConfiguration.has_value()); + CHECK(!settings.profile.has_value()); + CHECK(!settings.rememberLastProfile.has_value()); + REQUIRE(settings.visibility.has_value()); + CHECK(*settings.visibility == properties::Property::Visibility::NoviceUser); + CHECK(!settings.bypassLauncher.has_value()); + CHECK(!settings.mrf.isEnabled.has_value()); + CHECK(!settings.mrf.location.has_value()); +} + +TEST_CASE("Settings Save: Visibility/NoviceUser", "[settings]") { + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_save_noviceuser.json"; + + Settings srcSettings = { + .visibility = openspace::properties::Property::Visibility::NoviceUser + }; + saveSettings(srcSettings, file); + + Settings cmpSettings = loadSettings(file); + CHECK(srcSettings == cmpSettings); +} + +TEST_CASE("Settings Load: Visibility/User", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "visibility": "User" +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_visibility_user.json"; + { + std::ofstream f(file); + f << Source; + } + + Settings settings = loadSettings(file); + + CHECK(!settings.hasStartedBefore.has_value()); + CHECK(!settings.configuration.has_value()); + CHECK(!settings.rememberLastConfiguration.has_value()); + CHECK(!settings.profile.has_value()); + CHECK(!settings.rememberLastProfile.has_value()); + REQUIRE(settings.visibility.has_value()); + CHECK(*settings.visibility == properties::Property::Visibility::User); + CHECK(!settings.bypassLauncher.has_value()); + CHECK(!settings.mrf.isEnabled.has_value()); + CHECK(!settings.mrf.location.has_value()); +} + +TEST_CASE("Settings Save: Visibility/User", "[settings]") { + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_save_user.json"; + + Settings srcSettings = { + .visibility = openspace::properties::Property::Visibility::User + }; + saveSettings(srcSettings, file); + + Settings cmpSettings = loadSettings(file); + CHECK(srcSettings == cmpSettings); +} + +TEST_CASE("Settings Load: Visibility/AdvancedUser", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "visibility": "AdvancedUser" +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_visibility_advanced.json"; + { + std::ofstream f(file); + f << Source; + } + + Settings settings = loadSettings(file); + + CHECK(!settings.hasStartedBefore.has_value()); + CHECK(!settings.configuration.has_value()); + CHECK(!settings.rememberLastConfiguration.has_value()); + CHECK(!settings.profile.has_value()); + CHECK(!settings.rememberLastProfile.has_value()); + REQUIRE(settings.visibility.has_value()); + CHECK(*settings.visibility == properties::Property::Visibility::AdvancedUser); + CHECK(!settings.bypassLauncher.has_value()); + CHECK(!settings.mrf.isEnabled.has_value()); + CHECK(!settings.mrf.location.has_value()); +} + +TEST_CASE("Settings Save: Visibility/AdvancedUser", "[settings]") { + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_save_advanceduser.json"; + + Settings srcSettings = { + .visibility = openspace::properties::Property::Visibility::AdvancedUser + }; + saveSettings(srcSettings, file); + + Settings cmpSettings = loadSettings(file); + CHECK(srcSettings == cmpSettings); +} + +TEST_CASE("Settings Load: Visibility/Developer", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "visibility": "Developer" +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_visibility_developer.json"; + { + std::ofstream f(file); + f << Source; + } + + Settings settings = loadSettings(file); + + CHECK(!settings.hasStartedBefore.has_value()); + CHECK(!settings.configuration.has_value()); + CHECK(!settings.rememberLastConfiguration.has_value()); + CHECK(!settings.profile.has_value()); + CHECK(!settings.rememberLastProfile.has_value()); + REQUIRE(settings.visibility.has_value()); + CHECK(*settings.visibility == properties::Property::Visibility::Developer); + CHECK(!settings.bypassLauncher.has_value()); + CHECK(!settings.mrf.isEnabled.has_value()); + CHECK(!settings.mrf.location.has_value()); +} + +TEST_CASE("Settings Save: Visibility/Developer", "[settings]") { + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_save_developer.json"; + + Settings srcSettings = { + .visibility = openspace::properties::Property::Visibility::Developer + }; + saveSettings(srcSettings, file); + + Settings cmpSettings = loadSettings(file); + CHECK(srcSettings == cmpSettings); +} + +TEST_CASE("Settings Load: Bypass Launcher", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "bypass": false +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_bypass.json"; + { + std::ofstream f(file); + f << Source; + } + + Settings settings = loadSettings(file); + + CHECK(!settings.hasStartedBefore.has_value()); + CHECK(!settings.configuration.has_value()); + CHECK(!settings.rememberLastConfiguration.has_value()); + CHECK(!settings.profile.has_value()); + CHECK(!settings.rememberLastProfile.has_value()); + CHECK(!settings.visibility.has_value()); + REQUIRE(settings.bypassLauncher.has_value()); + CHECK(*settings.bypassLauncher == false); + CHECK(!settings.mrf.isEnabled.has_value()); + CHECK(!settings.mrf.location.has_value()); +} + +TEST_CASE("Settings Save: Bypass Launcher", "[settings]") { + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_save_bypass.json"; + + Settings srcSettings = { + .bypassLauncher = false + }; + saveSettings(srcSettings, file); + + Settings cmpSettings = loadSettings(file); + CHECK(srcSettings == cmpSettings); +} + +TEST_CASE("Settings Load: MRF IsEnabled", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "mrf": { + "enabled": true + } +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_mrf_isenabled.json"; + { + std::ofstream f(file); + f << Source; + } + + Settings settings = loadSettings(file); + + CHECK(!settings.hasStartedBefore.has_value()); + CHECK(!settings.configuration.has_value()); + CHECK(!settings.rememberLastConfiguration.has_value()); + CHECK(!settings.profile.has_value()); + CHECK(!settings.rememberLastProfile.has_value()); + CHECK(!settings.visibility.has_value()); + CHECK(!settings.bypassLauncher.has_value()); + REQUIRE(settings.mrf.isEnabled.has_value()); + CHECK(*settings.mrf.isEnabled == true); + CHECK(!settings.mrf.location.has_value()); +} + +TEST_CASE("Settings Save: MRF IsEnabled", "[settings]") { + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_save_mrf_isenabled.json"; + + Settings srcSettings = { + .mrf = Settings::MRF { + .isEnabled = true + } + }; + saveSettings(srcSettings, file); + + Settings cmpSettings = loadSettings(file); + CHECK(srcSettings == cmpSettings); +} + +TEST_CASE("Settings Load: MRF Location", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "mrf": { + "location": "ghi" + } +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_mrf_location.json"; + { + std::ofstream f(file); + f << Source; + } + + Settings settings = loadSettings(file); + + CHECK(!settings.hasStartedBefore.has_value()); + CHECK(!settings.configuration.has_value()); + CHECK(!settings.rememberLastConfiguration.has_value()); + CHECK(!settings.profile.has_value()); + CHECK(!settings.rememberLastProfile.has_value()); + CHECK(!settings.visibility.has_value()); + CHECK(!settings.bypassLauncher.has_value()); + CHECK(!settings.mrf.isEnabled.has_value()); + REQUIRE(settings.mrf.location.has_value()); + CHECK(*settings.mrf.location == "ghi"); +} + +TEST_CASE("Settings Save: MRF Location", "[settings]") { + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_save_mrf_location.json"; + + Settings srcSettings = { + .mrf = Settings::MRF { + .location = "ghi" + } + }; + saveSettings(srcSettings, file); + + Settings cmpSettings = loadSettings(file); + CHECK(srcSettings == cmpSettings); +} + +TEST_CASE("Settings Load: Full", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "started-before": false, + "config": "abc", + "config-remember": true, + "profile": "def", + "profile-remember": false, + "visibility": "NoviceUser", + "bypass": false, + "mrf": { + "enabled": true, + "location": "ghi" + } +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_full.json"; + { + std::ofstream f(file); + f << Source; + } + + Settings settings = loadSettings(file); + + REQUIRE(settings.hasStartedBefore.has_value()); + CHECK(*settings.hasStartedBefore == false); + REQUIRE(settings.configuration.has_value()); + CHECK(*settings.configuration == "abc"); + REQUIRE(settings.rememberLastConfiguration.has_value()); + CHECK(*settings.rememberLastConfiguration == true); + REQUIRE(settings.profile.has_value()); + CHECK(*settings.profile == "def"); + REQUIRE(settings.rememberLastProfile.has_value()); + CHECK(*settings.rememberLastProfile == false); + REQUIRE(settings.visibility.has_value()); + CHECK(*settings.visibility == properties::Property::Visibility::NoviceUser); + REQUIRE(settings.bypassLauncher.has_value()); + CHECK(*settings.bypassLauncher == false); + REQUIRE(settings.mrf.isEnabled.has_value()); + CHECK(*settings.mrf.isEnabled == true); + REQUIRE(settings.mrf.location.has_value()); + CHECK(*settings.mrf.location == "ghi"); +} + +TEST_CASE("Settings Save: Full", "[settings]") { + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_save_full.json"; + + Settings srcSettings = { + .hasStartedBefore = false, + .configuration = "abc", + .rememberLastConfiguration = true, + .profile = "def", + .rememberLastProfile = false, + .visibility = openspace::properties::Property::Visibility::NoviceUser, + .bypassLauncher = false, + .mrf = Settings::MRF { + .isEnabled = true, + .location = "ghi" + } + }; + saveSettings(srcSettings, file); + + Settings cmpSettings = loadSettings(file); + CHECK(srcSettings == cmpSettings); +} + +TEST_CASE("Settings Load Fail: Illegal version", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": -1 +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_fail_illegal_version.json"; + { + std::ofstream f(file); + f << Source; + } + + CHECK_THROWS(loadSettings(file)); +} + +TEST_CASE("Settings Load Fail: Started before", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "started-before": "abc" +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_fail_started-before.json"; + { + std::ofstream f(file); + f << Source; + } + + CHECK_THROWS(loadSettings(file)); +} + +TEST_CASE("Settings Load Fail: Config", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "config": 1 +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_fail_config.json"; + { + std::ofstream f(file); + f << Source; + } + + CHECK_THROWS(loadSettings(file)); +} + +TEST_CASE("Settings Load Fail: Profile", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "profile": 1 +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_fail_profile.json"; + { + std::ofstream f(file); + f << Source; + } + + CHECK_THROWS(loadSettings(file)); +} + +TEST_CASE("Settings Load Fail: Visibility type", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "visibility": 1 +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_fail_visibility_type.json"; + { + std::ofstream f(file); + f << Source; + } + + CHECK_THROWS(loadSettings(file)); +} + +TEST_CASE("Settings Load Fail: Visibility value", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "visibility": "abc" +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_fail_visibility_value.json"; + { + std::ofstream f(file); + f << Source; + } + + CHECK_THROWS(loadSettings(file)); +} + +TEST_CASE("Settings Load Fail: Bypass Launcher", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "bypass": 1 +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_fail_bypass.json"; + { + std::ofstream f(file); + f << Source; + } + + CHECK_THROWS(loadSettings(file)); +} + +TEST_CASE("Settings Load Fail: MRF", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "mrf": 1 +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_fail_mrf.json"; + { + std::ofstream f(file); + f << Source; + } + + CHECK_THROWS(loadSettings(file)); +} + +TEST_CASE("Settings Load Fail: MRF/enabled", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "mrf": { + "enabled": 1 + } +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_fail_mrf_enabled.json"; + { + std::ofstream f(file); + f << Source; + } + + CHECK_THROWS(loadSettings(file)); +} + +TEST_CASE("Settings Load Fail: MRF/location", "[settings]") { + constexpr std::string_view Source = R"( +{ + "version": 1, + "mrf": { + "location": 1 + } +} +)"; + + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "test_settings_load_fail_mrf_location.json"; + { + std::ofstream f(file); + f << Source; + } + + CHECK_THROWS(loadSettings(file)); +} diff --git a/tests/test_sgctedit.cpp b/tests/test_sgctedit.cpp index ea224bf9c0..bca8b65e8d 100644 --- a/tests/test_sgctedit.cpp +++ b/tests/test_sgctedit.cpp @@ -34,7 +34,7 @@ #include #include -using namespace openspace::configuration; +using namespace openspace; namespace { std::string stringify(const std::string filename) { From 098cced1e735728df6b21f309a836719c4057dac Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 13 Nov 2023 10:17:22 +0100 Subject: [PATCH 166/701] Undo accidental removal of UI code --- openspace.cfg | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/openspace.cfg b/openspace.cfg index 29ad549d1e..9d39a87a04 100644 --- a/openspace.cfg +++ b/openspace.cfg @@ -161,11 +161,19 @@ ModuleConfigurations = { } } }, + WebBrowser = { + Enabled = true + }, WebGui = { Address = "localhost", HttpPort = 4680, WebSocketInterface = "DefaultWebSocketInterface" }, + CefWebGui = { + -- GuiScale = 2.0, + Enabled = true, + Visible = true + }, Space = { ShowExceptions = false } From 72bb6d3cc48141c5be43cf768a143efb2df8e9f0 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Mon, 13 Nov 2023 15:32:11 +0100 Subject: [PATCH 167/701] Update GUI hash - Rewrite final classes to functional https://github.com/OpenSpace/OpenSpace-WebGuiFrontend/commit/8c0740c66e41742d7b7636b98e7591d9b7ab32a1 - Fix some things that broke wiht that rewrite - Update dependencies - Fix for issue #2893 --- data/assets/util/webgui.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/util/webgui.asset b/data/assets/util/webgui.asset index 35f0e17cd4..49068e90d9 100644 --- a/data/assets/util/webgui.asset +++ b/data/assets/util/webgui.asset @@ -4,7 +4,7 @@ local guiCustomization = asset.require("customization/gui") -- Select which commit hashes to use for the frontend and backend -local frontendHash = "c4fccbef3051522c7b8bcd96aeb20b8126ac2286" +local frontendHash = "061fc129f72a145e8f8182b32113188b13722e67" local frontend = asset.resource({ Identifier = "WebGuiFrontend", From c54e72136da59fdd6d7afd723a245cd2356aba09 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Mon, 13 Nov 2023 16:08:17 +0100 Subject: [PATCH 168/701] Update GUI hash again (closes #2908) --- data/assets/util/webgui.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/util/webgui.asset b/data/assets/util/webgui.asset index 49068e90d9..2059d900f5 100644 --- a/data/assets/util/webgui.asset +++ b/data/assets/util/webgui.asset @@ -4,7 +4,7 @@ local guiCustomization = asset.require("customization/gui") -- Select which commit hashes to use for the frontend and backend -local frontendHash = "061fc129f72a145e8f8182b32113188b13722e67" +local frontendHash = "26e709be4e4b17d7fcdbd8f53cf681f4f4126b29" local frontend = asset.resource({ Identifier = "WebGuiFrontend", From 9343c6315dabab2cf17a4ceafd8af02a6e52573d Mon Sep 17 00:00:00 2001 From: Andreas Engberg <48772850+engbergandreas@users.noreply.github.com> Date: Tue, 14 Nov 2023 15:40:30 +0100 Subject: [PATCH 169/701] Adds warning and error messages on loading screen (#2941) Fixes task 1 of (#494) * Removed loading screen progress bar It was removed because it does not show an accurate estimation of load times and is rarely used (off by default) * Add status info to the loading screen on warnings and errors Add: Warning logs and above to loading screen, fixes task 1 of (#494) Removed code duplication in openspanceengine.cpp Fixed some bugs where completed assets would not disappear from the screen * Update the design & address PR comments * Address PR comments & add bool to show/hide log msg * Delete test_configuration.cpp * Update Ghoul submodule * Renders number of warnings and errors to screen * Update renderengine.cpp * Adapt new function to the coding style --------- Co-authored-by: Alexander Bock --- ext/ghoul | 2 +- include/openspace/engine/configuration.h | 2 +- include/openspace/rendering/loadingscreen.h | 24 +- openspace.cfg | 3 +- src/engine/configuration.cpp | 10 +- src/engine/openspaceengine.cpp | 94 +++----- src/rendering/loadingscreen.cpp | 232 +++++++++++--------- src/rendering/renderengine.cpp | 16 +- src/scene/sceneinitializer.cpp | 1 - 9 files changed, 192 insertions(+), 192 deletions(-) diff --git a/ext/ghoul b/ext/ghoul index f658ead151..50cf606576 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit f658ead151995fe77830b43b6559f95b6eaa2981 +Subproject commit 50cf6065769420d36c07dad0c9c5a7f60cfa7bd6 diff --git a/include/openspace/engine/configuration.h b/include/openspace/engine/configuration.h index 20232bf756..9d7a64c433 100644 --- a/include/openspace/engine/configuration.h +++ b/include/openspace/engine/configuration.h @@ -88,7 +88,7 @@ struct Configuration { struct LoadingScreen { bool isShowingMessages = true; bool isShowingNodeNames = true; - bool isShowingProgressbar = true; + bool isShowingLogMessages = true; }; LoadingScreen loadingScreen; diff --git a/include/openspace/rendering/loadingscreen.h b/include/openspace/rendering/loadingscreen.h index 0dec3d3986..dc3049ce8e 100644 --- a/include/openspace/rendering/loadingscreen.h +++ b/include/openspace/rendering/loadingscreen.h @@ -25,6 +25,7 @@ #ifndef __OPENSPACE_CORE___LOADINGSCREEN___H__ #define __OPENSPACE_CORE___LOADINGSCREEN___H__ +#include #include #include #include @@ -49,11 +50,11 @@ class LoadingScreen { public: BooleanType(ShowMessage); BooleanType(ShowNodeNames); - BooleanType(ShowProgressbar); + BooleanType(ShowLogMessages); BooleanType(CatastrophicError); LoadingScreen(ShowMessage showMessage, ShowNodeNames showNodeNames, - ShowProgressbar showProgressbar); + ShowLogMessages showLogMessages); ~LoadingScreen(); void render(); @@ -63,10 +64,6 @@ public: void finalize(); - void setItemNumber(int nItems); - int itemNumber(); - void tickItem(); - enum class Phase { PreStart, Construction, @@ -94,19 +91,21 @@ public: ItemStatus newStatus, ProgressInfo progressInfo); private: - bool _showMessage; - bool _showNodeNames; - bool _showProgressbar; + + void renderLogMessages() const; + + bool _showMessage = true; + bool _showNodeNames = true; + bool _showLog = true; Phase _phase = Phase::PreStart; - std::atomic_int _iProgress = 0; - std::atomic_int _nItems = 0; std::unique_ptr _logoTexture; std::shared_ptr _loadingFont; std::shared_ptr _messageFont; std::shared_ptr _itemFont; + std::shared_ptr _logFont; bool _hasCatastrophicErrorOccurred = false; std::string _message; @@ -130,6 +129,9 @@ private: std::random_device _randomDevice; std::default_random_engine _randomEngine; + + // Non owning but we remove the log from LogManager on destruction + ScreenLog* _log = nullptr; }; } // namespace openspace diff --git a/openspace.cfg b/openspace.cfg index 9d39a87a04..987762dc5f 100644 --- a/openspace.cfg +++ b/openspace.cfg @@ -217,8 +217,7 @@ VersionCheckUrl = "http://data.openspaceproject.com/latest-version" UseMultithreadedInitialization = true LoadingScreen = { ShowMessage = true, - ShowNodeNames = true, - ShowProgressbar = false + ShowNodeNames = true } CheckOpenGLState = false LogEachOpenGLCall = false diff --git a/src/engine/configuration.cpp b/src/engine/configuration.cpp index 780a4298c6..d33f041821 100644 --- a/src/engine/configuration.cpp +++ b/src/engine/configuration.cpp @@ -297,9 +297,9 @@ namespace { // initialized) std::optional showNodeNames; - // If this value is set to 'true', the loading screen will contain a progress - // bar that gives an estimate of the loading progression - std::optional showProgressbar; + // If this value is set to 'true', the loading screen will display a list of + // warning and error messages + std::optional showLogMessages; }; // Values in this table describe the behavior of the loading screen that is // displayed while the scene graph is created and initialized @@ -413,10 +413,10 @@ void parseLuaState(Configuration& configuration) { const Parameters::LoadingScreen& l = *p.loadingScreen; c.loadingScreen.isShowingMessages = l.showMessage.value_or(c.loadingScreen.isShowingMessages); - c.loadingScreen.isShowingProgressbar = - l.showProgressbar.value_or(c.loadingScreen.isShowingProgressbar); c.loadingScreen.isShowingNodeNames = l.showNodeNames.value_or(c.loadingScreen.isShowingNodeNames); + c.loadingScreen.isShowingLogMessages = + l.showLogMessages.value_or(c.loadingScreen.isShowingLogMessages); } c.moduleConfigurations = p.moduleConfigurations.value_or(c.moduleConfigurations); diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index c273cf3bcc..0d79e58b38 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -62,6 +62,7 @@ #include #include #include +#include #include #include #include @@ -477,17 +478,13 @@ void OpenSpaceEngine::initializeGL() { LoadingScreen::ShowNodeNames( global::configuration->loadingScreen.isShowingNodeNames ), - LoadingScreen::ShowProgressbar( - global::configuration->loadingScreen.isShowingProgressbar + LoadingScreen::ShowLogMessages( + global::configuration->loadingScreen.isShowingLogMessages ) - ); + ); _loadingScreen->render(); - - - - LTRACE("OpenSpaceEngine::initializeGL::Console::initialize(begin)"); try { global::luaConsole->initialize(); @@ -743,6 +740,8 @@ void OpenSpaceEngine::loadAssets() { _loadingScreen->setPhase(LoadingScreen::Phase::Construction); _loadingScreen->postMessage("Loading assets"); + std::unordered_set finishedSynchronizations; + while (true) { _loadingScreen->render(); _assetManager->update(); @@ -752,59 +751,20 @@ void OpenSpaceEngine::loadAssets() { std::vector allSyncs = _assetManager->allSynchronizations(); - for (const ResourceSynchronization* sync : allSyncs) { - ZoneScopedN("Update resource synchronization"); - - if (sync->isSyncing()) { - LoadingScreen::ProgressInfo progressInfo; - - progressInfo.progress = [](const ResourceSynchronization* s) { - if (!s->nTotalBytesIsKnown()) { - return 0.f; - } - if (s->nTotalBytes() == 0) { - return 1.f; - } - return - static_cast(s->nSynchronizedBytes()) / - static_cast(s->nTotalBytes()); - }(sync); - - _loadingScreen->updateItem( - sync->identifier(), - sync->name(), - LoadingScreen::ItemStatus::Started, - progressInfo - ); + // Filter already synchronized assets so we don't check them anymore + auto syncIt = std::remove_if( + allSyncs.begin(), + allSyncs.end(), + [&finishedSynchronizations](const ResourceSynchronization* sync) { + return finishedSynchronizations.contains(sync); } - - if (sync->isRejected()) { - _loadingScreen->updateItem( - sync->identifier(), sync->name(), LoadingScreen::ItemStatus::Failed, - LoadingScreen::ProgressInfo() - ); - } - } - - _loadingScreen->setItemNumber(static_cast(allSyncs.size())); - - if (_shouldAbortLoading) { - global::windowDelegate->terminate(); - break; - } - - bool finishedLoading = std::all_of( - allAssets.begin(), - allAssets.end(), - [](const Asset* asset) { return asset->isInitialized() || asset->isFailed(); } ); - - if (finishedLoading) { - break; - } + allSyncs.erase(syncIt, allSyncs.end()); auto it = allSyncs.begin(); while (it != allSyncs.end()) { + ZoneScopedN("Update resource synchronization"); + if ((*it)->isSyncing()) { LoadingScreen::ProgressInfo progressInfo; @@ -835,7 +795,9 @@ void OpenSpaceEngine::loadAssets() { } else if ((*it)->isRejected()) { _loadingScreen->updateItem( - (*it)->identifier(), (*it)->name(), LoadingScreen::ItemStatus::Failed, + (*it)->identifier(), + (*it)->name(), + LoadingScreen::ItemStatus::Failed, LoadingScreen::ProgressInfo() ); ++it; @@ -844,17 +806,33 @@ void OpenSpaceEngine::loadAssets() { LoadingScreen::ProgressInfo progressInfo; progressInfo.progress = 1.f; - _loadingScreen->tickItem(); _loadingScreen->updateItem( (*it)->identifier(), (*it)->name(), LoadingScreen::ItemStatus::Finished, progressInfo ); + finishedSynchronizations.insert(*it); it = allSyncs.erase(it); } } - } + + if (_shouldAbortLoading) { + global::windowDelegate->terminate(); + break; + } + + bool finishedLoading = std::all_of( + allAssets.begin(), + allAssets.end(), + [](const Asset* asset) { return asset->isInitialized() || asset->isFailed(); } + ); + + if (finishedLoading) { + break; + } + } // while(true) + if (_shouldAbortLoading) { _loadingScreen = nullptr; return; diff --git a/src/rendering/loadingscreen.cpp b/src/rendering/loadingscreen.cpp index ba8672113f..a50aed0e92 100644 --- a/src/rendering/loadingscreen.cpp +++ b/src/rendering/loadingscreen.cpp @@ -47,16 +47,11 @@ namespace { constexpr float LoadingFontSize = 25.f; constexpr float MessageFontSize = 22.f; constexpr float ItemFontSize = 10.f; + constexpr float LogFontSize = 10.f; constexpr glm::vec2 LogoCenter = glm::vec2(0.f, 0.525f); // in NDC constexpr glm::vec2 LogoSize = glm::vec2(0.275f, 0.275); // in NDC - constexpr glm::vec2 ProgressbarCenter = glm::vec2(0.f, -0.75f); // in NDC - constexpr glm::vec2 ProgressbarSize = glm::vec2(0.7f, 0.0075f); // in NDC - constexpr float ProgressbarLineWidth = 0.0025f; // in NDC - - constexpr glm::vec4 ProgressbarOutlineColor = glm::vec4(0.9f, 0.9f, 0.9f, 1.f); - constexpr glm::vec4 PhaseColorConstruction = glm::vec4(0.7f, 0.7f, 0.f, 1.f); constexpr glm::vec4 PhaseColorSynchronization = glm::vec4(0.9f, 0.9f, 0.9f, 1.f); constexpr glm::vec4 PhaseColorInitialization = glm::vec4(0.1f, 0.75f, 0.1f, 1.f); @@ -70,6 +65,7 @@ namespace { constexpr float LoadingTextPosition = 0.275f; // in NDC constexpr float StatusMessageOffset = 0.225f; // in NDC + constexpr float LogBackgroundPosition = 0.125f; // in NDC constexpr int MaxNumberLocationSamples = 1000; @@ -103,15 +99,25 @@ namespace { namespace openspace { LoadingScreen::LoadingScreen(ShowMessage showMessage, ShowNodeNames showNodeNames, - ShowProgressbar showProgressbar) + ShowLogMessages showLogMessages) : _showMessage(showMessage) , _showNodeNames(showNodeNames) - , _showProgressbar(showProgressbar) + , _showLog(showLogMessages) , _randomEngine(_randomDevice()) { + constexpr std::chrono::seconds ScreenLogTimeToLive(20); + std::unique_ptr log = std::make_unique( + ScreenLogTimeToLive, + ScreenLog::LogLevel::Warning + ); + _log = log.get(); + ghoul::logging::LogManager::ref().addLog(std::move(log)); + + const float fontScaling = global::windowDelegate->osDpiScaling(); + _loadingFont = global::fontManager->font( "Loading", - LoadingFontSize, + LoadingFontSize * fontScaling, ghoul::fontrendering::FontManager::Outline::No, ghoul::fontrendering::FontManager::LoadGlyphs::No ); @@ -119,7 +125,7 @@ LoadingScreen::LoadingScreen(ShowMessage showMessage, ShowNodeNames showNodeName if (_showMessage) { _messageFont = global::fontManager->font( "Loading", - MessageFontSize, + MessageFontSize * fontScaling, ghoul::fontrendering::FontManager::Outline::No, ghoul::fontrendering::FontManager::LoadGlyphs::No ); @@ -128,7 +134,16 @@ LoadingScreen::LoadingScreen(ShowMessage showMessage, ShowNodeNames showNodeName if (_showNodeNames) { _itemFont = global::fontManager->font( "Loading", - ItemFontSize, + ItemFontSize * fontScaling, + ghoul::fontrendering::FontManager::Outline::No, + ghoul::fontrendering::FontManager::LoadGlyphs::No + ); + } + + if (_showLog) { + _logFont = global::fontManager->font( + "Loading", + LogFontSize * fontScaling, ghoul::fontrendering::FontManager::Outline::No, ghoul::fontrendering::FontManager::LoadGlyphs::No ); @@ -150,6 +165,8 @@ LoadingScreen::~LoadingScreen() { _loadingFont = nullptr; _messageFont = nullptr; _itemFont = nullptr; + ghoul::logging::LogManager::ref().removeLog(_log); + _log = nullptr; } void LoadingScreen::render() { @@ -201,59 +218,6 @@ void LoadingScreen::render() { rendering::helper::Anchor::Center ); - // - // Render progress bar - // - const glm::vec2 progressbarSize = glm::vec2( - ProgressbarSize.x, - ProgressbarSize.y * screenAspectRatio - ); - - if (_showProgressbar) { - const float progress = _nItems != 0 ? - static_cast(_iProgress) / static_cast(_nItems) : - 0.f; - - const float w = ProgressbarLineWidth / screenAspectRatio; - const float h = ProgressbarLineWidth; - rendering::helper::renderBox( - glm::vec2(1.f) - ((ProgressbarCenter + glm::vec2(1.f)) / 2.f), - progressbarSize + glm::vec2(2 * w, 2 * h), - ProgressbarOutlineColor, - rendering::helper::Anchor::Center - ); - - rendering::helper::renderBox( - glm::vec2(1.f) - ((ProgressbarCenter + glm::vec2(1.f)) / 2.f), - progressbarSize, - glm::vec4(0.f, 0.f, 0.f, 1.f), - rendering::helper::Anchor::Center - ); - - glm::vec4 color = glm::vec4(0.f); - switch (_phase) { - case Phase::PreStart: - break; - case Phase::Construction: - color = PhaseColorConstruction; - break; - case Phase::Synchronization: - color = PhaseColorSynchronization; - break; - case Phase::Initialization: - color = PhaseColorInitialization; - break; - } - - glm::vec2 p = glm::vec2(1.f) - ((ProgressbarCenter + glm::vec2(1.f)) / 2.f); - rendering::helper::renderBox( - p - progressbarSize / 2.f, - progressbarSize * glm::vec2(progress, 1.f), - color, - rendering::helper::Anchor::NW - ); - } - // // "Loading" text // @@ -295,6 +259,21 @@ void LoadingScreen::render() { renderer.render(*_messageFont, messageLl, _message); } + glm::vec2 logLl = glm::vec2(0.f, 0.f); + glm::vec2 logUr = glm::vec2(res.x, res.y * (LogBackgroundPosition + 0.015)); + + // Font rendering enables depth testing so we disable again to render the log box + glDisable(GL_DEPTH_TEST); + if (_showLog) { + constexpr glm::vec4 DarkGray = glm::vec4(glm::vec3(0.04f), 1.f); + rendering::helper::renderBox( + glm::vec2(0.f, 1.f), + glm::vec2(1.f, LogBackgroundPosition), + DarkGray, + rendering::helper::Anchor::SW + ); + } + if (_showNodeNames) { std::lock_guard guard(_itemsMutex); @@ -303,15 +282,6 @@ void LoadingScreen::render() { const glm::vec2 logoLl = glm::vec2(LogoCenter.x - size.x, LogoCenter.y - size.y); const glm::vec2 logoUr = glm::vec2(LogoCenter.x + size.x, LogoCenter.y + size.y); - const glm::vec2 progressbarLl = glm::vec2( - ProgressbarCenter.x - progressbarSize.x, - ProgressbarCenter.y - progressbarSize.y - ); - const glm::vec2 progressbarUr = glm::vec2( - ProgressbarCenter.x + progressbarSize.x , - ProgressbarCenter.y + progressbarSize.y - ); - for (Item& item : _items) { if (!item.hasLocation) { // Compute a new location @@ -351,16 +321,12 @@ void LoadingScreen::render() { rectOverlaps(messageLl, messageUr, ll, ur) : false; - const bool barOverlap = _showProgressbar ? - rectOverlaps( - ndcToScreen(progressbarLl, res), - ndcToScreen(progressbarUr, res), - ll, - ur - ) : - false; + const bool logOverlap = rectOverlaps( + logLl, logUr, + ll, ur + ); - if (logoOverlap || loadingOverlap || messageOverlap || barOverlap) { + if (logoOverlap || loadingOverlap || messageOverlap || logOverlap) { // We never want to have an overlap with these, so this try didn't // count against the maximum, thus ensuring that (if there has to // be an overlap, it's over other text that might disappear before @@ -462,7 +428,7 @@ void LoadingScreen::render() { _items.end(), [now](const Item& i) { if (i.status == ItemStatus::Finished) { - return i.finishedTime > now + TTL; + return (i.finishedTime + TTL) < now; } else { return false; @@ -474,6 +440,11 @@ void LoadingScreen::render() { } + // Render log messages last to make them slightly more visible if a download item + // is slightly overlapping + if (_showLog) { + renderLogMessages(); + } glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); @@ -482,6 +453,82 @@ void LoadingScreen::render() { FrameMarkEnd("Loading"); } +void LoadingScreen::renderLogMessages() const { + ZoneScoped; + + constexpr size_t MaxNumberMessages = 6; + constexpr int MessageLength = 209; + + using FR = ghoul::fontrendering::FontRenderer; + const FR& renderer = FR::defaultRenderer(); + + const std::vector& entries = _log->entries(); + + size_t nRows = 0; + size_t j = std::min(MaxNumberMessages, entries.size()); + for (size_t i = 1; i <= j; i++) { + ZoneScopedN("Entry"); + + // Show only the j:th first log entries + const ScreenLog::LogEntry& it = entries[j - i]; + + std::ostringstream result; + // Split really long messages into multiple lines for better readability + if (it.message.size() > MessageLength) { + std::istringstream is(it.message); + + int charactersSinceNewLine = 0; + std::string word; + while (is >> word) { + charactersSinceNewLine += static_cast(word.size()); + // Insert a new line when we exceede messageLength + if (charactersSinceNewLine > MessageLength) { + result << '\n'; + charactersSinceNewLine = static_cast(word.size()); + ++nRows; + } + result << word << ' '; + ++charactersSinceNewLine; + } + } + + renderer.render( + *_logFont, + glm::vec2( + 10, + 10 + _logFont->pointSize() * nRows * 2 + ), + it.message.size() < MessageLength ? it.message : result.str(), + ghoul::toColor(it.level) + ); + ++nRows; + } + + const glm::vec2 dpiScaling = global::windowDelegate->dpiScaling(); + const glm::ivec2 res = + glm::vec2(global::windowDelegate->firstWindowResolution()) * dpiScaling; + + // Render # of warnings and error messages + std::map numberOfErrorsPerLevel; + for (auto& entry : _log->entries()) { + numberOfErrorsPerLevel[entry.level]++; + } + size_t row = 0; + for (auto& [level, amount] : numberOfErrorsPerLevel) { + const std::string text = fmt::format("{}: {}", ghoul::to_string(level), amount); + renderer.render( + *_logFont, + glm::vec2( + res.x - 0.07 * res.x, + 10 + _logFont->pointSize() * row * 2 + ), + text, + ghoul::toColor(level) + ); + ++row; + } +} + void LoadingScreen::postMessage(std::string message) { std::lock_guard guard(_messageMutex); _message = std::move(message); @@ -502,26 +549,13 @@ void LoadingScreen::finalize() { ), _items.end() ); - + _log->removeExpiredEntries(); + _showLog = _showLog && !_log->entries().empty(); render(); } - -void LoadingScreen::setItemNumber(int nItems) { - _nItems = nItems; -} - -int LoadingScreen::itemNumber() { - return _nItems; -} - -void LoadingScreen::tickItem() { - ++_iProgress; -} - void LoadingScreen::setPhase(Phase phase) { _phase = phase; - _iProgress = 0; } void LoadingScreen::updateItem(const std::string& itemIdentifier, @@ -555,7 +589,7 @@ void LoadingScreen::updateItem(const std::string& itemIdentifier, Item item = { .identifier = itemIdentifier, .name = itemName, - .status = ItemStatus::Started, + .status = newStatus, .progress = std::move(progressInfo), .hasLocation = false, .finishedTime = std::chrono::system_clock::from_time_t(0) diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index ec526678e3..a7d50bb032 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -1395,20 +1395,8 @@ void RenderEngine::renderScreenLog() { } { - const glm::vec4 color = [alpha, white](ScreenLog::LogLevel level) { - switch (level) { - case ghoul::logging::LogLevel::Debug: - return glm::vec4(0.f, 1.f, 0.f, alpha); - case ghoul::logging::LogLevel::Warning: - return glm::vec4(1.f, 1.f, 0.f, alpha); - case ghoul::logging::LogLevel::Error: - return glm::vec4(1.f, 0.f, 0.f, alpha); - case ghoul::logging::LogLevel::Fatal: - return glm::vec4(0.3f, 0.3f, 0.85f, alpha); - default: - return white; - } - }(it.level); + glm::vec4 color = ghoul::toColor(it.level); + color.a = alpha; const std::string_view lvl = ghoul::to_string(it.level); std::fill(buf.begin(), buf.end(), char(0)); diff --git a/src/scene/sceneinitializer.cpp b/src/scene/sceneinitializer.cpp index 6728338be7..7353a020fb 100644 --- a/src/scene/sceneinitializer.cpp +++ b/src/scene/sceneinitializer.cpp @@ -90,7 +90,6 @@ void MultiThreadedSceneInitializer::initializeNode(SceneGraphNode* node) { LoadingScreen* loadingScreen = global::openSpaceEngine->loadingScreen(); if (loadingScreen) { - loadingScreen->setItemNumber(loadingScreen->itemNumber() + 1); loadingScreen->updateItem( node->identifier(), node->guiName(), From f3c4fc54dbce0a848b3fa445058eb10b51e78fee Mon Sep 17 00:00:00 2001 From: Andreas Engberg <48772850+engbergandreas@users.noreply.github.com> Date: Tue, 14 Nov 2023 17:08:38 +0100 Subject: [PATCH 170/701] Update UrlSynchronization to limit amount of downloads (#2586) (#2933) Limits the number of URL synchronization downloads by time stamping files for X seconds fixes (#2586). Also, show the amount of downloaded data as soon as the download is started fix (#2460) * Adds time validity to UrlSynchronized files (#2586) Updated affected asset files. Satellite asset files lasts for 24h by default now. Other assets are updated to work as before. Obs timestamp is computed using UTC time. * Code cleanup * Update httpsynchronization.cpp * Applied suggestions from code review * Update multi-line comment to `//` * Remove accidental commas in .asset files Co-authored-by: Emma Broman * Fixed PR comments + bug in .asset file * Refactor code * Reports downloaded data as early as possible, fixes (#2460) * More files --------- Co-authored-by: Alexander Bock Co-authored-by: Emma Broman --- .../educational/scale/burj_khalifa.asset | 3 +- data/assets/examples/urlsynchronization.asset | 30 +- data/assets/global/openspacebookmarks.asset | 2 +- .../satellites/communications/amateur.asset | 2 +- .../communications/experimental.asset | 2 +- .../communications/geostationary.asset | 2 +- .../communications/globalstar.asset | 2 +- .../satellites/communications/gorizont.asset | 2 +- .../satellites/communications/intelsat.asset | 2 +- .../satellites/communications/iridium.asset | 2 +- .../communications/iridium_next.asset | 2 +- .../satellites/communications/molniya.asset | 2 +- .../satellites/communications/orbcomm.asset | 2 +- .../communications/other_comm.asset | 2 +- .../satellites/communications/raduga.asset | 2 +- .../earth/satellites/communications/ses.asset | 2 +- .../satellites/communications/starlink.asset | 2 +- .../earth/satellites/debris/debris_asat.asset | 2 +- .../satellites/debris/debris_breezem.asset | 2 +- .../satellites/debris/debris_fengyun.asset | 2 +- .../satellites/debris/debris_iridium33.asset | 2 +- .../satellites/debris/debris_kosmos2251.asset | 2 +- .../earth/satellites/misc/active.asset | 2 +- .../earth/satellites/misc/brightest.asset | 2 +- .../earth/satellites/misc/cubesats.asset | 2 +- .../earth/satellites/misc/hubble_trail.asset | 2 +- .../planets/earth/satellites/misc/iss.asset | 2 +- .../earth/satellites/misc/military.asset | 2 +- .../planets/earth/satellites/misc/other.asset | 2 +- .../planets/earth/satellites/misc/radar.asset | 2 +- .../earth/satellites/misc/spacestations.asset | 2 +- .../earth/satellites/misc/tle-new.asset | 2 +- .../earth/satellites/navigation/beidou.asset | 2 +- .../earth/satellites/navigation/galileo.asset | 2 +- .../satellites/navigation/glosnass.asset | 2 +- .../earth/satellites/navigation/gps.asset | 2 +- .../earth/satellites/navigation/musson.asset | 2 +- .../earth/satellites/navigation/nnss.asset | 2 +- .../earth/satellites/navigation/sbas.asset | 2 +- .../earth/satellites/science/education.asset | 2 +- .../satellites/science/engineering.asset | 2 +- .../earth/satellites/science/geodetic.asset | 2 +- .../earth/satellites/science/spaceearth.asset | 2 +- .../earth/satellites/weather/aqua.asset | 2 +- .../earth/satellites/weather/argos.asset | 2 +- .../earth/satellites/weather/dmc.asset | 2 +- .../satellites/weather/earth_resources.asset | 2 +- .../earth/satellites/weather/goes.asset | 2 +- .../earth/satellites/weather/noaa.asset | 2 +- .../earth/satellites/weather/planet.asset | 2 +- .../earth/satellites/weather/sarsat.asset | 2 +- .../earth/satellites/weather/snpp.asset | 2 +- .../earth/satellites/weather/spire.asset | 2 +- .../earth/satellites/weather/tdrss.asset | 2 +- .../earth/satellites/weather/terra.asset | 2 +- .../earth/satellites/weather/weather.asset | 2 +- data/assets/spice/base.asset | 10 - include/openspace/util/spicemanager.h | 3 + modules/sync/syncs/httpsynchronization.cpp | 10 +- modules/sync/syncs/urlsynchronization.cpp | 344 ++++++++++++------ modules/sync/syncs/urlsynchronization.h | 17 + src/engine/openspaceengine.cpp | 2 +- src/rendering/loadingscreen.cpp | 15 +- src/util/spicemanager.cpp | 167 +++++++++ 64 files changed, 526 insertions(+), 183 deletions(-) diff --git a/data/assets/educational/scale/burj_khalifa.asset b/data/assets/educational/scale/burj_khalifa.asset index ff46cd6976..5215a971d7 100644 --- a/data/assets/educational/scale/burj_khalifa.asset +++ b/data/assets/educational/scale/burj_khalifa.asset @@ -8,8 +8,7 @@ local modelFolder = asset.resource({ Type = "UrlSynchronization", Identifier = "scale_model_burj_khalifa", Url = "https://wms.openspace.amnh.org/static/sync/url/scalemodels/Burj_Khalifa.osmodel", - Filename = "Burj_Khalifa.osmodel", - Override = false + Filename = "Burj_Khalifa.osmodel" }) diff --git a/data/assets/examples/urlsynchronization.asset b/data/assets/examples/urlsynchronization.asset index e45895f791..98bf9554dd 100644 --- a/data/assets/examples/urlsynchronization.asset +++ b/data/assets/examples/urlsynchronization.asset @@ -19,8 +19,32 @@ asset.resource({ Name = "Example Large", Type = "UrlSynchronization", Identifier = "example_large", - Url = "http://ipv4.download.thinkbroadband.com/100MB.zip", - Override = true + Url = { + "http://speedtest.tele2.net/1000GB.zip", + "https://speedtest.tele2.net/100GB.zip", + "https://speedtest.tele2.net/50GB.zip", + "http://speedtest.tele2.net/10GB.zip", + "http://speedtest.tele2.net/1GB.zip", + "http://speedtest.tele2.net/100MB.zip", + + "https://proof.ovh.net/files/10Gb.dat", + "https://proof.ovh.net/files/1Gb.dat", + "https://proof.ovh.net/files/100Mb.dat", + + "https://speed.hetzner.de/10GB.bin", + "https://speed.hetzner.de/1GB.bin", + "https://speed.hetzner.de/100MB.bin", + + "http://ipv4.download.thinkbroadband.com/1GB.zip", + "http://ipv4.download.thinkbroadband.com/512MB.zip", + "http://ipv4.download.thinkbroadband.com/200MB.zip", + "http://ipv4.download.thinkbroadband.com/100MB.zip", + "http://ipv4.download.thinkbroadband.com/50MB.zip", + "http://ipv4.download.thinkbroadband.com/20MB.zip", + "http://ipv4.download.thinkbroadband.com/10MB.zip", + "http://ipv4.download.thinkbroadband.com/5MB.zip", + }, + SecondsUntilResync = 0 }) asset.resource({ @@ -28,7 +52,7 @@ asset.resource({ Type = "UrlSynchronization", Identifier = "example_medium", Url = "http://ipv4.download.thinkbroadband.com/5MB.zip", - Override = true + SecondsUntilResync = 0 }) -- Load a resource without hashing, meaning that the bare directory name will be diff --git a/data/assets/global/openspacebookmarks.asset b/data/assets/global/openspacebookmarks.asset index d8770c2e20..bf554226c1 100644 --- a/data/assets/global/openspacebookmarks.asset +++ b/data/assets/global/openspacebookmarks.asset @@ -7,7 +7,7 @@ local bookmarksCSV = asset.resource({ Name = "OpenSpace Bookmarks", Type = "UrlSynchronization", UseHash = false, - Override = true, + SecondsUntilResync = 0 Url = dataProvider }) 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 4e4f755a3f..ee6c80271d 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/amateur.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/amateur.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_amateur_radio", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=amateur&FORMAT=kvn", Filename = "amateur.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 654c64564a..7541fbbca9 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/experimental.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/experimental.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_x-comm", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=x-comm&FORMAT=kvn", Filename = "x-comm.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 b6668e7ef2..0d4097fecf 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/geostationary.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/geostationary.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_geo", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=geo&FORMAT=kvn", Filename = "geo.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 e3d54ba07c..2203bd564c 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/globalstar.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/globalstar.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_globalstar", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=globalstar&FORMAT=kvn", Filename = "globalstar.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 0ab12c2d39..13811ce9d8 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/gorizont.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/gorizont.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_gorizont", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=gorizont&FORMAT=kvn", Filename = "gorizont.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 b54b81e4f4..7198b46408 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/intelsat.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/intelsat.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_intelsat", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=intelsat&FORMAT=kvn", Filename = "intelsat.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 c5a623371a..132919987f 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/iridium.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/iridium.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_iridium", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=iridium&FORMAT=kvn", Filename = "iridium.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 b56bb45a39..5019ebd3e6 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 @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_iridium-NEXT", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=iridium-NEXT&FORMAT=kvn", Filename = "iridium-NEXT.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 5be8ee8886..31632e7ad5 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/molniya.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/molniya.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_molniya", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=molniya&FORMAT=kvn", Filename = "molniya.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 8f00be9cac..c1a759df97 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/orbcomm.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/orbcomm.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_orbcomm", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=orbcomm&FORMAT=kvn", Filename = "orbcomm.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 99e98cc528..5fda8ec905 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 @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_other-comm", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=other-comm&FORMAT=kvn", Filename = "other-comm.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 589e70850f..cecf990b27 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/raduga.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/raduga.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_raduga", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=raduga&FORMAT=kvn", Filename = "raduga.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 68ff8c2343..532977a477 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/ses.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/ses.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_ses", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=ses&FORMAT=kvn", Filename = "ses.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 d9ae0f3fa4..a0ad96956b 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/starlink.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/starlink.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_starlink", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=starlink&FORMAT=kvn", Filename = "starlink.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_asat.asset b/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_asat.asset index 197d0817b1..d220142513 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_asat.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_asat.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_2019-006", Url = "https://www.celestrak.com/NORAD/elements/gp.php?INTDES=2019-006&FORMAT=kvn", Filename = "2019-006.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 429d75054b..6820d20e93 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 @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_2012-044", Url = "https://www.celestrak.com/NORAD/elements/gp.php?INTDES=2012-044&FORMAT=kvn", Filename = "2012-044.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 6de5152b47..78ae414dfa 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 @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_1999-025", Url = "https://www.celestrak.com/NORAD/elements/gp.php?INTDES=1999-025&FORMAT=kvn", Filename = "1999-025.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 2745a39fbf..24176b22e9 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 @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_iridium-33-debris", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=iridium-33-debris&FORMAT=kvn", Filename = "iridium-33-debris.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 8681bf7bc7..d91337ce68 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 @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_cosmos-2251-debris", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=cosmos-2251-debris&FORMAT=kvn", Filename = "cosmos-2251-debris.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 d146a2a599..a01b2a68fb 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/active.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/active.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_active", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=active&FORMAT=kvn", Filename = "active.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 95870e8de3..a9fc480c3a 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/brightest.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/brightest.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_visual", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=visual&FORMAT=kvn", Filename = "visual.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 7f7a66fc55..e95fbb3df7 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/cubesats.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/cubesats.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_cubesat", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=cubesat&FORMAT=kvn", Filename = "cubesat.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 4166915558..bfe34c64f3 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 @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_hst", Url = "https://www.celestrak.com/NORAD/elements/gp.php?CATNR=20580&FORMAT=kvn", Filename = "hst.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 d8a069c31a..b95f913208 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset @@ -16,7 +16,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_iss", Url = "https://www.celestrak.com/NORAD/elements/gp.php?CATNR=25544&FORMAT=kvn", Filename = "ISS.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 ac741d8d11..cadb37ead3 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/military.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/military.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_military", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=military&FORMAT=kvn", Filename = "military.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 786a10b15f..ad63db30b2 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/other.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/other.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_other", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=other&FORMAT=kvn", Filename = "other.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 83143280f9..74b5cdcc6f 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/radar.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/radar.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_radar", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=radar&FORMAT=kvn", Filename = "radar.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 167d2b2cd9..c1c3286224 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/spacestations.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/spacestations.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_stations", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=stations&FORMAT=kvn", Filename = "stations.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 71336d51c1..d616a0de3e 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 @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_tle-new", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=last-30-days&FORMAT=kvn", Filename = "tle-new.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 94429c0294..f2b5412ba3 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/beidou.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/beidou.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_beidou", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=beidou&FORMAT=kvn", Filename = "beidou.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 36cc8d0572..8d81d92302 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/galileo.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/galileo.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_galileo", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=galileo&FORMAT=kvn", Filename = "galileo.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 3e29b0f1c9..fc6933875b 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/glosnass.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/glosnass.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_glo-ops", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=glo-ops&FORMAT=kvn", Filename = "glo-ops.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 0e1cf3c5c5..2d147c8e04 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/gps.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/gps.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_gps-ops", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=gps-ops&FORMAT=kvn", Filename = "gps-ops.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 89df6c73c3..35664b2186 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/musson.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/musson.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_musson", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=musson&FORMAT=kvn", Filename = "musson.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 a478d319c9..665d5a24cf 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/nnss.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/nnss.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_nnss", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=nnss&FORMAT=kvn", Filename = "nnss.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 181722c5c1..10d5dffa5c 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/sbas.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/sbas.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_sbas", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=sbas&FORMAT=kvn", Filename = "sbas.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 84d4d1ad16..f7e003db03 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/science/education.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/science/education.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_education", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=education&FORMAT=kvn", Filename = "education.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 1277fa0e99..3ba32d83f4 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/science/engineering.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/science/engineering.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_engineering", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=engineering&FORMAT=kvn", Filename = "engineering.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 6b5bc0468b..d9bb14f901 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/science/geodetic.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/science/geodetic.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_geodetic", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=geodetic&FORMAT=kvn", Filename = "geodetic.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 1f222f6c5a..a314217808 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/science/spaceearth.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/science/spaceearth.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_science", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=science&FORMAT=kvn", Filename = "science.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 abe707e3c8..38c187bc96 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/aqua.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/aqua.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_aqua", Url = "https://www.celestrak.com/NORAD/elements/gp.php?CATNR=27424&FORMAT=kvn", Filename = "Aqua.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 f4632ee3e3..071d3d616d 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/argos.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/argos.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_argos", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=argos&FORMAT=kvn", Filename = "argos.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 7ecdebfb9e..3c1fbd90c8 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/dmc.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/dmc.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_dmc", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=dmc&FORMAT=kvn", Filename = "dmc.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 6451aace49..835560ac3a 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 @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_resource", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=resource&FORMAT=kvn", Filename = "resource.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 fc24bdd839..42a26fad92 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/goes.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/goes.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_goes", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=goes&FORMAT=kvn", Filename = "goes.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 65b1a6cf81..4d8324c9a5 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/noaa.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/noaa.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_noaa", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=noaa&FORMAT=kvn", Filename = "noaa.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 b56b882db8..a8a9df324b 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/planet.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/planet.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_planet", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=planet&FORMAT=kvn", Filename = "planet.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 4b3b9dc29e..151c23c4dc 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/sarsat.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/sarsat.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_sarsat", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=sarsat&FORMAT=kvn", Filename = "sarsat.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 b1a4f7cd7b..89e19db0fd 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/snpp.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/snpp.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_snpp", Url = "https://www.celestrak.com/NORAD/elements/gp.php?CATNR=37849&FORMAT=kvn", Filename = "SNPP.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 ee3267a8e1..e991a56c90 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/spire.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/spire.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_spire", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=spire&FORMAT=kvn", Filename = "spire.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 c8cfc79075..71da56bcda 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/tdrss.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/tdrss.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_tdrss", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=tdrss&FORMAT=kvn", Filename = "tdrss.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 b4d4791ab1..d8a3693079 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/terra.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/terra.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_terra", Url = "https://www.celestrak.com/NORAD/elements/gp.php?CATNR=25994&FORMAT=kvn", Filename = "Terra.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) 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 3993910bfa..23ff2d1e37 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/weather.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/weather.asset @@ -8,7 +8,7 @@ local omm = asset.resource({ Identifier = "satellite_omm_data_weather", Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=weather&FORMAT=kvn", Filename = "weather.txt", - Override = true + SecondsUntilResync = 24 * 60 * 60 }) diff --git a/data/assets/spice/base.asset b/data/assets/spice/base.asset index 24408b5898..7f651af46f 100644 --- a/data/assets/spice/base.asset +++ b/data/assets/spice/base.asset @@ -1,10 +1,3 @@ -local lsk = asset.resource({ - Name = "General LSK Kernels", - Type = "HttpSynchronization", - Identifier = "general_lsk", - Version = 1 -}) - local pck = asset.resource({ Name = "General PCK Kernels", Type = "HttpSynchronization", @@ -21,14 +14,12 @@ local spk = asset.resource({ local kernels = { - lsk .. "naif0012.tls", pck .. "pck00011.tpc", spk .. "de430.bsp" } asset.onInitialize(function() - openspace.spice.loadKernel(lsk .. "naif0012.tls") openspace.spice.loadKernel(pck .. "pck00011.tpc") openspace.spice.loadKernel(spk .. "de430.bsp") end) @@ -36,7 +27,6 @@ end) asset.onDeinitialize(function() openspace.spice.unloadKernel(spk .. "de430.bsp") openspace.spice.unloadKernel(pck .. "pck00011.tpc") - openspace.spice.unloadKernel(lsk .. "naif0012.tls") end) diff --git a/include/openspace/util/spicemanager.h b/include/openspace/util/spicemanager.h index 17bacf348d..eec285c09f 100644 --- a/include/openspace/util/spicemanager.h +++ b/include/openspace/util/spicemanager.h @@ -1085,6 +1085,9 @@ private: glm::dmat3 getEstimatedTransformMatrix(const std::string& fromFrame, const std::string& toFrame, double time) const; + /// Loads pre defined leap seconds time kernel (naif00012.tls). + void loadLeapSecondsSpiceKernel(); + /// A list of all loaded kernels std::vector _loadedKernels; diff --git a/modules/sync/syncs/httpsynchronization.cpp b/modules/sync/syncs/httpsynchronization.cpp index 199e78c7f9..7b71f7dea3 100644 --- a/modules/sync/syncs/httpsynchronization.cpp +++ b/modules/sync/syncs/httpsynchronization.cpp @@ -206,12 +206,10 @@ bool HttpSynchronization::isEachFileDownloaded() { // Otherwise first line is the version number. std::string ossyncVersion = line; - /* - Format of 1.0 ossync: - Version number: E.g., 1.0 - Synchronization status: Synchronized or Partial Synchronized - Optionally list of already synched files - */ + //Format of 1.0 ossync: + //Version number: E.g., 1.0 + //Synchronization status: Synchronized or Partial Synchronized + //Optionally list of already synched files if (ossyncVersion == OssyncVersionNumber) { std::getline(file >> std::ws, line); // Read synchronization status diff --git a/modules/sync/syncs/urlsynchronization.cpp b/modules/sync/syncs/urlsynchronization.cpp index 855b814504..ca0fda73f5 100644 --- a/modules/sync/syncs/urlsynchronization.cpp +++ b/modules/sync/syncs/urlsynchronization.cpp @@ -27,6 +27,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -35,6 +38,10 @@ #include namespace { + constexpr std::string_view _loggerCat = "UrlSynchronization"; + constexpr std::string_view OssyncVersionNumber = "1.0"; + constexpr std::string_view SynchronizationToken = "Synchronized"; + struct [[codegen::Dictionary(UrlSynchronization)]] Parameters { // The URL or urls from where the files are downloaded. If multiple URLs are // provided, all files will be downloaded to the same directory and the filename @@ -45,10 +52,7 @@ namespace { // manually find the downloaded folder in the synchronization folder std::string identifier [[codegen::identifier()]]; - // If this value is set to 'true' and it is not overwritten by the global - // settings, the file(s) pointed to by this URLSynchronization will always be - // downloaded, thus overwriting the local files. This is useful for files that are - // updated regularly remotely and should be fetch at every startup + // Deprecated, use SecondsUntilResync instead std::optional forceOverride [[codegen::key("Override")]]; // If this value is set to 'true' (the default), the hash of the URL is appended @@ -62,6 +66,11 @@ namespace { // automatically created from the url. If this value is specified, the url // parameter only only contain exactly one URL std::optional filename; + + // This variable determines the validity period of a file(s) in seconds before it + // needs to be re-downloaded. The default value keeps the file permanently cached, + // while a value of 0 forces the file to be downloaded on every startup. + std::optional secondsUntilResync [[codegen::greaterequal(0.0)]]; }; #include "urlsynchronization_codegen.cpp" } // namespace @@ -99,6 +108,14 @@ UrlSynchronization::UrlSynchronization(const ghoul::Dictionary& dictionary, _filename = p.filename.value_or(_filename); _forceOverride = p.forceOverride.value_or(_forceOverride); + // (anden88 2023-11-03) TODO: When we decide to remove override variable this should + // be cleaned up. + // Mimic behavior of time to live if override is specified (true => force download, + // false keeps the file permanently (default behavior)). + _secondsUntilResync = _forceOverride ? 0 : MaxDateAsJ2000; + // Disregard override variable if user specified a specific time to live. + _secondsUntilResync = p.secondsUntilResync.value_or(_secondsUntilResync); + const bool useHash = p.useHash.value_or(true); _identifier = p.identifier; @@ -113,6 +130,14 @@ UrlSynchronization::UrlSynchronization(const ghoul::Dictionary& dictionary, ); _identifier += fmt::format("({})", hash); } + + if (p.forceOverride.has_value()) { + LWARNING(fmt::format( + "{}: The variable ForceOverride has been deprecated." + "Optionally, use SecondsUntilResync instead to specify file validity date.", + p.identifier + )); + } } UrlSynchronization::~UrlSynchronization() { @@ -132,115 +157,25 @@ void UrlSynchronization::start() { } _state = State::Syncing; - if (hasSyncFile() && !_forceOverride) { + if (isEachFileValid()) { _state = State::Resolved; return; } + if (isRejected()) { + return; + } + _syncThread = std::thread([this]() { - std::unordered_map fileSizes; - std::mutex fileSizeMutex; - size_t nDownloads = 0; - std::atomic_bool startedAllDownloads = false; - std::vector> downloads; + const bool success = trySyncUrls(); - for (const std::string& url : _urls) { - if (_filename.empty() || _urls.size() > 1) { - std::filesystem::path fn = std::filesystem::path(url).filename(); - if (fn.empty() && url.back() == '/') { - // If the user provided a path that ends in / the `filename` will - // result in an empty path with causes the downloading to fail - fn = std::filesystem::path(url).parent_path().filename(); - } - std::string name = fn.string(); - - // We can not create filenames with question marks - name.erase(std::remove(name.begin(), name.end(), '?'), name.end()); - _filename = name; - } - std::filesystem::path destination = directory() / (_filename + ".tmp"); - - auto download = std::make_unique( - url, - destination, - HttpFileDownload::Overwrite::Yes - ); - HttpFileDownload* dl = download.get(); - - downloads.push_back(std::move(download)); - - ++nDownloads; - - dl->onProgress( - [this, url, &fileSizes, &fileSizeMutex, - &startedAllDownloads, &nDownloads](int64_t, - std::optional totalBytes) - { - if (!totalBytes.has_value()) { - return !_shouldCancel; - } - - std::lock_guard guard(fileSizeMutex); - fileSizes[url] = *totalBytes; - - if (!_nTotalBytesKnown && startedAllDownloads && - fileSizes.size() == nDownloads) - { - _nTotalBytesKnown = true; - _nTotalBytes = 0; - for (const std::pair& fs : fileSizes) { - _nTotalBytes += fs.second; - } - } - return !_shouldCancel; - }); - - dl->start(); - } - - startedAllDownloads = true; - - bool failed = false; - for (const std::unique_ptr& d : downloads) { - d->wait(); - if (!d->hasSucceeded()) { - failed = true; - continue; - } - - // If we are forcing the override, we download to a temporary file first, so - // when we are done here, we need to rename the file to the original name - - std::filesystem::path tempName = d->destination(); - std::filesystem::path originalName = tempName; - // Remove the .tmp extension - originalName.replace_extension(""); - - if (std::filesystem::is_regular_file(originalName)) { - std::filesystem::remove(originalName); - } - - std::error_code ec; - std::filesystem::rename(tempName, originalName, ec); - if (ec) { - LERRORC( - "URLSynchronization", - fmt::format("Error renaming file {} to {}", tempName, originalName) - ); - - failed = true; - } - } - - if (!failed) { + if (success) { createSyncFile(); + _state = State::Resolved; } else { - for (const std::unique_ptr& d : downloads) { - d->cancel(); - } + _state = State::Rejected; } - _state = State::Resolved; }); } @@ -253,4 +188,207 @@ std::string UrlSynchronization::generateUid() { return _identifier; } +bool UrlSynchronization::isEachFileValid() { + std::filesystem::path path = directory(); + path.replace_extension("ossync"); + // Check if file exists at all + if (!std::filesystem::is_regular_file(path)) { + return false; + } + + std::ifstream file(path); + std::string line; + + file >> line; + // Update ossync files that does not have a version number to new format + if (line == SynchronizationToken) { + if (_secondsUntilResync == 0) { + return false; // Force download new file + } + + // We must close file early because createSyncFile writes to it + file.close(); + createSyncFile(); + // File is valid until some date + return true; + } + // Otherwise first line is the version number. + std::string ossyncVersion = line; + + // Format of 1.0 ossync: + // Version number: e.g., 1.0 + // Date that specifies how long the files are valid for in ISO8601 format + // Valid to: yyyy-mm-ddThr:mn:sc.xxx + + if (ossyncVersion == "1.0") { + std::getline(file >> std::ws, line); + std::string& fileIsValidToDate = line; + double fileValidAsJ2000 = Time::convertTime(fileIsValidToDate); + + std::string todaysDate = Time::currentWallTime(); + double todaysDateAsJ2000 = Time::convertTime(todaysDate); + + // Issue warning if file is kept but user changed setting to download on startup. + if ((fileValidAsJ2000 > todaysDateAsJ2000) && _secondsUntilResync == 0) { + LWARNING(fmt::format( + "{}: File is valid to {} but asset specifies SecondsUntilResync = {} " + "Did you mean to re-download the file? If so, remove file from sync " + "folder to resync", + _identifier, + fileIsValidToDate, + _secondsUntilResync + )); + } + + // Returns true if date in ossync file is 'larger' than todays date, + // i.e. no sync needed. + return fileValidAsJ2000 > todaysDateAsJ2000; + } + else { + LERROR(fmt::format( + "{}: Unknown ossync version number read. Got {} while {} and below are valid", + _identifier, ossyncVersion, OssyncVersionNumber + )); + _state = State::Rejected; + } + + return false; +} + +void UrlSynchronization::createSyncFile(bool) const { + std::filesystem::path dir = directory(); + std::filesystem::create_directories(dir); + + dir.replace_extension("ossync"); + std::ofstream syncFile(dir, std::ofstream::out); + + std::string currentTimeAsISO8601 = Time::currentWallTime(); + double currentTimeAsJ2000 = Time::convertTime(currentTimeAsISO8601); + + // With the format YYYY-MM... any year thats larger than 4 digits throws an error + // Limit the future date to year 9999 + double futureTimeAsJ2000 = std::min( + currentTimeAsJ2000 + _secondsUntilResync, + MaxDateAsJ2000 + ); + + std::string fileIsValidTo = SpiceManager::ref().dateFromEphemerisTime( + futureTimeAsJ2000, + "YYYY-MM-DDTHR:MN:SC.###" + ); + + const std::string msg = fmt::format("{}\n{}\n", OssyncVersionNumber, fileIsValidTo); + syncFile << msg; +} + +bool UrlSynchronization::trySyncUrls() { + struct SizeData { + int64_t downloadedBytes = 0; + std::optional totalBytes; + }; + + std::unordered_map sizeData; + std::mutex fileSizeMutex; + size_t nDownloads = 0; + std::atomic_bool startedAllDownloads = false; + std::vector> downloads; + + for (const std::string& url : _urls) { + if (_filename.empty() || _urls.size() > 1) { + std::filesystem::path fn = std::filesystem::path(url).filename(); + if (fn.empty() && url.back() == '/') { + // If the user provided a path that ends in / the `filename` will + // result in an empty path with causes the downloading to fail + fn = std::filesystem::path(url).parent_path().filename(); + } + std::string name = fn.string(); + + // We can not create filenames with question marks + name.erase(std::remove(name.begin(), name.end(), '?'), name.end()); + _filename = name; + } + std::filesystem::path destination = directory() / (_filename + ".tmp"); + + if (sizeData.find(url) != sizeData.end()) { + LWARNING(fmt::format("{}: Duplicate entry for {}", _identifier, url)); + continue; + } + + auto download = std::make_unique( + url, + destination, + HttpFileDownload::Overwrite::Yes + ); + HttpFileDownload* dl = download.get(); + + downloads.push_back(std::move(download)); + + ++nDownloads; + sizeData[url] = SizeData(); + + dl->onProgress( + [this, url, &sizeData, &fileSizeMutex](int64_t downloadedBytes, + std::optional totalBytes) + { + if (!totalBytes.has_value()) { + return !_shouldCancel; + } + + std::lock_guard guard(fileSizeMutex); + sizeData[url] = { downloadedBytes, totalBytes }; + + _nTotalBytesKnown = true; + _nTotalBytes = 0; + _nSynchronizedBytes = 0; + for (const std::pair& sd : sizeData) { + _nTotalBytesKnown = _nTotalBytesKnown && + sd.second.totalBytes.has_value(); + _nTotalBytes += sd.second.totalBytes.value_or(0); + _nSynchronizedBytes += sd.second.downloadedBytes; + } + + return !_shouldCancel; + }); + + dl->start(); + } + + startedAllDownloads = true; + + bool failed = false; + for (const std::unique_ptr& d : downloads) { + d->wait(); + if (!d->hasSucceeded()) { + failed = true; + LERROR(fmt::format("Error downloading file from URL {}", d->url())); + continue; + } + + // If we are forcing the override, we download to a temporary file first, so + // when we are done here, we need to rename the file to the original name + + std::filesystem::path tempName = d->destination(); + std::filesystem::path originalName = tempName; + // Remove the .tmp extension + originalName.replace_extension(""); + + if (std::filesystem::is_regular_file(originalName)) { + std::filesystem::remove(originalName); + } + + std::error_code ec; + std::filesystem::rename(tempName, originalName, ec); + if (ec) { + LERRORC( + "URLSynchronization", + fmt::format("Error renaming file {} to {}", tempName, originalName) + ); + + failed = true; + } + } + + return !failed; +} + } // namespace openspace diff --git a/modules/sync/syncs/urlsynchronization.h b/modules/sync/syncs/urlsynchronization.h index 0b0f85463c..0545d2c6a1 100644 --- a/modules/sync/syncs/urlsynchronization.h +++ b/modules/sync/syncs/urlsynchronization.h @@ -77,7 +77,21 @@ public: static documentation::Documentation Documentation(); +protected: + /// Read the `ossync` file and check if the downloaded files can be used. Returns + /// `true` if they are valid and `false` if we should download them again + bool isEachFileValid(); + private: + static constexpr double MaxDateAsJ2000 = 252424036869.18289; + + /// Creates a file next to the directory that indicates that this + /// ResourceSynchronization has successfully synchronized its contents + void createSyncFile(bool isFullySynchronized = true) const override; + + /// Tries to get a reply from the asset URLs and returns that success to the caller + bool trySyncUrls(); + /// The list of URLs that will be downloaded std::vector _urls; @@ -93,6 +107,9 @@ private: // The thread that will be doing the synchronization std::thread _syncThread; + + /// Determines how long the file is valid before it should be downloaded again + double _secondsUntilResync = MaxDateAsJ2000; }; } // namespace openspace diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index 0d79e58b38..84cf70c4d3 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -780,8 +780,8 @@ void OpenSpaceEngine::loadAssets() { static_cast(sync->nTotalBytes()); }(*it); + progressInfo.currentSize = (*it)->nSynchronizedBytes(); if ((*it)->nTotalBytesIsKnown()) { - progressInfo.currentSize = (*it)->nSynchronizedBytes(); progressInfo.totalSize = (*it)->nTotalBytes(); } diff --git a/src/rendering/loadingscreen.cpp b/src/rendering/loadingscreen.cpp index a50aed0e92..c01e39e9cd 100644 --- a/src/rendering/loadingscreen.cpp +++ b/src/rendering/loadingscreen.cpp @@ -392,12 +392,12 @@ void LoadingScreen::render() { #endif // LOADINGSCREEN_DEBUGGING std::string text = item.name; - if (item.status == ItemStatus::Started && item.progress.progress > 0) { + if (item.status == ItemStatus::Started && item.progress.currentSize > 0) { ProgressInfo& info = item.progress; - bool hasSecondLine = (info.totalSize != -1 && info.currentSize != -1); + const bool isTotalSizeKnown = info.totalSize != -1; int p = static_cast(std::round(info.progress * 100)); - if (hasSecondLine) { + if (isTotalSizeKnown) { if (info.totalSize < 1024 * 1024) { // 1MB text = fmt::format( "{} ({}%)\n{}/{} {}", @@ -415,7 +415,14 @@ void LoadingScreen::render() { } } else { - text = fmt::format("{} ({}%)", text, p); + // We don't know the total size but we have started downloading data + if (info.currentSize < 1024 * 1024) { + text = fmt::format("{}\n{} {}", text, info.currentSize, "bytes"); + } + else { + float curr = info.currentSize / (1024.f * 1024.f); + text = fmt::format("{}\n{:.3f} {}", text, curr, "MB"); + } } } diff --git a/src/util/spicemanager.cpp b/src/util/spicemanager.cpp index 23fc6c29be..01cd152654 100644 --- a/src/util/spicemanager.cpp +++ b/src/util/spicemanager.cpp @@ -154,6 +154,8 @@ SpiceManager::SpiceManager() { erract_c("SET", 0, const_cast("REPORT")); // But we do not want SPICE to print the errors, we will fetch them ourselves errprt_c("SET", 0, const_cast("NONE")); + + loadLeapSecondsSpiceKernel(); } SpiceManager::~SpiceManager() { @@ -1349,6 +1351,171 @@ glm::dmat3 SpiceManager::getEstimatedTransformMatrix(const std::string& fromFram return result; } +void SpiceManager::loadLeapSecondsSpiceKernel() { + constexpr std::string_view Naif00012tlsSource = R"( +KPL/LSK + + +LEAPSECONDS KERNEL FILE +=========================================================================== + +Modifications: +-------------- + +2016, Jul. 14 NJB Modified file to account for the leapsecond that + will occur on December 31, 2016. + +2015, Jan. 5 NJB Modified file to account for the leapsecond that + will occur on June 30, 2015. + +2012, Jan. 5 NJB Modified file to account for the leapsecond that + will occur on June 30, 2012. + +2008, Jul. 7 NJB Modified file to account for the leapsecond that + will occur on December 31, 2008. + +2005, Aug. 3 NJB Modified file to account for the leapsecond that + will occur on December 31, 2005. + +1998, Jul 17 WLT Modified file to account for the leapsecond that + will occur on December 31, 1998. + +1997, Feb 22 WLT Modified file to account for the leapsecond that + will occur on June 30, 1997. + +1995, Dec 14 KSZ Corrected date of last leapsecond from 1-1-95 + to 1-1-96. + +1995, Oct 25 WLT Modified file to account for the leapsecond that + will occur on Dec 31, 1995. + +1994, Jun 16 WLT Modified file to account for the leapsecond on + June 30, 1994. + +1993, Feb. 22 CHA Modified file to account for the leapsecond on + June 30, 1993. + +1992, Mar. 6 HAN Modified file to account for the leapsecond on + June 30, 1992. + +1990, Oct. 8 HAN Modified file to account for the leapsecond on + Dec. 31, 1990. + + +Explanation: +------------ + +The contents of this file are used by the routine DELTET to compute the +time difference + +[1] DELTA_ET = ET - UTC + +the increment to be applied to UTC to give ET. + +The difference between UTC and TAI, + +[2] DELTA_AT = TAI - UTC + +is always an integral number of seconds. The value of DELTA_AT was 10 +seconds in January 1972, and increases by one each time a leap second +is declared. Combining [1] and [2] gives + +[3] DELTA_ET = ET - (TAI - DELTA_AT) + + = (ET - TAI) + DELTA_AT + +The difference (ET - TAI) is periodic, and is given by + +[4] ET - TAI = DELTA_T_A + K sin E + +where DELTA_T_A and K are constant, and E is the eccentric anomaly of the +heliocentric orbit of the Earth-Moon barycenter. Equation [4], which ignores +small-period fluctuations, is accurate to about 0.000030 seconds. + +The eccentric anomaly E is given by + +[5] E = M + EB sin M + +where M is the mean anomaly, which in turn is given by + +[6] M = M + M t + 0 1 + +where t is the number of ephemeris seconds past J2000. + +Thus, in order to compute DELTA_ET, the following items are necessary. + + DELTA_TA + K + EB + M0 + M1 + DELTA_AT after each leap second. + +The numbers, and the formulation, are taken from the following sources. + + 1) Moyer, T.D., Transformation from Proper Time on Earth to + Coordinate Time in Solar System Barycentric Space-Time Frame + of Reference, Parts 1 and 2, Celestial Mechanics 23 (1981), + 33-56 and 57-68. + + 2) Moyer, T.D., Effects of Conversion to the J2000 Astronomical + Reference System on Algorithms for Computing Time Differences + and Clock Rates, JPL IOM 314.5--942, 1 October 1985. + +The variable names used above are consistent with those used in the +Astronomical Almanac. + +\begindata + +DELTET/DELTA_T_A = 32.184 +DELTET/K = 1.657D-3 +DELTET/EB = 1.671D-2 +DELTET/M = ( 6.239996D0 1.99096871D-7 ) + +DELTET/DELTA_AT = ( 10, @1972-JAN-1 + 11, @1972-JUL-1 + 12, @1973-JAN-1 + 13, @1974-JAN-1 + 14, @1975-JAN-1 + 15, @1976-JAN-1 + 16, @1977-JAN-1 + 17, @1978-JAN-1 + 18, @1979-JAN-1 + 19, @1980-JAN-1 + 20, @1981-JUL-1 + 21, @1982-JUL-1 + 22, @1983-JUL-1 + 23, @1985-JUL-1 + 24, @1988-JAN-1 + 25, @1990-JAN-1 + 26, @1991-JAN-1 + 27, @1992-JUL-1 + 28, @1993-JUL-1 + 29, @1994-JUL-1 + 30, @1996-JAN-1 + 31, @1997-JUL-1 + 32, @1999-JAN-1 + 33, @2006-JAN-1 + 34, @2009-JAN-1 + 35, @2012-JUL-1 + 36, @2015-JUL-1 + 37, @2017-JAN-1 ) + +\begintext + + +)"; + std::filesystem::path path = std::filesystem::temp_directory_path(); + std::filesystem::path file = path / "naif0012.tls"; + { + std::ofstream f(file); + f << Naif00012tlsSource; + } + loadKernel(file.string()); + std::filesystem::remove(file); +} + void SpiceManager::setExceptionHandling(UseException useException) { _useExceptions = useException; } From 639419a51b2d40e91b66990571fdbd21922afc4f Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Wed, 15 Nov 2023 14:18:04 +0100 Subject: [PATCH 171/701] Issue/1440 - Exoplanet Panel and settings update (#2943) * Add tags that can be used to set object visibility from UI * Add module property for hiding/showing orbiting uncertainty disc * Add tag for 1 AU ring and change color to something that's different from orbits * Add property for circle color * Add temporary gui hash for easier testing * Update modules/exoplanets/exoplanetsmodule.cpp Co-authored-by: Alexander Bock * Update GUI hash to correct commit on webgui master --------- Co-authored-by: Alexander Bock --- data/assets/util/webgui.asset | 2 +- modules/exoplanets/exoplanetsmodule.cpp | 43 +++++++++++++++++++++ modules/exoplanets/exoplanetsmodule.h | 5 +++ modules/exoplanets/exoplanetsmodule_lua.inl | 20 +++++----- 4 files changed, 60 insertions(+), 10 deletions(-) diff --git a/data/assets/util/webgui.asset b/data/assets/util/webgui.asset index 2059d900f5..4464eff324 100644 --- a/data/assets/util/webgui.asset +++ b/data/assets/util/webgui.asset @@ -4,7 +4,7 @@ local guiCustomization = asset.require("customization/gui") -- Select which commit hashes to use for the frontend and backend -local frontendHash = "26e709be4e4b17d7fcdbd8f53cf681f4f4126b29" +local frontendHash = "ab3222e9b281ba9964205426a134d6ce5b404d43" local frontend = asset.resource({ Identifier = "WebGuiFrontend", diff --git a/modules/exoplanets/exoplanetsmodule.cpp b/modules/exoplanets/exoplanetsmodule.cpp index a724c68c5f..b3923b27b4 100644 --- a/modules/exoplanets/exoplanetsmodule.cpp +++ b/modules/exoplanets/exoplanetsmodule.cpp @@ -110,6 +110,15 @@ namespace { openspace::properties::Property::Visibility::AdvancedUser }; + constexpr openspace::properties::Property::PropertyInfo ComparisonCircleColorInfo = { + "ComparisonCircleColor", + "Comparison Circle Color", + "Decides the color of the 1 AU size comparison circles that are generated as part " + "of an exoplanet system. Changing the color will not modify already existing " + "circles", + openspace::properties::Property::Visibility::NoviceUser + }; + constexpr openspace::properties::Property::PropertyInfo ShowComparisonCircleInfo = { "ShowComparisonCircle", "Show Comparison Circle", @@ -119,6 +128,14 @@ namespace { openspace::properties::Property::Visibility::NoviceUser }; + constexpr openspace::properties::Property::PropertyInfo ShowOrbitUncertaintyInfo = { + "ShowOrbitUncertainty", + "Show Orbit Uncertainty", + "If true, a disc showing the uncertainty for each planetary orbit is enabled per " + "default when an exoplanet system is created", + openspace::properties::Property::Visibility::User + }; + constexpr openspace::properties::Property::PropertyInfo ShowHabitableZoneInfo = { "ShowHabitableZone", "Show Habitable Zone", @@ -174,9 +191,15 @@ namespace { // [[codegen::verbatim(HabitableZoneTextureInfo.description)]] std::optional habitableZoneTexture; + // [[codegen::verbatim(ComparisonCircleColorInfo.description)]] + std::optional comparisonCircleColor [[codegen::color()]]; + // [[codegen::verbatim(ShowComparisonCircleInfo.description)]] std::optional showComparisonCircle; + // [[codegen::verbatim(ShowOrbitUncertaintyInfo.description)]] + std::optional showOrbitUncertainty; + // [[codegen::verbatim(ShowHabitableZoneInfo.description)]] std::optional showHabitableZone; @@ -203,7 +226,14 @@ ExoplanetsModule::ExoplanetsModule() , _noDataTexturePath(NoDataTextureInfo) , _orbitDiscTexturePath(OrbitDiscTextureInfo) , _habitableZoneTexturePath(HabitableZoneTextureInfo) + , _comparisonCircleColor( + ComparisonCircleColorInfo, + glm::vec3(0.f, 0.8f, 0.8f), + glm::vec3(0.f), + glm::vec3(1.f) + ) , _showComparisonCircle(ShowComparisonCircleInfo, false) + , _showOrbitUncertainty(ShowOrbitUncertaintyInfo, true) , _showHabitableZone(ShowHabitableZoneInfo, true) , _useOptimisticZone(UseOptimisticZoneInfo, true) , _habitableZoneOpacity(HabitableZoneOpacityInfo, 0.1f, 0.f, 1.f) @@ -220,7 +250,10 @@ ExoplanetsModule::ExoplanetsModule() addProperty(_orbitDiscTexturePath); addProperty(_habitableZoneTexturePath); + _comparisonCircleColor.setViewOption(properties::Property::ViewOptions::Color); + addProperty(_comparisonCircleColor); addProperty(_showComparisonCircle); + addProperty(_showOrbitUncertainty); addProperty(_showHabitableZone); addProperty(_useOptimisticZone); @@ -279,10 +312,18 @@ std::string ExoplanetsModule::habitableZoneTexturePath() const { return _habitableZoneTexturePath; } +glm::vec3 ExoplanetsModule::comparisonCircleColor() const { + return _comparisonCircleColor; +} + bool ExoplanetsModule::showComparisonCircle() const { return _showComparisonCircle; } +bool ExoplanetsModule::showOrbitUncertainty() const { + return _showOrbitUncertainty; +} + bool ExoplanetsModule::showHabitableZone() const { return _showHabitableZone; } @@ -328,7 +369,9 @@ void ExoplanetsModule::internalInitialize(const ghoul::Dictionary& dict) { _habitableZoneTexturePath = p.habitableZoneTexture.value().string(); } + _comparisonCircleColor = p.comparisonCircleColor.value_or(_comparisonCircleColor); _showComparisonCircle = p.showComparisonCircle.value_or(_showComparisonCircle); + _showOrbitUncertainty = p.showOrbitUncertainty.value_or(_showOrbitUncertainty); _showHabitableZone = p.showHabitableZone.value_or(_showHabitableZone); _useOptimisticZone = p.useOptimisticZone.value_or(_useOptimisticZone); diff --git a/modules/exoplanets/exoplanetsmodule.h b/modules/exoplanets/exoplanetsmodule.h index a77b6a43b5..61c748740e 100644 --- a/modules/exoplanets/exoplanetsmodule.h +++ b/modules/exoplanets/exoplanetsmodule.h @@ -31,6 +31,7 @@ #include #include #include +#include namespace openspace { @@ -51,7 +52,9 @@ public: std::string noDataTexturePath() const; std::string orbitDiscTexturePath() const; std::string habitableZoneTexturePath() const; + glm::vec3 comparisonCircleColor() const; bool showComparisonCircle() const; + bool showOrbitUncertainty() const; bool showHabitableZone() const; bool useOptimisticZone() const; float habitableZoneOpacity() const; @@ -71,7 +74,9 @@ protected: properties::StringProperty _orbitDiscTexturePath; properties::StringProperty _habitableZoneTexturePath; + properties::Vec3Property _comparisonCircleColor; properties::BoolProperty _showComparisonCircle; + properties::BoolProperty _showOrbitUncertainty; properties::BoolProperty _showHabitableZone; properties::BoolProperty _useOptimisticZone; diff --git a/modules/exoplanets/exoplanetsmodule_lua.inl b/modules/exoplanets/exoplanetsmodule_lua.inl index a7aa2d4f15..9b4677e3f6 100644 --- a/modules/exoplanets/exoplanetsmodule_lua.inl +++ b/modules/exoplanets/exoplanetsmodule_lua.inl @@ -355,11 +355,14 @@ void createExoplanetSystem(const std::string& starName, const std::string discTexture = module->orbitDiscTexturePath(); + bool isDiscEnabled = module->showOrbitUncertainty(); + const std::string discNode = "{" "Identifier = '" + planetIdentifier + "_Disc'," "Parent = '" + starIdentifier + "'," "Renderable = {" "Type = 'RenderableOrbitDisc'," + "Enabled = " + (isDiscEnabled ? "true" : "false") + "," "Texture = openspace.absPath('" + formatPathToLua(discTexture) + "')," @@ -377,6 +380,7 @@ void createExoplanetSystem(const std::string& starName, "Rotation = " + ghoul::to_string(rotationMat3) + "" "}" "}," + "Tag = {'exoplanet_uncertainty_disc'}," "GUI = {" "Name = '" + planetName + " Disc'," "Path = '" + guiPath + "'" @@ -402,7 +406,7 @@ void createExoplanetSystem(const std::string& starName, const glm::dmat3 meanOrbitPlaneRotationMatrix = static_cast(rotation); bool isCircleEnabled = module->showComparisonCircle(); - const std::string isCircleEnabledString = isCircleEnabled ? "true" : "false"; + glm::vec3 circleColor = module->comparisonCircleColor(); // 1 AU Size Comparison Circle const std::string circle = "{" @@ -410,8 +414,9 @@ void createExoplanetSystem(const std::string& starName, "Parent = '" + starIdentifier + "'," "Renderable = {" "Type = 'RenderableRadialGrid'," - "Enabled = " + isCircleEnabledString + "," + "Enabled = " + (isCircleEnabled ? "true" : "false") + "," "Radii = { 0.0, 1.0 }," + "Color = " + ghoul::to_string(circleColor) + "," "CircleSegments = 64," "LineWidth = 2.0," "}," @@ -425,6 +430,7 @@ void createExoplanetSystem(const std::string& starName, "Scale = " + std::to_string(distanceconstants::AstronomicalUnit) + "" "}" "}," + "Tag = {'exoplanet_1au_ring'}," "GUI = {" "Name = '1 AU Size Comparison Circle'," "Path = '" + guiPath + "'" @@ -455,13 +461,8 @@ void createExoplanetSystem(const std::string& starName, "above freezing anywhere on the planet"; const std::string hzTexture = module->habitableZoneTexturePath(); - bool isHzEnabled = module->showHabitableZone(); - const std::string isHzEnabledString = isHzEnabled ? "true" : "false"; - bool useOptimistic = module->useOptimisticZone(); - const std::string useOptimisticString = useOptimistic ? "true" : "false"; - float opacity = module->habitableZoneOpacity(); const std::string zoneDiscNode = "{" @@ -469,11 +470,11 @@ void createExoplanetSystem(const std::string& starName, "Parent = '" + starIdentifier + "'," "Renderable = {" "Type = 'RenderableHabitableZone'," - "Enabled = " + isHzEnabledString + "," + "Enabled = " + (isHzEnabled ? "true" : "false") + "," "Texture = openspace.absPath('" + formatPathToLua(hzTexture) + "')," "Luminosity = " + std::to_string(system.starData.luminosity) + "," "EffectiveTemperature = " + std::to_string(system.starData.teff) + "," - "Optimistic = " + useOptimisticString + "," + "Optimistic = " + (useOptimistic ? "true" : "false") + "," "Opacity = " + std::to_string(opacity) + "" "}," "Transform = {" @@ -482,6 +483,7 @@ void createExoplanetSystem(const std::string& starName, "Rotation = " + ghoul::to_string(meanOrbitPlaneRotationMatrix) + "" "}" "}," + "Tag = {'exoplanet_habitable_zone'}," "GUI = {" "Name = '" + starName + " Habitable Zone'," "Path = '" + guiPath + "'," From aae4d04c43ef820b58ed5bf76aff13472eac1cff Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Wed, 15 Nov 2023 16:00:36 +0100 Subject: [PATCH 172/701] Add documentation for camera path instruction dictionary used as input for `openspace.pathnavigation.createPath` --- include/openspace/navigation/path.h | 3 +++ src/documentation/core_registration.cpp | 8 ++++++-- src/navigation/path.cpp | 6 ++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/include/openspace/navigation/path.h b/include/openspace/navigation/path.h index 4c984dd10c..0d9851f6c1 100644 --- a/include/openspace/navigation/path.h +++ b/include/openspace/navigation/path.h @@ -25,6 +25,7 @@ #ifndef __OPENSPACE_CORE___PATH___H__ #define __OPENSPACE_CORE___PATH___H__ +#include #include #include #include @@ -110,6 +111,8 @@ public: */ void resetPlaybackVariables(); + static documentation::Documentation Documentation(); + private: /** * Interpolate between the paths start and end rotation using the approach that diff --git a/src/documentation/core_registration.cpp b/src/documentation/core_registration.cpp index bf1d77309f..5e8b02345c 100644 --- a/src/documentation/core_registration.cpp +++ b/src/documentation/core_registration.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -60,8 +61,9 @@ namespace openspace { void registerCoreClasses(documentation::DocumentationEngine& engine) { engine.addDocumentation(LogFactoryDocumentation()); + + engine.addDocumentation(LightSource::Documentation()); engine.addDocumentation(Mission::Documentation()); - engine.addDocumentation(interaction::NavigationState::Documentation()); engine.addDocumentation(Renderable::Documentation()); engine.addDocumentation(Rotation::Documentation()); engine.addDocumentation(Scale::Documentation()); @@ -70,7 +72,9 @@ void registerCoreClasses(documentation::DocumentationEngine& engine) { engine.addDocumentation(TimeRange::Documentation()); engine.addDocumentation(Translation::Documentation()); engine.addDocumentation(TimeFrame::Documentation()); - engine.addDocumentation(LightSource::Documentation()); + + engine.addDocumentation(interaction::NavigationState::Documentation()); + engine.addDocumentation(interaction::Path::Documentation()); } // NOTE: should this be in the documentation/core_reg.cpp file? Seems to be here just diff --git a/src/navigation/path.cpp b/src/navigation/path.cpp index e4a723c08f..04c5cfdd1b 100644 --- a/src/navigation/path.cpp +++ b/src/navigation/path.cpp @@ -49,6 +49,8 @@ namespace { // It's nice to have these to interpret the dictionary when creating the path, but // maybe it's not really necessary struct [[codegen::Dictionary(PathInstruction)]] Parameters { + // The type of the instruction. Decides what other parameters are + // handled/available enum class TargetType { Node, NavigationState @@ -96,6 +98,10 @@ namespace { namespace openspace::interaction { +documentation::Documentation Path::Documentation() { + return codegen::doc("core_path_instruction"); +} + Path::Path(Waypoint start, Waypoint end, Type type, std::optional duration) : _start(start) , _end(end) From 5fc9058f76b31884c7c80b70a77c4e5c563e29b0 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Wed, 15 Nov 2023 17:19:43 +0100 Subject: [PATCH 173/701] More explicit handling of zero duration paths (#2947) * More explicit handling of zero duration paths * Update src/navigation/path.cpp Co-authored-by: Alexander Bock --------- Co-authored-by: Alexander Bock --- src/navigation/path.cpp | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/navigation/path.cpp b/src/navigation/path.cpp index 04c5cfdd1b..a796b46595 100644 --- a/src/navigation/path.cpp +++ b/src/navigation/path.cpp @@ -126,14 +126,20 @@ Path::Path(Waypoint start, Waypoint end, Type type, std::optional durati // computing how much faster/slower it should be _speedFactorFromDuration = 1.0; if (duration.has_value()) { - constexpr double dt = 0.05; // 20 fps - while (!hasReachedEnd()) { - traversePath(dt); - } + if (*duration > 0.0) { + constexpr double dt = 0.05; // 20 fps + while (!hasReachedEnd()) { + traversePath(dt); + } - // We now know how long it took to traverse the path. Use that - _speedFactorFromDuration = _progressedTime / *duration; - resetPlaybackVariables(); + // We now know how long it took to traverse the path. Use that + _speedFactorFromDuration = _progressedTime / *duration; + resetPlaybackVariables(); + } + else { + // A duration of zero means infinite speed. Handle this explicity + _speedFactorFromDuration = std::numeric_limits::infinity(); + } } } @@ -154,6 +160,13 @@ std::vector Path::controlPoints() const { } CameraPose Path::traversePath(double dt, float speedScale) { + if (std::isinf(_speedFactorFromDuration)) { + _shouldQuit = true; + _prevPose = _start.pose(); + _traveledDistance = pathLength(); + return _end.pose(); + } + double speed = speedAlongPath(_traveledDistance); speed *= static_cast(speedScale); double displacement = dt * speed; From 94ab3332d0c2e9d5b7a6e6d1ed58673664d9ee53 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Fri, 17 Nov 2023 13:07:14 +0100 Subject: [PATCH 174/701] Update GUI hash to fix optionproperty rendering bug --- data/assets/util/webgui.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/util/webgui.asset b/data/assets/util/webgui.asset index 4464eff324..d3872b531a 100644 --- a/data/assets/util/webgui.asset +++ b/data/assets/util/webgui.asset @@ -4,7 +4,7 @@ local guiCustomization = asset.require("customization/gui") -- Select which commit hashes to use for the frontend and backend -local frontendHash = "ab3222e9b281ba9964205426a134d6ce5b404d43" +local frontendHash = "d7bac0d84b0a17de7f822fa776a7298b3d4ef372" local frontend = asset.resource({ Identifier = "WebGuiFrontend", From d6369edd18e45f8250d596c98c32f86b4636e2b7 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Fri, 17 Nov 2023 15:53:16 +0100 Subject: [PATCH 175/701] Update ghoul (trimming whitespaces in csv) --- ext/ghoul | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/ghoul b/ext/ghoul index 50cf606576..e03f640bee 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit 50cf6065769420d36c07dad0c9c5a7f60cfa7bd6 +Subproject commit e03f640bee6200bf38bf9cb37b5e6b155edcf497 From 3c35d230626eca211d6e3295ab9377e048a4a1db Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Sun, 19 Nov 2023 11:51:19 +0100 Subject: [PATCH 176/701] Verifier cleanup (#2952) * Add a description to structs * Cleanup --- ext/ghoul | 2 +- .../openspace/documentation/documentation.h | 120 ++-- include/openspace/documentation/verifier.h | 473 ++++++---------- include/openspace/documentation/verifier.inl | 395 ------------- modules/base/dashboard/dashboarditemangle.cpp | 3 + modules/globebrowsing/src/layermanager.cpp | 1 + modules/server/src/serverinterface.cpp | 6 +- modules/spout/renderablespherespout.cpp | 1 + modules/volume/transferfunctionhandler.cpp | 2 +- src/documentation/documentation.cpp | 14 - src/documentation/documentationengine.cpp | 4 +- src/documentation/verifier.cpp | 114 +--- .../tasks/convertrecfileversiontask.cpp | 1 + .../tasks/convertrecformattask.cpp | 1 + src/util/factorymanager.cpp | 4 +- support/coding/codegen | 2 +- tests/test_documentation.cpp | 535 ++++++++---------- 17 files changed, 510 insertions(+), 1168 deletions(-) diff --git a/ext/ghoul b/ext/ghoul index e03f640bee..fbd80eae0f 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit e03f640bee6200bf38bf9cb37b5e6b155edcf497 +Subproject commit fbd80eae0ff589a9fa2fb5e2c8af8e4491fe4e2d diff --git a/include/openspace/documentation/documentation.h b/include/openspace/documentation/documentation.h index 15ec83ce52..c8c7385613 100644 --- a/include/openspace/documentation/documentation.h +++ b/include/openspace/documentation/documentation.h @@ -36,6 +36,8 @@ namespace ghoul { class Dictionary; } namespace openspace::documentation { +class Verifier; + BooleanType(Optional); /** @@ -52,9 +54,7 @@ struct TestResult { * offense. */ struct Offense { - /** - * The Reason for the offense - */ + /// The Reason for the offense enum class Reason { Unknown, ///< Unknown reason MissingKey, ///< The offending key that was requested was not found @@ -78,9 +78,7 @@ struct TestResult { * might be removed in a latter version. */ struct Warning { - /** - * The reason for the warning - */ + /// The reason for the warning enum class Reason { Deprecated ///< The value is marked as deprecated and should not used }; @@ -124,8 +122,6 @@ struct SpecificationError : public ghoul::RuntimeError { void logError(const SpecificationError& error, std::string component = ""); -struct Verifier; - /** * A DocumentationEntry provides the specification for a single key, which is tested using * the provided Verifier. Each DocumentationEntry can contain a textual documentation that @@ -172,28 +168,28 @@ struct DocumentationEntry { Optional opt, std::string doc = ""); /** - * The constructor for a DocumentationEntry describing a key \p k in a Documentation. - * The value for the key (or each value in the case of the - * DocumentationEntry::Wildcard) is tested using the verifier \p v, that specifies the - * conditions that the \p k%'s value has to fulfill. The textual documentation - * \p doc shall describe the usage of the key-value pair and will be printed for human - * consumption for example in the DocumentationEngine. Each DocumentationEntry can - * further be \p opt. - * - * \param k The key for which this DocumentationEntry is valid. If this valid is - * equal to DocumentationEntry::Wildcard, each entry in the Documentation that - * contains this DocumentationEntry will be matched - * \param v The Verifier that is used to test the \p key%'s value to determine if it is - * a valid value. The DocumentationEntry will take ownership of the passed - * object - * \param doc The textual documentation that describes the DocumentationEntry in a - * human readable format - * \param opt Determines whether the Documentation containing this DocumentationEntry - * must have a key \p key, or whether it is optional - * - * \pre \p k must not be empty - * \pre \p v must not be nullptr - */ + * The constructor for a DocumentationEntry describing a key \p k in a Documentation. + * The value for the key (or each value in the case of the + * DocumentationEntry::Wildcard) is tested using the verifier \p v, that specifies the + * conditions that the \p k%'s value has to fulfill. The textual documentation + * \p doc shall describe the usage of the key-value pair and will be printed for human + * consumption for example in the DocumentationEngine. Each DocumentationEntry can + * further be \p opt. + * + * \param k The key for which this DocumentationEntry is valid. If this valid is + * equal to DocumentationEntry::Wildcard, each entry in the Documentation that + * contains this DocumentationEntry will be matched + * \param v The Verifier that is used to test the \p key%'s value to determine if it + * is a valid value. The DocumentationEntry will take ownership of the passed + * object + * \param doc The textual documentation that describes the DocumentationEntry in a + * human readable format + * \param opt Determines whether the Documentation containing this DocumentationEntry + * must have a key \p key, or whether it is optional + * + * \pre \p k must not be empty + * \pre \p v must not be nullptr + */ DocumentationEntry(std::string k, Verifier* v, Optional opt, std::string doc = ""); @@ -232,43 +228,14 @@ Documentation doc = { * both the wildcard and the specialized entry will be evaluated. */ struct Documentation { - using DocumentationEntries = std::vector; - - /** - * Creates a Documentation with a human-readable name \p n and a list of entries - * \p ents. - * - * \param n The human-readable name of this Documentation - * \param i A unique identifier which can be used by applications (or other - * Documentation%s to reference this entry - * \param ents A list of DocumentationEntry%s that describe the individual keys for - * this entrie Documentation - */ - Documentation(std::string n, std::string i, DocumentationEntries ents = {}); - - /** - * Creates a Documentation with a human-readable name \p n. - * - * \param n The human-readable name of this Documentation - * \param ents A list of DocumentationEntry%s that describe the individual keys for - * this entrie Documentation - */ - Documentation(std::string n, DocumentationEntries ents = {}); - - /** - * Creates a Documentation. - * - * \param entries A list of DocumentationEntry%s that describe the individual keys for - * this entrie Documentation - */ - Documentation(DocumentationEntries ents = {}); - /// The human-readable name of the Documentation std::string name; /// A unique identifier which can be used to reference this Documentation std::string id; + /// A general description for the entire documented entity + std::string description; /// A list of specifications that are describing this Documentation - DocumentationEntries entries; + std::vector entries; }; /** @@ -287,20 +254,21 @@ TestResult testSpecification(const Documentation& documentation, const ghoul::Dictionary& dictionary); /** -* This method tests whether a provided ghoul::Dictionary \p dictionary adheres to the -* specification \p documentation. If the \p dictionary does not adhere to the -* specification a SpecificationError is thrown, and the exception contains the TestResult -* that contains more information about the offending keys. If the \p dictionary adheres to -* the \p documentation, the method returns normally. -* -* \param documentation The Documentation that the \p dictionary is tested against -* \param dictionary The ghoul::Dictionary that is to be tested against the -* \p documentation -* \param component The component that is using this method; this argument is passed to the -* SpecificationError that is thrown in case of not adhering to the \p documentation -* -* \throw SpecificationError If the \p dictionary does not adhere to the \p documentation -*/ + * This method tests whether a provided ghoul::Dictionary \p dictionary adheres to the + * specification \p documentation. If the \p dictionary does not adhere to the + * specification a SpecificationError is thrown, and the exception contains the TestResult + * that contains more information about the offending keys. If the \p dictionary adheres + * to the \p documentation, the method returns normally. + * + * \param documentation The Documentation that the \p dictionary is tested against + * \param dictionary The ghoul::Dictionary that is to be tested against the + * \p documentation + * \param component The component that is using this method; this argument is passed to + * the SpecificationError that is thrown in case of not adhering to the + * \p documentation + * + * \throw SpecificationError If the \p dictionary does not adhere to the \p documentation + */ void testSpecificationAndThrow(const Documentation& documentation, const ghoul::Dictionary& dictionary, std::string component); diff --git a/include/openspace/documentation/verifier.h b/include/openspace/documentation/verifier.h index dd263a6ea5..6bc3d302f9 100644 --- a/include/openspace/documentation/verifier.h +++ b/include/openspace/documentation/verifier.h @@ -41,7 +41,8 @@ namespace openspace::documentation { * Verifier. Furthermore, the Verifier::documentation method returns a human-readable * description of the Verifier subclass and what it tests for. */ -struct Verifier { +class Verifier { +public: virtual ~Verifier() = default; /** @@ -100,7 +101,8 @@ struct Verifier { * \tparam T The type against which the key's value is tested */ template -struct TemplateVerifier : public Verifier { +class TemplateVerifier : public Verifier { +public: using Type = T; /** @@ -126,7 +128,8 @@ struct TemplateVerifier : public Verifier { * A Verifier that checks whether a given key inside a ghoul::Dictionary is of type * `bool`. No implicit conversion is considered in this testing. */ -struct BoolVerifier : public TemplateVerifier { +class BoolVerifier : public TemplateVerifier { +public: std::string type() const override; }; @@ -134,7 +137,8 @@ struct BoolVerifier : public TemplateVerifier { * A Verifier that checks whether a given key inside a ghoul::Dictionary is of type * `double`. No implicit conversion is considered in this testing. */ -struct DoubleVerifier : public TemplateVerifier { +class DoubleVerifier : public TemplateVerifier { +public: std::string type() const override; }; @@ -143,7 +147,8 @@ struct DoubleVerifier : public TemplateVerifier { * `int`. It will also return `true` if the key's value is of type `double`, but is a * integer value (for example, `0.0`, `12.0`, but not `0.5`). */ -struct IntVerifier : public TemplateVerifier { +class IntVerifier : public TemplateVerifier { +public: TestResult operator()(const ghoul::Dictionary& dict, const std::string& key) const override; @@ -154,7 +159,8 @@ struct IntVerifier : public TemplateVerifier { * A Verifier that checks whether a given key inside a ghoul::Dictionary is of type * `std::string`. No implicit conversion is considered in this testing. */ -struct StringVerifier : public TemplateVerifier { +class StringVerifier : public TemplateVerifier { +public: StringVerifier(bool mustBeNotEmpty = false); TestResult operator()(const ghoul::Dictionary& dictionary, @@ -172,7 +178,8 @@ private: * A Verifier that checks whether a given string is a valid identifier, meaning that is * does not contain any whitespaces or dots */ -struct IdentifierVerifier : public StringVerifier { +class IdentifierVerifier : public StringVerifier { +public: IdentifierVerifier(); TestResult operator()(const ghoul::Dictionary& dict, @@ -187,7 +194,8 @@ struct IdentifierVerifier : public StringVerifier { * A Verifier that checks whether a given key inside a ghoul::Dictionary is a string and * refers to an existing file on disk. */ -struct FileVerifier : public StringVerifier { +class FileVerifier : public StringVerifier { +public: FileVerifier(); TestResult operator()(const ghoul::Dictionary& dict, @@ -197,10 +205,11 @@ struct FileVerifier : public StringVerifier { }; /** -* A Verifier that checks whether a given key inside a ghoul::Dictionary is a string and -* refers to an existing directory on disk. -*/ -struct DirectoryVerifier : public StringVerifier { + * A Verifier that checks whether a given key inside a ghoul::Dictionary is a string and + * refers to an existing directory on disk. + */ +class DirectoryVerifier : public StringVerifier { +public: DirectoryVerifier(); TestResult operator()(const ghoul::Dictionary& dict, @@ -213,7 +222,8 @@ struct DirectoryVerifier : public StringVerifier { * A Verifier that checks whether a given key inside a ghoul::Dictionary is a string and * a valid date time */ -struct DateTimeVerifier : public StringVerifier { +class DateTimeVerifier : public StringVerifier { +public: DateTimeVerifier(); TestResult operator()(const ghoul::Dictionary& dict, @@ -232,7 +242,8 @@ struct DateTimeVerifier : public StringVerifier { * DocumentationEntry checks for a nested key `a` and this does not comply, this Verifier * will return `Table.a` as an offender. */ -struct TableVerifier : public TemplateVerifier { +class TableVerifier : public TemplateVerifier { +public: /** * This constructor takes a list of DocumentationEntry%s that are used recursively to * check the table (= ghoul::Dictionary) contained in the key's value. Similar to the @@ -270,7 +281,8 @@ struct TableVerifier : public TemplateVerifier { /** * A Verifier that checks whether all values contained in a Table are of type `string`. */ -struct StringListVerifier : public TableVerifier { +class StringListVerifier : public TableVerifier { +public: /** * Constructor for a StringListVerifier. * @@ -284,7 +296,8 @@ struct StringListVerifier : public TableVerifier { /** * A Verifier that checks whether all values contained in a Table are of type `int`. */ -struct IntListVerifier : public TableVerifier { +class IntListVerifier : public TableVerifier { +public: /** * Constructor for a IntListVerifier. * @@ -299,40 +312,37 @@ struct IntListVerifier : public TableVerifier { // Vector verifiers //---------------------------------------------------------------------------------------- -/** - * This struct is the base class for all Verifier%s that check for `glm` vector types. - * The template parameter for the subclasses is the containing type, not the full vector - * type. For example to check for `glm::dvec3`, one would create a - * `Vector3Verifier`. - */ -struct VectorVerifier {}; - /// This Verifier checks whether the value is of type `glm::tvec2` template -struct Vector2Verifier : public TemplateVerifier>, public VectorVerifier { +class Vector2Verifier : public TemplateVerifier> { +public: std::string type() const override; }; /// This Verifier checks whether the value is of type `glm::tvec3` template -struct Vector3Verifier : public TemplateVerifier>, public VectorVerifier { +class Vector3Verifier : public TemplateVerifier> { +public: std::string type() const override; }; /// This Verifier checks whether the value is of type `glm::tvec4` template -struct Vector4Verifier : public TemplateVerifier>, public VectorVerifier { +class Vector4Verifier : public TemplateVerifier> { +public: std::string type() const override; }; -struct Color3Verifier : public Vector3Verifier { +class Color3Verifier : public Vector3Verifier { +public: TestResult operator()(const ghoul::Dictionary& dictionary, const std::string& key) const override; std::string type() const override; }; -struct Color4Verifier : public Vector4Verifier { +class Color4Verifier : public Vector4Verifier { +public: TestResult operator()(const ghoul::Dictionary& dictionary, const std::string& key) const override; @@ -344,7 +354,8 @@ struct Color4Verifier : public Vector4Verifier { * type `glm::tvec2` */ template -struct Vector2ListVerifier : public TableVerifier { +class Vector2ListVerifier : public TableVerifier { +public: Vector2ListVerifier(std::string elementDocumentation = "") : TableVerifier({ { "*", new Vector2Verifier, Optional::No, std::move(elementDocumentation) } @@ -361,7 +372,8 @@ struct Vector2ListVerifier : public TableVerifier { * type `glm::tvec3` */ template -struct Vector3ListVerifier : public TableVerifier { +class Vector3ListVerifier : public TableVerifier { +public: Vector3ListVerifier(std::string elementDocumentation = "") : TableVerifier({ { "*", new Vector3Verifier, Optional::No, std::move(elementDocumentation) } @@ -378,7 +390,8 @@ struct Vector3ListVerifier : public TableVerifier { * type `glm::tvec4` */ template -struct Vector4ListVerifier : public TableVerifier { +class Vector4ListVerifier : public TableVerifier { +public: Vector4ListVerifier(std::string elementDocumentation = "") : TableVerifier({ { "*", new Vector4Verifier, Optional::No, std::move(elementDocumentation) } @@ -394,20 +407,12 @@ struct Vector4ListVerifier : public TableVerifier { // Matrix verifiers //---------------------------------------------------------------------------------------- -/** - * This struct is the base class for all Verifier%s that check for `glm` matrix types. - * The template parameter for the subclasses is the containing type, not the full matrix - * type. For example to check for `glm::dmat4x3`, one would create a - * `Matrix4x3Verifier`. - */ -struct MatrixVerifier {}; - /** * This Verifier checks whether the value is of type `glm::mat2x2` */ template -struct Matrix2x2Verifier : public TemplateVerifier>, public MatrixVerifier -{ +class Matrix2x2Verifier : public TemplateVerifier> { +public: std::string type() const override; }; @@ -415,8 +420,8 @@ struct Matrix2x2Verifier : public TemplateVerifier>, public Matr * This Verifier checks whether the value is of type `glm::mat2x3` */ template -struct Matrix2x3Verifier : public TemplateVerifier>, public MatrixVerifier -{ +class Matrix2x3Verifier : public TemplateVerifier> { +public: std::string type() const override; }; @@ -424,8 +429,8 @@ struct Matrix2x3Verifier : public TemplateVerifier>, public Matr * This Verifier checks whether the value is of type `glm::mat2x4` */ template -struct Matrix2x4Verifier : public TemplateVerifier>, public MatrixVerifier -{ +class Matrix2x4Verifier : public TemplateVerifier> { +public: std::string type() const override; }; @@ -433,8 +438,8 @@ struct Matrix2x4Verifier : public TemplateVerifier>, public Matr * This Verifier checks whether the value is of type `glm::mat3x2` */ template -struct Matrix3x2Verifier : public TemplateVerifier>, public MatrixVerifier -{ +class Matrix3x2Verifier : public TemplateVerifier> { +public: std::string type() const override; }; @@ -442,8 +447,8 @@ struct Matrix3x2Verifier : public TemplateVerifier>, public Matr * This Verifier checks whether the value is of type `glm::mat3x3` */ template -struct Matrix3x3Verifier : public TemplateVerifier>, public MatrixVerifier -{ +class Matrix3x3Verifier : public TemplateVerifier> { +public: std::string type() const override; }; @@ -451,8 +456,8 @@ struct Matrix3x3Verifier : public TemplateVerifier>, public Matr * This Verifier checks whether the value is of type `glm::mat3x4` */ template -struct Matrix3x4Verifier : public TemplateVerifier>, public MatrixVerifier -{ +class Matrix3x4Verifier : public TemplateVerifier> { +public: std::string type() const override; }; @@ -460,8 +465,8 @@ struct Matrix3x4Verifier : public TemplateVerifier>, public Matr * This Verifier checks whether the value is of type `glm::mat4x2` */ template -struct Matrix4x2Verifier : public TemplateVerifier>, public MatrixVerifier -{ +class Matrix4x2Verifier : public TemplateVerifier> { +public: std::string type() const override; }; @@ -469,8 +474,8 @@ struct Matrix4x2Verifier : public TemplateVerifier>, public Matr * This Verifier checks whether the value is of type `glm::mat4x3` */ template -struct Matrix4x3Verifier : public TemplateVerifier>, public MatrixVerifier -{ +class Matrix4x3Verifier : public TemplateVerifier> { +public: std::string type() const override; }; @@ -478,8 +483,8 @@ struct Matrix4x3Verifier : public TemplateVerifier>, public Matr * This Verifier checks whether the value is of type `glm::mat4x4` */ template -struct Matrix4x4Verifier : public TemplateVerifier>, public MatrixVerifier -{ +class Matrix4x4Verifier : public TemplateVerifier> { +public: std::string type() const override; }; @@ -503,7 +508,8 @@ struct Matrix4x4Verifier : public TemplateVerifier>, public Matr * reason TestResult::Offense::Verification is returned instead. */ template -struct OperatorVerifier : public T { +class OperatorVerifier : public T { +public: /** * Constructor for an OperatorVerifier. As all operators need to compare the incoming * value to a stored value, we require the comparison \p value to be passed in here. @@ -539,18 +545,17 @@ struct OperatorVerifier : public T { * as) BoolVerifier, StringVerifier, TableVerifier, or VectorVerifier. */ template -struct LessVerifier : public OperatorVerifier> { - static_assert(!std::is_base_of::value, "T cannot be BoolVerifier"); - static_assert( - !std::is_base_of::value, "T cannot be StringVerifier" - ); - static_assert(!std::is_base_of::value, "T cannot be TableVerifier"); - +class LessVerifier : public OperatorVerifier> { +public: using OperatorVerifier>::OperatorVerifier; + using OperatorVerifier>::value; std::string documentation() const override; - using OperatorVerifier>::value; +private: + static_assert(!std::is_base_of_v, "T cannot be BoolVerifier"); + static_assert(!std::is_base_of_v, "T cannot be StringVerifier"); + static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); }; /** @@ -559,19 +564,17 @@ struct LessVerifier : public OperatorVerifier> { * as) BoolVerifier, StringVerifier, TableVerifier, or VectorVerifier. */ template -struct LessEqualVerifier : public OperatorVerifier> { - static_assert(!std::is_base_of::value, "T cannot be BoolVerifier"); - static_assert( - !std::is_base_of::value, - "T cannot be StringVerifier" - ); - static_assert(!std::is_base_of::value, "T cannot be TableVerifier"); - +class LessEqualVerifier : public OperatorVerifier> { +public: using OperatorVerifier>::OperatorVerifier; + using OperatorVerifier>::value; std::string documentation() const override; - using OperatorVerifier>::value; +private: + static_assert(!std::is_base_of_v, "T cannot be BoolVerifier"); + static_assert(!std::is_base_of_v, "T cannot be StringVerifier"); + static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); }; /** @@ -580,19 +583,17 @@ struct LessEqualVerifier : public OperatorVerifier -struct GreaterVerifier : public OperatorVerifier> { - static_assert(!std::is_base_of::value, "T cannot be BoolVerifier"); - static_assert( - !std::is_base_of::value, - "T cannot be StringVerifier" - ); - static_assert(!std::is_base_of::value, "T cannot be TableVerifier"); - +class GreaterVerifier : public OperatorVerifier> { +public: using OperatorVerifier>::OperatorVerifier; + using OperatorVerifier>::value; std::string documentation() const override; - using OperatorVerifier>::value; +private: + static_assert(!std::is_base_of_v, "T cannot be BoolVerifier"); + static_assert(!std::is_base_of_v, "T cannot be StringVerifier"); + static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); }; /** @@ -601,21 +602,19 @@ struct GreaterVerifier : public OperatorVerifier -struct GreaterEqualVerifier : public OperatorVerifier> { - static_assert(!std::is_base_of::value, "T cannot be BoolVerifier"); - static_assert( - !std::is_base_of::value, - "T cannot be StringVerifier" - ); - static_assert(!std::is_base_of::value, "T cannot be TableVerifier"); - +public: using OperatorVerifier>::OperatorVerifier; + using OperatorVerifier>::value; std::string documentation() const override; - using OperatorVerifier>::value; +private: + static_assert(!std::is_base_of_v, "T cannot be BoolVerifier"); + static_assert(!std::is_base_of_v, "T cannot be StringVerifier"); + static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); }; /** @@ -624,14 +623,15 @@ struct GreaterEqualVerifier : public OperatorVerifier -struct EqualVerifier : public OperatorVerifier> { - static_assert(!std::is_base_of::value, "T cannot be TableVerifier"); - +class EqualVerifier : public OperatorVerifier> { +public: using OperatorVerifier>::OperatorVerifier; + using OperatorVerifier>::value; std::string documentation() const override; - using OperatorVerifier>::value; +private: + static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); }; /** @@ -640,14 +640,15 @@ struct EqualVerifier : public OperatorVerifier -struct UnequalVerifier : public OperatorVerifier> { - static_assert(!std::is_base_of::value, "T cannot be TableVerifier"); - +class UnequalVerifier : public OperatorVerifier> { +public: using OperatorVerifier>::OperatorVerifier; + using OperatorVerifier>::value; std::string documentation() const override; - using OperatorVerifier>::value; +private: + static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); }; //---------------------------------------------------------------------------------------- @@ -661,9 +662,8 @@ struct UnequalVerifier : public OperatorVerifier -struct InListVerifier : public T { - static_assert(!std::is_base_of::value, "T cannot be TableVerifier"); - +class InListVerifier : public T { +public: /** * Constructs an InListVerifier that checks whether the incoming value is of the * correct type and whether the value is part of the list passed as \p values. @@ -692,6 +692,9 @@ struct InListVerifier : public T { /// The list of values against which the incoming value is tested std::vector values; + +private: + static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); }; /** @@ -701,9 +704,8 @@ struct InListVerifier : public T { * be a subclass of (or the same as) TableVerifier. */ template -struct NotInListVerifier : public T { - static_assert(!std::is_base_of::value, "T cannot be TableVerifier"); - +class NotInListVerifier : public T { +public: /** * Constructs a NotInListVerifier that checks whether the incoming value is of the * correct type and whether the value is not part of the list passed as \p values. @@ -731,6 +733,9 @@ struct NotInListVerifier : public T { std::string documentation() const override; std::vector values; + +private: + static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); }; //---------------------------------------------------------------------------------------- @@ -745,20 +750,8 @@ struct NotInListVerifier : public T { * TableVerifier, or VectorVerifier. Both the lower and the higher limit are inclusive). */ template -struct InRangeVerifier : public T { - static_assert( - !std::is_base_of::value, - "T cannot be BoolVerifier" - ); - static_assert( - !std::is_base_of::value, - "T cannot be StringVerifier" - ); - static_assert( - !std::is_base_of::value, - "T cannot be TableVerifier" - ); - +class InRangeVerifier : public T { +public: /** * Constructs a InRangeVerifier that checks whether the incoming value is of the * correct type and whether the value is greater or equal to \p lower and less or @@ -793,6 +786,11 @@ struct InRangeVerifier : public T { typename T::Type lower; typename T::Type upper; + +private: + static_assert(!std::is_base_of_v, "T cannot be BoolVerifier"); + static_assert(!std::is_base_of_v, "T cannot be StringVerifier"); + static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); }; /** @@ -803,20 +801,8 @@ struct InRangeVerifier : public T { * TableVerifier, or VectorVerifier. Both the lower and the higher limit are exclusive). */ template -struct NotInRangeVerifier : public T { - static_assert( - !std::is_base_of::value, - "T cannot be BoolVerifier" - ); - static_assert( - !std::is_base_of::value, - "T cannot be StringVerifier" - ); - static_assert( - !std::is_base_of::value, - "T cannot be TableVerifier" - ); - +class NotInRangeVerifier : public T { +public: /** * Constructs a InRangeVerifier that checks whether the incoming value is of the * correct type and whether the value is less then \p lower and greater than \p upper. @@ -850,6 +836,11 @@ struct NotInRangeVerifier : public T { typename T::Type lower; typename T::Type upper; + +private: + static_assert(!std::is_base_of_v, "T cannot be BoolVerifier"); + static_assert(!std::is_base_of_v, "T cannot be StringVerifier"); + static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); }; @@ -865,7 +856,8 @@ struct NotInRangeVerifier : public T { * the user that the parameter should be a file of a specific type. */ template -struct AnnotationVerifier : public T { +class AnnotationVerifier : public T { +public: /** * Constructs an AnnotationVerifier that contains the passed \p annotation which is * passed to the user when a documentation is requested. @@ -883,34 +875,6 @@ struct AnnotationVerifier : public T { std::string annotation; }; -/** - * This Verifier is a marker that performs the same testing as the `T` parameter, but - * also adds a warning to the test result informing the user of the deprecation. - * Furthermore, the documentation will contain the word `(deprecated)` in - * addition to the documentation returned by `T` - * \tparam T The Verifier that is to be marked deprecated - */ -template -struct DeprecatedVerifier : public T { - /** - * Tests the \p dictionary%s \p key using the Verifier `T` and adds a warning to the - * TestResult informing the caller of the deprecation. - * - * \param dictionary The ghoul::Dictionary whose \p key should be tested - * \param key The key inside the \p dictionary that is to be tested - * \return A TestResult that contains the results of the testing - */ - TestResult operator()(const ghoul::Dictionary& dictionary, - const std::string& key) const override; - - /** - * Returns the documentation as reported by `T` and adds the word - * `(deprecated)` to it. - * \return The deprecated version of `T`%'s documentation - */ - std::string documentation() const override; -}; - /** * This Verifier can reference and apply other Documentation%s that have been registered * with a DocumentationEngine. The dependency is only resolved when the operator() is @@ -919,7 +883,8 @@ struct DeprecatedVerifier : public T { * If the referenced Documentation exists, the stored Table will be checked against that * Documentation. */ -struct ReferencingVerifier : public TableVerifier { +class ReferencingVerifier : public TableVerifier { +public: /** * Creates a ReferencingVerifier that references a documentation with the provided * identifier \p identifier. The ReferencingVerifier will use the static @@ -958,54 +923,14 @@ struct ReferencingVerifier : public TableVerifier { // Misc verifiers //---------------------------------------------------------------------------------------- -/** - * This Verifier takes two Verifiers and performs a boolean `and` operation on their - * results. In essence, a value only passes this Verifier if it passes both Verifier%s - * that are passed in the constructor. Opposed to the `C++` `&&` - * operator, the AndVerifier does not perform any short-circut evaluation. - */ -struct AndVerifier : public Verifier { - /** - * Constructs an AndVerifier with Verifiers that must be cleared by incoming values in - * order to pass this Verifier. - * - * \param values The list of Verifiers that are to be tested - * - * \pre values must contain at least two values - */ - AndVerifier(const std::vector values); - - /** - * Checks whether the \p dictionary contains the \p key and whether this key passes - * all Verifier%s that were passed in the constructor. If the value fails at least - * one Verifiers, it is only added once to the TestResult::offenses list with a reason - * of TestResult::Offense::Reason::Verification. - * - * \param dictionary The ghoul::Dictionary that is to be tested - * \param key The key contained in \p dictionary that is to be tested - * \return A TestResult object that contains the test results. If the value fails - * any passed Verifiers, TestResult::success is `false` and the - * TestResult::offenses list contains \p with a reason of - * TestResult::Offense::Reason::Verification. If \p key%'s value passes both - * Verifier%s, the result's TestResult::success is `true` and the - * TestResult::offenses is empty. - */ - TestResult operator()(const ghoul::Dictionary& dictionary, - const std::string& key) const override; - - std::string type() const override; - std::string documentation() const override; - - std::vector> values; -}; - /** * This Verifier takes two Verifiers and performs a boolean `or` operation on their * results. In essence, a value only passes this Verifier if it passes either of the two * Verifier%s that are passed in the constructor. Opposed to the `C++` `||` operator, the * OrVerifier does not perform any short-circut evaluation. */ -struct OrVerifier : public Verifier { +class OrVerifier : public Verifier { +public: /** * Constructs an OrVerifier with Verifiers that must be cleared by incoming values in * order to pass this Verifier. @@ -1161,92 +1086,68 @@ using StringAnnotationVerifier = AnnotationVerifier; /// `ghoul::Dictionary` using TableAnnotationVerifier = AnnotationVerifier; -/// A short-hand definition for a DeprecatedVerifier with a type check for `bool` -using BoolDeprecatedVerifier = DeprecatedVerifier; -/// A short-hand definition for a DeprecatedVerifier with a type check for `int` -using IntDeprecatedVerifier = DeprecatedVerifier; -/// A short-hand definition for a DeprecatedVerifier with a type check for `double` -using DoubleDeprecatedVerifier = DeprecatedVerifier; -/// A short-hand definition for a DeprecatedVerifier with a type check for `string` -using StringDeprecatedVerifier = DeprecatedVerifier; -/// A short-hand definition for a DeprecatedVerifier with a type check for -/// `ghoul::Dictionary` -using TableDeprecatedVerifier = DeprecatedVerifier; - // Definitions of external templates that are instantiated in the cpp file // This cuts down the compilation times as almost all of the possible template types do // not need to be instantiated multiple times -extern template struct Vector2Verifier; -extern template struct Vector2Verifier; -extern template struct Vector3Verifier; -extern template struct Vector3Verifier; -extern template struct Vector4Verifier; -extern template struct Vector4Verifier; +extern template class Vector2Verifier; +extern template class Vector2Verifier; +extern template class Vector3Verifier; +extern template class Vector3Verifier; +extern template class Vector4Verifier; +extern template class Vector4Verifier; -extern template struct Matrix2x2Verifier; -extern template struct Matrix2x3Verifier; -extern template struct Matrix2x4Verifier; -extern template struct Matrix3x2Verifier; -extern template struct Matrix3x3Verifier; -extern template struct Matrix3x4Verifier; -extern template struct Matrix4x2Verifier; -extern template struct Matrix4x3Verifier; -extern template struct Matrix4x4Verifier; +extern template class Matrix2x2Verifier; +extern template class Matrix2x3Verifier; +extern template class Matrix2x4Verifier; +extern template class Matrix3x2Verifier; +extern template class Matrix3x3Verifier; +extern template class Matrix3x4Verifier; +extern template class Matrix4x2Verifier; +extern template class Matrix4x3Verifier; +extern template class Matrix4x4Verifier; -extern template struct LessVerifier; -extern template struct LessVerifier; -extern template struct LessEqualVerifier; -extern template struct LessEqualVerifier; -extern template struct GreaterVerifier; -extern template struct GreaterVerifier; -extern template struct GreaterEqualVerifier; -extern template struct GreaterEqualVerifier; -extern template struct EqualVerifier; -extern template struct EqualVerifier; -extern template struct EqualVerifier; -extern template struct EqualVerifier; -extern template struct UnequalVerifier; -extern template struct UnequalVerifier; -extern template struct UnequalVerifier; -extern template struct UnequalVerifier; +extern template class LessVerifier; +extern template class LessVerifier; +extern template class LessEqualVerifier; +extern template class LessEqualVerifier; +extern template class GreaterVerifier; +extern template class GreaterVerifier; +extern template class GreaterEqualVerifier; +extern template class GreaterEqualVerifier; +extern template class EqualVerifier; +extern template class EqualVerifier; +extern template class EqualVerifier; +extern template class EqualVerifier; +extern template class UnequalVerifier; +extern template class UnequalVerifier; +extern template class UnequalVerifier; +extern template class UnequalVerifier; -extern template struct InListVerifier; -extern template struct InListVerifier; -extern template struct InListVerifier; -extern template struct InListVerifier; -extern template struct NotInListVerifier; -extern template struct NotInListVerifier; -extern template struct NotInListVerifier; -extern template struct NotInListVerifier; +extern template class InListVerifier; +extern template class InListVerifier; +extern template class InListVerifier; +extern template class InListVerifier; +extern template class NotInListVerifier; +extern template class NotInListVerifier; +extern template class NotInListVerifier; +extern template class NotInListVerifier; -extern template struct InRangeVerifier; -extern template struct InRangeVerifier; -extern template struct NotInRangeVerifier; -extern template struct NotInRangeVerifier; +extern template class InRangeVerifier; +extern template class InRangeVerifier; +extern template class NotInRangeVerifier; +extern template class NotInRangeVerifier; -extern template struct AnnotationVerifier; -extern template struct AnnotationVerifier; -extern template struct AnnotationVerifier; -extern template struct AnnotationVerifier; -extern template struct AnnotationVerifier; -extern template struct AnnotationVerifier; -extern template struct AnnotationVerifier; -extern template struct AnnotationVerifier; -extern template struct AnnotationVerifier; -extern template struct AnnotationVerifier; -extern template struct AnnotationVerifier; - -extern template struct DeprecatedVerifier; -extern template struct DeprecatedVerifier; -extern template struct DeprecatedVerifier; -extern template struct DeprecatedVerifier; -extern template struct DeprecatedVerifier; -extern template struct DeprecatedVerifier; -extern template struct DeprecatedVerifier; -extern template struct DeprecatedVerifier; -extern template struct DeprecatedVerifier; -extern template struct DeprecatedVerifier; -extern template struct DeprecatedVerifier; +extern template class AnnotationVerifier; +extern template class AnnotationVerifier; +extern template class AnnotationVerifier; +extern template class AnnotationVerifier; +extern template class AnnotationVerifier; +extern template class AnnotationVerifier; +extern template class AnnotationVerifier; +extern template class AnnotationVerifier; +extern template class AnnotationVerifier; +extern template class AnnotationVerifier; +extern template class AnnotationVerifier; } // namespace openspace::documentation diff --git a/include/openspace/documentation/verifier.inl b/include/openspace/documentation/verifier.inl index 4fc3cc9671..298ca7f1fd 100644 --- a/include/openspace/documentation/verifier.inl +++ b/include/openspace/documentation/verifier.inl @@ -30,384 +30,6 @@ #include #include -template <> -struct std::less { - bool operator()(const glm::vec2& a, const glm::vec2& b) const { - return a.x < b.x && a.x < b.y; - } -}; - -template <> -struct std::less { - bool operator()(const glm::vec3& a, const glm::vec3& b) const { - return a.x < b.x && a.x < b.y && a.z < b.z; - } -}; - -template <> -struct std::less { - bool operator()(const glm::vec4& a, const glm::vec4& b) const { - return a.x < b.x && a.x < b.y && a.z < b.z && a.w < b.w; - } -}; - -template <> -struct std::less { - bool operator()(const glm::ivec2& a, const glm::ivec2& b) const { - return a.x < b.x && a.x < b.y; - } -}; - -template <> -struct std::less { - bool operator()(const glm::ivec3& a, const glm::ivec3& b) const { - return a.x < b.x && a.x < b.y && a.z < b.z; - } -}; - -template <> -struct std::less { - bool operator()(const glm::ivec4& a, const glm::ivec4& b) const { - return a.x < b.x && a.x < b.y && a.z < b.z && a.w < b.w; - } -}; - -template <> -struct std::less { - bool operator()(const glm::dvec2& a, const glm::dvec2& b) const { - return a.x < b.x && a.x < b.y; - } -}; - -template <> -struct std::less { - bool operator()(const glm::dvec3& a, const glm::dvec3& b) const { - return a.x < b.x && a.x < b.y && a.z < b.z; - } -}; - -template <> -struct std::less { - bool operator()(const glm::dvec4& a, const glm::dvec4& b) const { - return a.x < b.x && a.x < b.y && a.z < b.z && a.w < b.w; - } -}; - -template <> -struct std::less_equal { - bool operator()(const glm::vec2& a, const glm::vec2& b) const { - return a.x <= b.x && a.x <= b.y; - } -}; - -template <> -struct std::less_equal { - bool operator()(const glm::vec3& a, const glm::vec3& b) const { - return a.x <= b.x && a.x <= b.y && a.z <= b.z; - } -}; - -template <> -struct std::less_equal { - bool operator()(const glm::vec4& a, const glm::vec4& b) const { - return a.x <= b.x && a.x <= b.y && a.z <= b.z && a.w <= b.w; - } -}; - -template <> -struct std::less_equal { - bool operator()(const glm::ivec2& a, const glm::ivec2& b) const { - return a.x <= b.x && a.x <= b.y; - } -}; - -template <> -struct std::less_equal { - bool operator()(const glm::ivec3& a, const glm::ivec3& b) const { - return a.x <= b.x && a.x <= b.y && a.z <= b.z; - } -}; - -template <> -struct std::less_equal { - bool operator()(const glm::ivec4& a, const glm::ivec4& b) const { - return a.x <= b.x && a.x <= b.y && a.z <= b.z && a.w <= b.w; - } -}; - -template <> -struct std::less_equal { - bool operator()(const glm::dvec2& a, const glm::dvec2& b) const { - return a.x <= b.x && a.x <= b.y; - } -}; - -template <> -struct std::less_equal { - bool operator()(const glm::dvec3& a, const glm::dvec3& b) const { - return a.x <= b.x && a.x <= b.y && a.z <= b.z; - } -}; - -template <> -struct std::less_equal { - bool operator()(const glm::dvec4& a, const glm::dvec4& b) const { - return a.x <= b.x && a.x <= b.y && a.z <= b.z && a.w <= b.w; - } -}; - -template <> -struct std::greater { - bool operator()(const glm::vec2& a, const glm::vec2& b) const { - return a.x > b.x && a.x > b.y; - } -}; - -template <> -struct std::greater { - bool operator()(const glm::vec3& a, const glm::vec3& b) const { - return a.x > b.x && a.x > b.y && a.z > b.z; - } -}; - -template <> -struct std::greater { - bool operator()(const glm::vec4& a, const glm::vec4& b) const { - return a.x > b.x && a.x > b.y && a.z > b.z && a.w > b.w; - } -}; - -template <> -struct std::greater { - bool operator()(const glm::ivec2& a, const glm::ivec2& b) const { - return a.x > b.x && a.x > b.y; - } -}; - -template <> -struct std::greater { - bool operator()(const glm::ivec3& a, const glm::ivec3& b) const { - return a.x > b.x && a.x > b.y && a.z > b.z; - } -}; - -template <> -struct std::greater { - bool operator()(const glm::ivec4& a, const glm::ivec4& b) const { - return a.x > b.x && a.x > b.y && a.z > b.z && a.w > b.w; - } -}; - -template <> -struct std::greater { - bool operator()(const glm::dvec2& a, const glm::dvec2& b) const { - return a.x > b.x && a.x > b.y; - } -}; - -template <> -struct std::greater { - bool operator()(const glm::dvec3& a, const glm::dvec3& b) const { - return a.x > b.x && a.x > b.y && a.z > b.z; - } -}; - -template <> -struct std::greater { - bool operator()(const glm::dvec4& a, const glm::dvec4& b) const { - return a.x > b.x && a.x > b.y && a.z > b.z && a.w > b.w; - } -}; - -template <> -struct std::greater_equal { - bool operator()(const glm::vec2& a, const glm::vec2& b) const { - return a.x >= b.x && a.x >= b.y; - } -}; - -template <> -struct std::greater_equal { - bool operator()(const glm::vec3& a, const glm::vec3& b) const { - return a.x >= b.x && a.x >= b.y && a.z >= b.z; - } -}; - -template <> -struct std::greater_equal { - bool operator()(const glm::vec4& a, const glm::vec4& b) const { - return a.x >= b.x && a.x >= b.y && a.z >= b.z && a.w >= b.w; - } -}; - -template <> -struct std::greater_equal { - bool operator()(const glm::ivec2& a, const glm::ivec2& b) const { - return a.x >= b.x && a.x >= b.y; - } -}; - -template <> -struct std::greater_equal { - bool operator()(const glm::ivec3& a, const glm::ivec3& b) const { - return a.x >= b.x && a.x >= b.y && a.z >= b.z; - } -}; - -template <> -struct std::greater_equal { - bool operator()(const glm::ivec4& a, const glm::ivec4& b) const { - return a.x >= b.x && a.x >= b.y && a.z >= b.z && a.w >= b.w; - } -}; - -template <> -struct std::greater_equal { - bool operator()(const glm::dvec2& a, const glm::dvec2& b) const { - return a.x >= b.x && a.x >= b.y; - } -}; - -template <> -struct std::greater_equal { - bool operator()(const glm::dvec3& a, const glm::dvec3& b) const { - return a.x >= b.x && a.x >= b.y && a.z >= b.z; - } -}; - -template <> -struct std::greater_equal { - bool operator()(const glm::dvec4& a, const glm::dvec4& b) const { - return a.x >= b.x && a.x >= b.y && a.z >= b.z && a.w >= b.w; - } -}; - -template <> -struct std::equal_to { - bool operator()(const glm::vec2& a, const glm::vec2& b) const { - return a.x == b.x && a.x == b.y; - } -}; - -template <> -struct std::equal_to { - bool operator()(const glm::vec3& a, const glm::vec3& b) const { - return a.x == b.x && a.x == b.y && a.z == b.z; - } -}; - -template <> -struct std::equal_to { - bool operator()(const glm::vec4& a, const glm::vec4& b) const { - return a.x == b.x && a.x == b.y && a.z == b.z && a.w == b.w; - } -}; - -template <> -struct std::equal_to { - bool operator()(const glm::ivec2& a, const glm::ivec2& b) const { - return a.x == b.x && a.x == b.y; - } -}; - -template <> -struct std::equal_to { - bool operator()(const glm::ivec3& a, const glm::ivec3& b) const { - return a.x == b.x && a.x == b.y && a.z == b.z; - } -}; - -template <> -struct std::equal_to { - bool operator()(const glm::ivec4& a, const glm::ivec4& b) const { - return a.x == b.x && a.x == b.y && a.z == b.z && a.w == b.w; - } -}; - -template <> -struct std::equal_to { - bool operator()(const glm::dvec2& a, const glm::dvec2& b) const { - return a.x == b.x && a.x == b.y; - } -}; - -template <> -struct std::equal_to { - bool operator()(const glm::dvec3& a, const glm::dvec3& b) const { - return a.x == b.x && a.x == b.y && a.z == b.z; - } -}; - -template <> -struct std::equal_to { - bool operator()(const glm::dvec4& a, const glm::dvec4& b) const { - return a.x == b.x && a.x == b.y && a.z == b.z && a.w == b.w; - } -}; - -template <> -struct std::not_equal_to { - bool operator()(const glm::vec2& a, const glm::vec2& b) const { - return a.x != b.x && a.x != b.y; - } -}; - -template <> -struct std::not_equal_to { - bool operator()(const glm::vec3& a, const glm::vec3& b) const { - return a.x != b.x && a.x != b.y && a.z != b.z; - } -}; - -template <> -struct std::not_equal_to { - bool operator()(const glm::vec4& a, const glm::vec4& b) const { - return a.x != b.x && a.x != b.y && a.z != b.z && a.w != b.w; - } -}; - -template <> -struct std::not_equal_to { - bool operator()(const glm::ivec2& a, const glm::ivec2& b) const { - return a.x != b.x && a.x != b.y; - } -}; - -template <> -struct std::not_equal_to { - bool operator()(const glm::ivec3& a, const glm::ivec3& b) const { - return a.x != b.x && a.x != b.y && a.z != b.z; - } -}; - -template <> -struct std::not_equal_to { - bool operator()(const glm::ivec4& a, const glm::ivec4& b) const { - return a.x != b.x && a.x != b.y && a.z != b.z && a.w != b.w; - } -}; - -template <> -struct std::not_equal_to { - bool operator()(const glm::dvec2& a, const glm::dvec2& b) const { - return a.x != b.x && a.x != b.y; - } -}; - -template <> -struct std::not_equal_to { - bool operator()(const glm::dvec3& a, const glm::dvec3& b) const { - return a.x != b.x && a.x != b.y && a.z != b.z; - } -}; - -template <> -struct std::not_equal_to { - bool operator()(const glm::dvec4& a, const glm::dvec4& b) const { - return a.x != b.x && a.x != b.y && a.z != b.z && a.w != b.w; - } -}; - namespace openspace::documentation { template <> @@ -1073,21 +695,4 @@ std::string AnnotationVerifier::documentation() const { return annotation; } -template -TestResult DeprecatedVerifier::operator()(const ghoul::Dictionary& dict, - const std::string& key) const -{ - TestResult res = T::operator()(dict, key); - TestResult::Warning w; - w.offender = key; - w.reason = TestResult::Warning::Reason::Deprecated; - res.warnings.push_back(w); - return res; -} - -template -std::string DeprecatedVerifier::documentation() const { - return T::documentation() + " (deprecated)"; -} - } // namespace openspace::documentation diff --git a/modules/base/dashboard/dashboarditemangle.cpp b/modules/base/dashboard/dashboarditemangle.cpp index 12217ef19d..83b1b493c5 100644 --- a/modules/base/dashboard/dashboarditemangle.cpp +++ b/modules/base/dashboard/dashboarditemangle.cpp @@ -104,6 +104,9 @@ namespace { openspace::properties::Property::Visibility::User }; + // This DashboardItem shows the angle between two scenegraph nodes relative to a + // reference node. The angle is calculated in the plane that is defined by the + // 'SourceNodeName', 'DestinationNodeName', and the 'ReferenceNodeName'. struct [[codegen::Dictionary(DashboardItemAngle)]] Parameters { enum class [[codegen::map(Type)]] Type { Node, diff --git a/modules/globebrowsing/src/layermanager.cpp b/modules/globebrowsing/src/layermanager.cpp index df3ce27a73..fd56646c63 100644 --- a/modules/globebrowsing/src/layermanager.cpp +++ b/modules/globebrowsing/src/layermanager.cpp @@ -40,6 +40,7 @@ documentation::Documentation LayerManager::Documentation() { return { "LayerManager", "globebrowsing_layermanager", + "", { { "*", diff --git a/modules/server/src/serverinterface.cpp b/modules/server/src/serverinterface.cpp index 88bd9cd3cb..048adb7283 100644 --- a/modules/server/src/serverinterface.cpp +++ b/modules/server/src/serverinterface.cpp @@ -171,9 +171,9 @@ ServerInterface::ServerInterface(const ghoul::Dictionary& config) readList(DenyAddressesInfo.identifier, _denyAddresses); readList(RequirePasswordAddressesInfo.identifier, _requirePasswordAddresses); - this->setIdentifier(identifier); - this->setGuiName(identifier); - this->setDescription("Settings for server interface " + identifier); + setIdentifier(identifier); + setGuiName(identifier); + setDescription("Settings for server interface " + identifier); const std::string type = config.value(TypeInfo.identifier); if (type == TcpSocketType) { diff --git a/modules/spout/renderablespherespout.cpp b/modules/spout/renderablespherespout.cpp index 9aaf5cffc2..d68cf9b2ab 100644 --- a/modules/spout/renderablespherespout.cpp +++ b/modules/spout/renderablespherespout.cpp @@ -38,6 +38,7 @@ documentation::Documentation RenderableSphereSpout::Documentation() { return { "Renderable Sphere Spout", "spout_sphere_spout", + "", { { "Name", diff --git a/modules/volume/transferfunctionhandler.cpp b/modules/volume/transferfunctionhandler.cpp index c6968542cb..405a670c77 100644 --- a/modules/volume/transferfunctionhandler.cpp +++ b/modules/volume/transferfunctionhandler.cpp @@ -90,7 +90,7 @@ void TransferFunctionHandler::initialize() { addProperty(_maxValue); addProperty(_saveTransferFunction); - this->addTag("TF"); + addTag("TF"); _texture = std::make_shared( glm::uvec3(1024, 1, 1), GL_TEXTURE_1D, diff --git a/src/documentation/documentation.cpp b/src/documentation/documentation.cpp index 794d00ddfb..9918bb4044 100644 --- a/src/documentation/documentation.cpp +++ b/src/documentation/documentation.cpp @@ -189,20 +189,6 @@ DocumentationEntry::DocumentationEntry(std::string k, Verifier* v, Optional opt, std::move(doc)) {} -Documentation::Documentation(std::string n, std::string i, DocumentationEntries ents) - : name(std::move(n)) - , id(std::move(i)) - , entries(std::move(ents)) -{} - -Documentation::Documentation(std::string n, DocumentationEntries ents) - : Documentation(std::move(n), "", std::move(ents)) -{} - -Documentation::Documentation(DocumentationEntries ents) - : Documentation("", "", std::move(ents)) -{} - TestResult testSpecification(const Documentation& documentation, const ghoul::Dictionary& dictionary) { diff --git a/src/documentation/documentationengine.cpp b/src/documentation/documentationengine.cpp index 6096c5007d..1a0f2f0c8d 100644 --- a/src/documentation/documentationengine.cpp +++ b/src/documentation/documentationengine.cpp @@ -77,6 +77,7 @@ nlohmann::json generateJsonDocumentation(const Documentation& d) { json["name"] = d.name; json["id"] = d.id; + json["description"] = d.description; json["properties"] = nlohmann::json::array(); for (const DocumentationEntry& p : d.entries) { @@ -110,7 +111,8 @@ nlohmann::json generateJsonDocumentation(const Documentation& d) { } } else if (tv) { - nlohmann::json restrictions = generateJsonDocumentation(tv->documentations); + Documentation doc = { .entries = tv->documentations }; + nlohmann::json restrictions = generateJsonDocumentation(doc); // We have a TableVerifier, so we need to recurse entry["restrictions"] = restrictions; } diff --git a/src/documentation/verifier.cpp b/src/documentation/verifier.cpp index 4c26f3a181..30536b6cdd 100644 --- a/src/documentation/verifier.cpp +++ b/src/documentation/verifier.cpp @@ -119,21 +119,6 @@ template struct AnnotationVerifier; template struct AnnotationVerifier; template struct AnnotationVerifier; -template struct DeprecatedVerifier; -template struct DeprecatedVerifier; -template struct DeprecatedVerifier; -template struct DeprecatedVerifier; -template struct DeprecatedVerifier; -//template struct DeprecatedVerifier; -template struct DeprecatedVerifier; -template struct DeprecatedVerifier; -//template struct DeprecatedVerifier; -template struct DeprecatedVerifier; -template struct DeprecatedVerifier; -//template struct DeprecatedVerifier; -template struct DeprecatedVerifier; -template struct DeprecatedVerifier; - std::string BoolVerifier::type() const { return "Boolean"; } @@ -143,7 +128,7 @@ std::string DoubleVerifier::type() const { } TestResult IntVerifier::operator()(const ghoul::Dictionary& dict, - const std::string & key) const + const std::string& key) const { if (dict.hasValue(key)) { // We have a key and the value is int, we are done @@ -201,8 +186,7 @@ std::string IntVerifier::type() const { } StringVerifier::StringVerifier(bool mustBeNotEmpty) - : TemplateVerifier() - , _mustBeNotEmpty(mustBeNotEmpty) + : _mustBeNotEmpty(mustBeNotEmpty) {} TestResult StringVerifier::operator()(const ghoul::Dictionary& dictionary, @@ -612,16 +596,17 @@ TestResult TableVerifier::operator()(const ghoul::Dictionary& dictionary, { if (dictionary.hasValue(key)) { ghoul::Dictionary d = dictionary.value(key); - TestResult res = testSpecification({documentations}, d); + Documentation doc = { .entries = documentations }; + TestResult res = testSpecification(doc, d); // Add the 'key' as a prefix to make the new offender a fully qualified identifer for (TestResult::Offense& s : res.offenses) { - s.offender = key + "." + s.offender; + s.offender = fmt::format("{}.{}", key, s.offender); } // Add the 'key' as a prefix to make the new warning a fully qualified identifer for (TestResult::Warning& w : res.warnings) { - w.offender = key + "." + w.offender; + w.offender = fmt::format("{}.{}", key, w.offender); } return res; @@ -700,22 +685,17 @@ TestResult ReferencingVerifier::operator()(const ghoul::Dictionary& dictionary, return res; } - //ghoul_assert( - // it != docs.end(), - // "Did not find referencing identifier '" + identifier + "'" - //); - ghoul::Dictionary d = dictionary.value(key); TestResult r = testSpecification(*it, d); // Add the 'key' as a prefix to make the offender a fully qualified identifer for (TestResult::Offense& s : r.offenses) { - s.offender = key + "." + s.offender; + s.offender = fmt::format("{}.{}", key, s.offender); } // Add the 'key' as a prefix to make the warning a fully qualified identifer for (TestResult::Warning& w : r.warnings) { - w.offender = key + "." + w.offender; + w.offender = fmt::format("{}.{}", key, w.offender); } return r; @@ -729,86 +709,16 @@ std::string ReferencingVerifier::documentation() const { return "Referencing Documentation: '" + identifier + "'"; } -AndVerifier::AndVerifier(const std::vector values_) { - ghoul_assert(!values_.empty(), "values must not be empty"); - for (Verifier* v : values_) { - this->values.push_back(std::shared_ptr(v)); - } -} - -TestResult AndVerifier::operator()(const ghoul::Dictionary& dictionary, - const std::string& key) const -{ - std::vector res(values.size()); - std::transform( - values.cbegin(), - values.cend(), - res.begin(), - [dictionary, key](const std::shared_ptr& v) { - return v->operator()(dictionary, key); - } - ); - - const bool success = std::all_of( - res.cbegin(), - res.cend(), - std::mem_fn(&TestResult::success) - ); - - if (success) { - TestResult r; - r.success = true; - return r; - } - else { - TestResult r; - r.success = false; - TestResult::Offense o; - o.offender = key; - o.reason = TestResult::Offense::Reason::Verification; - r.offenses.push_back(o); - return r; - } -} - -std::string AndVerifier::type() const { - // Dirty hack to get an "and " inserted before the last element - std::vector types(values.size() - 1); - std::transform( - values.cbegin(), - values.cend() - 1, - types.begin(), - std::mem_fn(&Verifier::type) - ); - types.push_back(std::string("and ") + values.back()->type()); - - return ghoul::join(types, ", "); -} - -std::string AndVerifier::documentation() const { - // Dirty hack to get an "and " inserted before the last element - std::vector documentations(values.size() - 1); - std::transform( - values.cbegin(), - values.cend() - 1, - documentations.begin(), - std::mem_fn(&Verifier::documentation) - ); - documentations.push_back(std::string("and ") + values.back()->documentation()); - - return ghoul::join(documentations, ", "); -} - OrVerifier::OrVerifier( const std::vector>> values_) { ghoul_assert(!values_.empty(), "values must not be empty"); for (const std::variant>& v : values_) { if (std::holds_alternative(v)) { - this->values.push_back(std::shared_ptr(std::get(v))); + values.push_back(std::shared_ptr(std::get(v))); } else { - this->values.push_back(std::get>(v)); + values.push_back(std::get>(v)); } } } @@ -857,7 +767,7 @@ std::string OrVerifier::type() const { types.begin(), std::mem_fn(&Verifier::type) ); - types.push_back(std::string("or ") + values.back()->type()); + types.push_back(fmt::format("or {}", values.back()->type())); return ghoul::join(types, ", "); } @@ -871,7 +781,7 @@ std::string OrVerifier::documentation() const { documentations.begin(), std::mem_fn(&Verifier::documentation) ); - documentations.push_back(std::string("or ") + values.back()->documentation()); + documentations.push_back(fmt::format("or {}", values.back()->documentation())); return ghoul::join(documentations, ", "); } diff --git a/src/interaction/tasks/convertrecfileversiontask.cpp b/src/interaction/tasks/convertrecfileversiontask.cpp index 6f700fc6dd..717f4d8053 100644 --- a/src/interaction/tasks/convertrecfileversiontask.cpp +++ b/src/interaction/tasks/convertrecfileversiontask.cpp @@ -103,6 +103,7 @@ documentation::Documentation ConvertRecFileVersionTask::documentation() { return { "ConvertRecFileVersionTask", "convert_file_version_task", + "", { { "InputFilePath", diff --git a/src/interaction/tasks/convertrecformattask.cpp b/src/interaction/tasks/convertrecformattask.cpp index 52bc0bda3a..3e4f998483 100644 --- a/src/interaction/tasks/convertrecformattask.cpp +++ b/src/interaction/tasks/convertrecformattask.cpp @@ -314,6 +314,7 @@ documentation::Documentation ConvertRecFormatTask::documentation() { return { "ConvertRecFormatTask", "convert_format_task", + "", { { "InputFilePath", diff --git a/src/util/factorymanager.cpp b/src/util/factorymanager.cpp index 5a5c3d006a..755b1e3efa 100644 --- a/src/util/factorymanager.cpp +++ b/src/util/factorymanager.cpp @@ -47,6 +47,7 @@ nlohmann::json generateJsonDocumentation(const Documentation& d) { json["name"] = d.name; json["identifier"] = d.id; + json["description"] = d.description; json["members"] = nlohmann::json::array(); for (const DocumentationEntry& p : d.entries) { @@ -80,7 +81,8 @@ nlohmann::json generateJsonDocumentation(const Documentation& d) { } } else if (tv) { - nlohmann::json restrictions = generateJsonDocumentation(tv->documentations); + Documentation doc = { .entries = tv->documentations }; + nlohmann::json restrictions = generateJsonDocumentation(doc); // We have a TableVerifier, so we need to recurse entry["restrictions"] = restrictions; } diff --git a/support/coding/codegen b/support/coding/codegen index abe1b74019..b38743ad76 160000 --- a/support/coding/codegen +++ b/support/coding/codegen @@ -1 +1 @@ -Subproject commit abe1b74019f332c1e5a62774776bf11d42cf8f85 +Subproject commit b38743ad76edb7affe7db8e77445450b15face72 diff --git a/tests/test_documentation.cpp b/tests/test_documentation.cpp index bae134b1b9..debd5ed418 100644 --- a/tests/test_documentation.cpp +++ b/tests/test_documentation.cpp @@ -277,8 +277,8 @@ TEST_CASE("Documentation: Constructor", "[documentation]") { TEST_CASE("Documentation: Initializer Constructor", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - { + Documentation doc = { + .entries = { // Basic Verifiers {"BoolVerifier", new BoolVerifier, Optional::No }, {"DoubleVerifier", new DoubleVerifier, Optional::No }, @@ -344,8 +344,10 @@ TEST_CASE("Documentation: Initializer Constructor", "[documentation]") { TEST_CASE("Documentation: BoolVerifier", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Bool", new BoolVerifier, Optional::No }} + Documentation doc = { + .entries = { + { "Bool", new BoolVerifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -376,8 +378,10 @@ TEST_CASE("Documentation: BoolVerifier", "[documentation]") { TEST_CASE("Documentation: DoubleVerifier", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Double", new DoubleVerifier, Optional::No }} + Documentation doc = { + .entries = { + { "Double", new DoubleVerifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -407,8 +411,10 @@ TEST_CASE("Documentation: DoubleVerifier", "[documentation]") { TEST_CASE("Documentation: IntVerifier", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Int", new IntVerifier, Optional::No }} + Documentation doc = { + .entries = { + { "Int", new IntVerifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -444,8 +450,10 @@ TEST_CASE("Documentation: StringVerifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - {{ "String", new StringVerifier, Optional::No }} + Documentation doc = { + .entries = { + { "String", new StringVerifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -475,8 +483,10 @@ TEST_CASE("Documentation: IdentifierVerifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc{ - {{ "Identifier", new IdentifierVerifier, Optional::No }} + Documentation doc = { + .entries = { + { "Identifier", new IdentifierVerifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -538,8 +548,10 @@ TEST_CASE("Documentation: FileVerifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - {{ "File", new FileVerifier, Optional::No }} + Documentation doc = { + .entries = { + { "File", new FileVerifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -577,8 +589,10 @@ TEST_CASE("Documentation: DirectoryVerifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc{ - {{ "Dir", new DirectoryVerifier, Optional::No }} + Documentation doc = { + .entries = { + { "Dir", new DirectoryVerifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -616,8 +630,10 @@ TEST_CASE("Documentation: DateTimeVerifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc{ - {{ "DateTime", new DateTimeVerifier, Optional::No }} + Documentation doc = { + .entries = { + { "DateTime", new DateTimeVerifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -654,8 +670,10 @@ TEST_CASE("Documentation: DateTimeVerifier", "[documentation]") { TEST_CASE("Documentation: TableVerifierType", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Table", new TableVerifier, Optional::No }} + Documentation doc = { + .entries = { + { "Table", new TableVerifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -685,8 +703,10 @@ TEST_CASE("Documentation: StringListVerifierType", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - { { "StringList", new StringListVerifier, Optional::No } } + Documentation doc = { + .entries = { + { "StringList", new StringListVerifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -737,8 +757,10 @@ TEST_CASE("Documentation: IntListVerifierType", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - { { "IntList", new IntListVerifier, Optional::No } } + Documentation doc = { + .entries = { + { "IntList", new IntListVerifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -788,8 +810,8 @@ TEST_CASE("Documentation: MixedVerifiers", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - { + Documentation doc = { + .entries = { { "Bool", new BoolVerifier, Optional::No }, { "Double", new DoubleVerifier, Optional::No }, { "Int", new IntVerifier, Optional::No }, @@ -839,8 +861,8 @@ TEST_CASE("Documentation: NestedTables", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - { + Documentation doc = { + .entries = { { "Outer_Int", new IntVerifier, Optional::No }, { "Outer_Table", new TableVerifier({ { "Inner_Double", new DoubleVerifier, Optional::No }, @@ -1018,8 +1040,8 @@ TEST_CASE("Documentation: NestedTables", "[documentation]") { TEST_CASE("Documentation: Optional", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - { + Documentation doc = { + .entries = { { "Bool_Force", new BoolVerifier, Optional::No }, { "Bool_Optional", new BoolVerifier, Optional::Yes } } @@ -1066,23 +1088,25 @@ TEST_CASE("Documentation: Optional", "[documentation]") { TEST_CASE("Documentation: Required In Optional", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ - "a", - new TableVerifier({ - { - "b", - new IntVerifier, - Optional::No - }, - { - "c", - new IntVerifier, - Optional::Yes - } - }), - Optional::Yes - }} + Documentation doc = { + .entries = { + { + "a", + new TableVerifier({ + { + "b", + new IntVerifier, + Optional::No + }, + { + "c", + new IntVerifier, + Optional::Yes + } + }), + Optional::Yes + } + } }; ghoul::Dictionary positive; @@ -1127,8 +1151,10 @@ TEST_CASE("Documentation: Required In Optional", "[documentation]") { TEST_CASE("Documentation: Exhaustive", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Int", new IntVerifier, Optional::No }} + Documentation doc = { + .entries = { + { "Int", new IntVerifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -1157,11 +1183,14 @@ TEST_CASE("Documentation: Exhaustive", "[documentation]") { TEST_CASE("Documentation: Nested Exhaustive", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Table", new TableVerifier( - { { "a", new IntVerifier, Optional::No } } - ), Optional::No - }} + Documentation doc = { + .entries = { + { + "Table", + new TableVerifier({ { "a", new IntVerifier, Optional::No } }), + Optional::No + } + } }; ghoul::Dictionary positive; @@ -1207,12 +1236,10 @@ TEST_CASE("Documentation: Empty Entries Non Exhaustive", "[documentation]") { TEST_CASE("Documentation: Empty Nested Exhaustive", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ - "Table", - new TableVerifier(), - Optional::No, - }} + Documentation doc = { + .entries = { + { "Table", new TableVerifier(), Optional::No } + } }; ghoul::Dictionary positive; @@ -1235,8 +1262,10 @@ TEST_CASE("Documentation: Empty Nested Exhaustive", "[documentation]") { TEST_CASE("Documentation: Less Int", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Int", new IntLessVerifier(5), Optional::No }} + Documentation doc = { + .entries = { + { "Int", new IntLessVerifier(5), Optional::No } + } }; ghoul::Dictionary positive; @@ -1257,8 +1286,8 @@ TEST_CASE("Documentation: Less Int", "[documentation]") { TEST_CASE("Documentation: Less Double", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Double", new DoubleLessVerifier(5.0), Optional::No }} + Documentation doc = { + .entries = { { "Double", new DoubleLessVerifier(5.0), Optional::No } } }; ghoul::Dictionary positive; @@ -1279,8 +1308,8 @@ TEST_CASE("Documentation: Less Double", "[documentation]") { TEST_CASE("Documentation: LessEqual Int", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Int", new IntLessEqualVerifier(5), Optional::No }} + Documentation doc = { + .entries = { { "Int", new IntLessEqualVerifier(5), Optional::No } } }; ghoul::Dictionary positive; @@ -1307,8 +1336,8 @@ TEST_CASE("Documentation: LessEqual Int", "[documentation]") { TEST_CASE("Documentation: LessEqual Double", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Double", new DoubleLessEqualVerifier(5.0), Optional::No }} + Documentation doc = { + .entries = { { "Double", new DoubleLessEqualVerifier(5.0), Optional::No } } }; ghoul::Dictionary positive; @@ -1335,8 +1364,8 @@ TEST_CASE("Documentation: LessEqual Double", "[documentation]") { TEST_CASE("Documentation: Greater Int", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Int", new IntGreaterVerifier(5), Optional::No }} + Documentation doc = { + .entries = { { "Int", new IntGreaterVerifier(5), Optional::No } } }; ghoul::Dictionary positive; @@ -1357,8 +1386,8 @@ TEST_CASE("Documentation: Greater Int", "[documentation]") { TEST_CASE("Documentation: Greater Double", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Double", new DoubleGreaterVerifier(5.0), Optional::No }} + Documentation doc = { + .entries = { { "Double", new DoubleGreaterVerifier(5.0), Optional::No } } }; ghoul::Dictionary positive; @@ -1379,8 +1408,8 @@ TEST_CASE("Documentation: Greater Double", "[documentation]") { TEST_CASE("Documentation: GreaterEqual Int", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Int", new IntGreaterEqualVerifier(5), Optional::No }} + Documentation doc = { + .entries = { { "Int", new IntGreaterEqualVerifier(5), Optional::No } } }; ghoul::Dictionary positive; @@ -1407,8 +1436,8 @@ TEST_CASE("Documentation: GreaterEqual Int", "[documentation]") { TEST_CASE("Documentation: GreaterEqual Double", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Double", new DoubleGreaterEqualVerifier(5.0), Optional::No }} + Documentation doc = { + .entries = { { "Double", new DoubleGreaterEqualVerifier(5.0), Optional::No } } }; ghoul::Dictionary positive; @@ -1435,8 +1464,8 @@ TEST_CASE("Documentation: GreaterEqual Double", "[documentation]") { TEST_CASE("Documentation: Equal Bool", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Bool", new BoolEqualVerifier(true), Optional::No }} + Documentation doc = { + .entries = { { "Bool", new BoolEqualVerifier(true), Optional::No } } }; ghoul::Dictionary positive; @@ -1457,8 +1486,8 @@ TEST_CASE("Documentation: Equal Bool", "[documentation]") { TEST_CASE("Documentation: Equal Int", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Int", new IntEqualVerifier(1), Optional::No }} + Documentation doc = { + .entries = { { "Int", new IntEqualVerifier(1), Optional::No } } }; ghoul::Dictionary positive; @@ -1479,8 +1508,8 @@ TEST_CASE("Documentation: Equal Int", "[documentation]") { TEST_CASE("Documentation: Equal Double", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Double", new DoubleEqualVerifier(1.0), Optional::No }} + Documentation doc = { + .entries = { { "Double", new DoubleEqualVerifier(1.0), Optional::No } } }; ghoul::Dictionary positive; @@ -1502,8 +1531,8 @@ TEST_CASE("Documentation: Equal String", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - {{ "String", new StringEqualVerifier("string"s), Optional::No }} + Documentation doc = { + .entries = { { "String", new StringEqualVerifier("string"s), Optional::No } } }; ghoul::Dictionary positive; @@ -1524,8 +1553,8 @@ TEST_CASE("Documentation: Equal String", "[documentation]") { TEST_CASE("Documentation: Unequal Bool", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Bool", new BoolUnequalVerifier(true), Optional::No }} + Documentation doc = { + .entries = { { "Bool", new BoolUnequalVerifier(true), Optional::No } } }; ghoul::Dictionary positive; @@ -1546,8 +1575,8 @@ TEST_CASE("Documentation: Unequal Bool", "[documentation]") { TEST_CASE("Documentation: Unequal Int", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Int", new IntUnequalVerifier(1), Optional::No }} + Documentation doc = { + .entries = { { "Int", new IntUnequalVerifier(1), Optional::No } } }; ghoul::Dictionary positive; @@ -1568,8 +1597,8 @@ TEST_CASE("Documentation: Unequal Int", "[documentation]") { TEST_CASE("Documentation: Unequal Double", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Double", new DoubleUnequalVerifier(1.0), Optional::No }} + Documentation doc = { + .entries = { { "Double", new DoubleUnequalVerifier(1.0), Optional::No } } }; ghoul::Dictionary positive; @@ -1591,8 +1620,8 @@ TEST_CASE("Documentation: Unequal String", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - {{ "String", new StringUnequalVerifier("string"s), Optional::No }} + Documentation doc = { + .entries = { { "String", new StringUnequalVerifier("string"s), Optional::No } } }; ghoul::Dictionary positive; @@ -1613,8 +1642,8 @@ TEST_CASE("Documentation: Unequal String", "[documentation]") { TEST_CASE("Documentation: List Bool", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Bool" , new BoolInListVerifier({ true }), Optional::No }} + Documentation doc = { + .entries = { { "Bool" , new BoolInListVerifier({ true }), Optional::No } } }; ghoul::Dictionary positive; @@ -1635,8 +1664,8 @@ TEST_CASE("Documentation: List Bool", "[documentation]") { TEST_CASE("Documentation: List Int", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Int" , new IntInListVerifier({ 0, 1, 2 }), Optional::No }} + Documentation doc = { + .entries = { { "Int" , new IntInListVerifier({ 0, 1, 2 }), Optional::No } } }; ghoul::Dictionary positive; @@ -1663,8 +1692,10 @@ TEST_CASE("Documentation: List Int", "[documentation]") { TEST_CASE("Documentation: List Double", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Double" , new DoubleInListVerifier({ 0.0, 1.0, 2.0 }), Optional::No }} + Documentation doc = { + .entries = { + { "Double" , new DoubleInListVerifier({ 0.0, 1.0, 2.0 }), Optional::No } + } }; ghoul::Dictionary positive; @@ -1692,8 +1723,10 @@ TEST_CASE("Documentation: List String", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - {{ "String" , new StringInListVerifier({ "0"s, "1"s, "2"s }), Optional::No }} + Documentation doc = { + .entries = { + { "String" , new StringInListVerifier({ "0"s, "1"s, "2"s }), Optional::No } + } }; ghoul::Dictionary positive; @@ -1720,8 +1753,8 @@ TEST_CASE("Documentation: List String", "[documentation]") { TEST_CASE("Documentation: NotList Bool", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Bool" , new BoolNotInListVerifier({ true }), Optional::No }} + Documentation doc = { + .entries = { { "Bool" , new BoolNotInListVerifier({ true }), Optional::No } } }; ghoul::Dictionary positive; @@ -1742,8 +1775,8 @@ TEST_CASE("Documentation: NotList Bool", "[documentation]") { TEST_CASE("Documentation: NotList Int", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Int" , new IntNotInListVerifier({ 0, 1, 2 }), Optional::No }} + Documentation doc = { + .entries = { { "Int" , new IntNotInListVerifier({ 0, 1, 2 }), Optional::No } } }; ghoul::Dictionary positive; @@ -1770,8 +1803,10 @@ TEST_CASE("Documentation: NotList Int", "[documentation]") { TEST_CASE("Documentation: NotList Double", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Double" , new DoubleNotInListVerifier({ 0.0, 1.0, 2.0 }), Optional::No }} + Documentation doc = { + .entries = { + { "Double" , new DoubleNotInListVerifier({ 0.0, 1.0, 2.0 }), Optional::No } + } }; ghoul::Dictionary positive; @@ -1799,8 +1834,10 @@ TEST_CASE("Documentation: NotList String", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - {{ "String" , new StringNotInListVerifier({ "0"s, "1"s, "2"s }), Optional::No }} + Documentation doc = { + .entries = { + { "String" , new StringNotInListVerifier({ "0"s, "1"s, "2"s }), Optional::No } + } }; ghoul::Dictionary positive; @@ -1827,8 +1864,8 @@ TEST_CASE("Documentation: NotList String", "[documentation]") { TEST_CASE("Documentation: Annotation Bool", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Bool", new BoolAnnotationVerifier("Bool"), Optional::No }} + Documentation doc = { + .entries = { { "Bool", new BoolAnnotationVerifier("Bool"), Optional::No } } }; ghoul::Dictionary positive; @@ -1849,8 +1886,8 @@ TEST_CASE("Documentation: Annotation Bool", "[documentation]") { TEST_CASE("Documentation: Annotation Int", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Int", new IntAnnotationVerifier("Int"), Optional::No }} + Documentation doc = { + .entries = { { "Int", new IntAnnotationVerifier("Int"), Optional::No } } }; ghoul::Dictionary positive; @@ -1871,8 +1908,8 @@ TEST_CASE("Documentation: Annotation Int", "[documentation]") { TEST_CASE("Documentation: Annotation Double", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Double", new DoubleAnnotationVerifier("Double"), Optional::No }} + Documentation doc = { + .entries = { { "Double", new DoubleAnnotationVerifier("Double"), Optional::No } } }; ghoul::Dictionary positive; @@ -1894,8 +1931,8 @@ TEST_CASE("Documentation: Annotation String", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - {{ "String", new StringAnnotationVerifier("String"), Optional::No }} + Documentation doc = { + .entries = { { "String", new StringAnnotationVerifier("String"), Optional::No } } }; ghoul::Dictionary positive; @@ -1916,8 +1953,8 @@ TEST_CASE("Documentation: Annotation String", "[documentation]") { TEST_CASE("Documentation: Annotation Table", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Table", new TableAnnotationVerifier("Table"), Optional::No }} + Documentation doc = { + .entries = { { "Table", new TableAnnotationVerifier("Table"), Optional::No } } }; ghoul::Dictionary positive; @@ -1938,8 +1975,8 @@ TEST_CASE("Documentation: Annotation Table", "[documentation]") { TEST_CASE("Documentation: InRange Int", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Int", new InRangeVerifier(0, 5), Optional::No }} + Documentation doc = { + .entries = { { "Int", new InRangeVerifier(0, 5), Optional::No } } }; ghoul::Dictionary positive; @@ -1972,8 +2009,10 @@ TEST_CASE("Documentation: InRange Int", "[documentation]") { TEST_CASE("Documentation: InRange Double", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Double", new InRangeVerifier(0.0, 5.0), Optional::No }} + Documentation doc = { + .entries = { + { "Double", new InRangeVerifier(0.0, 5.0), Optional::No } + } }; ghoul::Dictionary positive; @@ -2012,8 +2051,8 @@ TEST_CASE("Documentation: InRange Double", "[documentation]") { TEST_CASE("Documentation: NotInRange Int", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Int", new NotInRangeVerifier(0, 5), Optional::No }} + Documentation doc = { + .entries = { { "Int", new NotInRangeVerifier(0, 5), Optional::No } } }; ghoul::Dictionary positive; @@ -2056,8 +2095,10 @@ TEST_CASE("Documentation: NotInRange Int", "[documentation]") { TEST_CASE("Documentation: NotInRange Double", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ "Double", new NotInRangeVerifier(0.0, 5.0), Optional::No }} + Documentation doc = { + .entries = { + { "Double", new NotInRangeVerifier(0.0, 5.0), Optional::No } + } }; ghoul::Dictionary positive; @@ -2100,8 +2141,8 @@ TEST_CASE("Documentation: NotInRange Double", "[documentation]") { TEST_CASE("Documentation: Wildcard", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - {{ DocumentationEntry::Wildcard, new IntVerifier, Optional::No }} + Documentation doc = { + .entries = { { DocumentationEntry::Wildcard, new IntVerifier, Optional::No } } }; ghoul::Dictionary positive; @@ -2152,9 +2193,9 @@ TEST_CASE("Documentation: Wildcard", "[documentation]") { TEST_CASE("Documentation: Wildcard Mixed", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - { - { DocumentationEntry::Wildcard, new IntVerifier, Optional::No}, + Documentation doc = { + .entries = { + { DocumentationEntry::Wildcard, new IntVerifier, Optional::No }, { "b", new IntGreaterVerifier(5), Optional::No } } }; @@ -2221,9 +2262,10 @@ TEST_CASE("Documentation: Wildcard Mixed", "[documentation]") { TEST_CASE("Documentation: Referencing", "[documentation]") { using namespace openspace::documentation; - Documentation referenced { + Documentation referenced = { "Referenced Name", "referenced_id", + "", { { "a", new IntVerifier, Optional::No }, { "b", new DoubleVerifier, Optional::No } @@ -2231,9 +2273,11 @@ TEST_CASE("Documentation: Referencing", "[documentation]") { }; DocEng.addDocumentation(referenced); - Documentation doc {{ - { "Table", new ReferencingVerifier("referenced_id"), Optional::No } - }}; + Documentation doc = { + .entries = { + { "Table", new ReferencingVerifier("referenced_id"), Optional::No } + } + }; ghoul::Dictionary positive; { @@ -2268,9 +2312,11 @@ TEST_CASE("Documentation: Referencing", "[documentation]") { CHECK(negativeRes.offenses[0].reason == TestResult::Offense::Reason::WrongType); - Documentation wrongDoc {{ - { "Table", new ReferencingVerifier("WRONG"), Optional::No } - } }; + Documentation wrongDoc = { + .entries = { + { "Table", new ReferencingVerifier("WRONG"), Optional::No } + } + }; ghoul::Dictionary wrongNegative; { ghoul::Dictionary inner; @@ -2287,50 +2333,14 @@ TEST_CASE("Documentation: Referencing", "[documentation]") { ); } -TEST_CASE("Documentation: AndOperator", "[documentation]") { - using namespace openspace::documentation; - - Documentation doc { - { - { - "a", - new AndVerifier({ - new IntGreaterEqualVerifier(2), new IntLessEqualVerifier(5) - }), - Optional::No - } - } - }; - - ghoul::Dictionary positive; - positive.setValue("a", 4.0); - TestResult positiveRes = testSpecification(doc, positive); - CHECK(positiveRes.success); - CHECK(positiveRes.offenses.empty()); - - ghoul::Dictionary negative; - negative.setValue("a", 0.0); - TestResult negativeRes = testSpecification(doc, negative); - CHECK_FALSE(negativeRes.success); - REQUIRE(negativeRes.offenses.size() == 1); - CHECK(negativeRes.offenses[0].offender == "a"); - CHECK(negativeRes.offenses[0].reason == TestResult::Offense::Reason::Verification); - - ghoul::Dictionary negative2; - negative2.setValue("a", 8.0); - negativeRes = testSpecification(doc, negative2); - CHECK_FALSE(negativeRes.success); - REQUIRE(negativeRes.offenses.size() == 1); - CHECK(negativeRes.offenses[0].offender == "a"); - CHECK(negativeRes.offenses[0].reason == TestResult::Offense::Reason::Verification); -} - TEST_CASE("Documentation: OrOperator", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - {{ "a", new OrVerifier({ new StringVerifier, new IntVerifier }), Optional::No }} + Documentation doc = { + .entries = { + { "a", new OrVerifier({ new StringVerifier, new IntVerifier }), Optional::No } + } }; ghoul::Dictionary positive; @@ -2357,8 +2367,10 @@ TEST_CASE("Documentation: OrOperator", "[documentation]") { TEST_CASE("Documentation: IntVector2Verifier", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - { { "a", new IntVector2Verifier, Optional::No } } + Documentation doc = { + .entries = { + { "a", new IntVector2Verifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -2392,8 +2404,10 @@ TEST_CASE("Documentation: IntVector2Verifier", "[documentation]") { TEST_CASE("Documentation: DoubleVector2Verifier", "[documentation]") { using namespace openspace::documentation; - Documentation doc { - { { "a", new DoubleVector2Verifier, Optional::No } } + Documentation doc = { + .entries = { + { "a", new DoubleVector2Verifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -2428,8 +2442,10 @@ TEST_CASE("Documentation: IntVector3Verifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - { { "a", new IntVector3Verifier, Optional::No } } + Documentation doc = { + .entries = { + { "a", new IntVector3Verifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -2465,8 +2481,10 @@ TEST_CASE("Documentation: DoubleVector3Verifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - { { "a", new DoubleVector3Verifier, Optional::No } } + Documentation doc = { + .entries = { + { "a", new DoubleVector3Verifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -2502,8 +2520,10 @@ TEST_CASE("Documentation: IntVector4Verifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - { { "a", new IntVector4Verifier, Optional::No } } + Documentation doc = { + .entries = { + { "a", new IntVector4Verifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -2540,8 +2560,10 @@ TEST_CASE("Documentation: DoubleVector4Verifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - { { "a", new DoubleVector4Verifier, Optional::No } } + Documentation doc = { + .entries = { + { "a", new DoubleVector4Verifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -2578,8 +2600,10 @@ TEST_CASE("Documentation: DoubleMatrix2x2Verifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - { { "a", new DoubleMatrix2x2Verifier, Optional::No } } + Documentation doc = { + .entries = { + { "a", new DoubleMatrix2x2Verifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -2615,8 +2639,10 @@ TEST_CASE("Documentation: DoubleMatrix2x3Verifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - { { "a", new DoubleMatrix2x3Verifier, Optional::No } } + Documentation doc = { + .entries = { + { "a", new DoubleMatrix2x3Verifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -2652,8 +2678,10 @@ TEST_CASE("Documentation: DoubleMatrix2x4Verifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - { { "a", new DoubleMatrix2x4Verifier, Optional::No } } + Documentation doc = { + .entries = { + { "a", new DoubleMatrix2x4Verifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -2689,8 +2717,10 @@ TEST_CASE("Documentation: DoubleMatrix3x2Verifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - { { "a", new DoubleMatrix3x2Verifier, Optional::No } } + Documentation doc = { + .entries = { + { "a", new DoubleMatrix3x2Verifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -2726,8 +2756,10 @@ TEST_CASE("Documentation: DoubleMatrix3x3Verifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - { { "a", new DoubleMatrix3x3Verifier, Optional::No } } + Documentation doc = { + .entries = { + { "a", new DoubleMatrix3x3Verifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -2763,8 +2795,10 @@ TEST_CASE("Documentation: DoubleMatrix3x4Verifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - { { "a", new DoubleMatrix3x4Verifier, Optional::No } } + Documentation doc = { + .entries = { + { "a", new DoubleMatrix3x4Verifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -2800,8 +2834,10 @@ TEST_CASE("Documentation: DoubleMatrix4x2Verifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - { { "a", new DoubleMatrix4x2Verifier, Optional::No } } + Documentation doc = { + .entries = { + { "a", new DoubleMatrix4x2Verifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -2837,8 +2873,10 @@ TEST_CASE("Documentation: DoubleMatrix4x3Verifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - { { "a", new DoubleMatrix4x3Verifier, Optional::No } } + Documentation doc = { + .entries = { + { "a", new DoubleMatrix4x3Verifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -2874,8 +2912,10 @@ TEST_CASE("Documentation: DoubleMatrix4x4Verifier", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; - Documentation doc { - { { "a", new DoubleMatrix4x4Verifier, Optional::No } } + Documentation doc = { + .entries = { + { "a", new DoubleMatrix4x4Verifier, Optional::No } + } }; ghoul::Dictionary positive; @@ -2907,61 +2947,6 @@ TEST_CASE("Documentation: DoubleMatrix4x4Verifier", "[documentation]") { CHECK(negativeRes.offenses[0].reason == TestResult::Offense::Reason::WrongType); } -TEST_CASE("Documentation: DeprecatedVerifier", "[documentation]") { - using namespace openspace::documentation; - using namespace std::string_literals; - - Documentation doc { { - { "bool", new BoolDeprecatedVerifier, Optional::No }, - { "int" , new IntDeprecatedVerifier, Optional::No }, - { "double", new DoubleDeprecatedVerifier, Optional::No }, - { "string" , new StringDeprecatedVerifier, Optional::No }, - { "intvec2", new DeprecatedVerifier, Optional::No }, - { "doublevec2", new DeprecatedVerifier, Optional::No }, - { "intvec3", new DeprecatedVerifier, Optional::No }, - { "doublevec3", new DeprecatedVerifier, Optional::No }, - { "intvec4", new DeprecatedVerifier, Optional::No }, - { "doublevec4", new DeprecatedVerifier, Optional::No } - }}; - - ghoul::Dictionary positive; - positive.setValue("bool", true); - positive.setValue("int", 1); - positive.setValue("double", 2.0); - positive.setValue("string", ""s); - positive.setValue("intvec2", glm::ivec2(0)); - positive.setValue("doublevec2", glm::dvec2(0.0)); - positive.setValue("intvec3", glm::ivec3(0)); - positive.setValue("doublevec3", glm::dvec3(0.0)); - positive.setValue("intvec4", glm::ivec4(0)); - positive.setValue("doublevec4", glm::dvec4(0.0)); - TestResult positiveRes = testSpecification(doc, positive); - CHECK(positiveRes.success); - CHECK(positiveRes.offenses.empty()); - REQUIRE(positiveRes.warnings.size() == 10); - - CHECK(positiveRes.warnings[0].offender == "bool"); - CHECK(positiveRes.warnings[0].reason == TestResult::Warning::Reason::Deprecated); - CHECK(positiveRes.warnings[1].offender == "double"); - CHECK(positiveRes.warnings[1].reason == TestResult::Warning::Reason::Deprecated); - CHECK(positiveRes.warnings[2].offender == "doublevec2"); - CHECK(positiveRes.warnings[2].reason == TestResult::Warning::Reason::Deprecated); - CHECK(positiveRes.warnings[3].offender == "doublevec3"); - CHECK(positiveRes.warnings[3].reason == TestResult::Warning::Reason::Deprecated); - CHECK(positiveRes.warnings[4].offender == "doublevec4"); - CHECK(positiveRes.warnings[4].reason == TestResult::Warning::Reason::Deprecated); - CHECK(positiveRes.warnings[5].offender == "int"); - CHECK(positiveRes.warnings[5].reason == TestResult::Warning::Reason::Deprecated); - CHECK(positiveRes.warnings[6].offender == "intvec2"); - CHECK(positiveRes.warnings[6].reason == TestResult::Warning::Reason::Deprecated); - CHECK(positiveRes.warnings[7].offender == "intvec3"); - CHECK(positiveRes.warnings[7].reason == TestResult::Warning::Reason::Deprecated); - CHECK(positiveRes.warnings[8].offender == "intvec4"); - CHECK(positiveRes.warnings[8].reason == TestResult::Warning::Reason::Deprecated); - CHECK(positiveRes.warnings[9].offender == "string"); - CHECK(positiveRes.warnings[9].reason == TestResult::Warning::Reason::Deprecated); -} - TEST_CASE("Documentation: Verifier Type Post Conditions", "[documentation]") { using namespace openspace::documentation; using namespace std::string_literals; @@ -3023,18 +3008,6 @@ TEST_CASE("Documentation: Verifier Type Post Conditions", "[documentation]") { CHECK(AnnotationVerifier("A"s).type() != ""); CHECK(AnnotationVerifier("A"s).type() != ""); - CHECK(BoolDeprecatedVerifier().type() != ""); - CHECK(IntDeprecatedVerifier().type() != ""); - CHECK(DoubleDeprecatedVerifier().type() != ""); - CHECK(StringDeprecatedVerifier().type() != ""); - CHECK(TableDeprecatedVerifier().type() != ""); - CHECK(DeprecatedVerifier().type() != ""); - CHECK(DeprecatedVerifier().type() != ""); - CHECK(DeprecatedVerifier().type() != ""); - CHECK(DeprecatedVerifier().type() != ""); - CHECK(DeprecatedVerifier().type() != ""); - CHECK(DeprecatedVerifier().type() != ""); - CHECK(ReferencingVerifier("identifier"s).type() != ""); } @@ -3099,17 +3072,5 @@ TEST_CASE("Documentation: Verifier Documentation Post Conditions", "[documentati CHECK(AnnotationVerifier("A"s).documentation() != ""); CHECK(AnnotationVerifier("A"s).documentation() != ""); - CHECK(BoolDeprecatedVerifier().documentation() != ""); - CHECK(IntDeprecatedVerifier().documentation() != ""); - CHECK(DoubleDeprecatedVerifier().documentation() != ""); - CHECK(StringDeprecatedVerifier().documentation() != ""); - CHECK(TableDeprecatedVerifier().documentation() != ""); - CHECK(DeprecatedVerifier().documentation() != ""); - CHECK(DeprecatedVerifier().documentation() != ""); - CHECK(DeprecatedVerifier().documentation() != ""); - CHECK(DeprecatedVerifier().documentation() != ""); - CHECK(DeprecatedVerifier().documentation() != ""); - CHECK(DeprecatedVerifier().documentation() != ""); - CHECK(ReferencingVerifier("identifier"s).documentation() != ""); } From 4a1fe3f4a9291c72ff3ea6dfe5b2490103e3e3db Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Sun, 19 Nov 2023 14:10:47 +0100 Subject: [PATCH 177/701] Fix logo URL --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b15ef66fb1..b609d2e277 100644 --- a/README.md +++ b/README.md @@ -52,4 +52,4 @@ The contents of this repository provided under an [MIT license](https://github.c # Support OpenSpace is supported by the following institutions: -![Image](https://github.com/OpenSpace/openspace.github.io/raw/master/assets/logos/sponsors.png) +![Image](https://docs.openspaceproject.com/en/latest/_static/logos/sponsors.png) From 4ee078502b4e8c7942359d08b99a29c61e7949fa Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Sun, 19 Nov 2023 16:35:14 +0100 Subject: [PATCH 178/701] Doxygen (#2953) * Update Doxygen and add new CSS file * Remove Doxygen warnings --- .gitmodules | 3 + Doxyfile | 775 ++++++++++-------- apps/OpenSpace-MinVR/main.cpp | 3 +- include/openspace/documentation/verifier.h | 2 +- include/openspace/mission/missionmanager.h | 12 +- include/openspace/navigation/waypoint.h | 4 +- .../openspace/properties/templateproperty.h | 1 - .../openspace/properties/triggerproperty.h | 5 +- include/openspace/rendering/renderable.h | 11 +- include/openspace/scene/scene.h | 19 +- include/openspace/util/json_helper.h | 1 - include/openspace/util/spicemanager.h | 2 - modules/base/rendering/renderabletrail.h | 4 +- .../util/kameleonfieldlinehelper.cpp | 17 +- .../util/kameleonfieldlinehelper.h | 17 + modules/gaia/rendering/octreemanager.h | 128 ++- modules/gaia/tasks/constructoctreetask.h | 5 +- modules/gaia/tasks/readfilejob.h | 19 +- modules/gaia/tasks/readfitstask.h | 10 +- .../globebrowsing/src/asynctiledataprovider.h | 3 +- .../globebrowsing/src/memoryawaretilecache.h | 2 +- modules/globebrowsing/src/rawtiledatareader.h | 9 +- modules/globebrowsing/src/skirtedgrid.h | 6 - modules/globebrowsing/src/timequantizer.h | 220 ++--- modules/space/translation/gptranslation.h | 3 +- modules/space/translation/keplertranslation.h | 2 +- modules/webbrowser/include/browserinstance.h | 2 +- modules/webbrowser/include/eventhandler.h | 2 + src/documentation/verifier.cpp | 152 ++-- src/engine/settings.cpp | 3 +- support/doxygen/README.md | 0 support/doxygen/css | 1 + 32 files changed, 788 insertions(+), 655 deletions(-) create mode 100644 support/doxygen/README.md create mode 160000 support/doxygen/css diff --git a/.gitmodules b/.gitmodules index 76c093dc48..d98a1a3adf 100644 --- a/.gitmodules +++ b/.gitmodules @@ -38,3 +38,6 @@ [submodule "documentation"] path = documentation url = https://github.com/OpenSpace/OpenSpace-Documentation-Dist.git +[submodule "support/doxygen/css"] + path = support/doxygen/css + url = https://github.com/jothepro/doxygen-awesome-css.git diff --git a/Doxyfile b/Doxyfile index 8166b80b51..44468a071b 100644 --- a/Doxyfile +++ b/Doxyfile @@ -34,7 +34,7 @@ # https://www.gnu.org/software/libiconv/ for the list of possible encodings. # The default value is: UTF-8. -DOXYFILE_ENCODING = UTF-8 +DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the @@ -42,33 +42,33 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = OpenSpace +PROJECT_NAME = OpenSpace # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = +PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. -PROJECT_BRIEF = +PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. -PROJECT_LOGO = data/openspace-icon.png +PROJECT_LOGO = data/openspace-icon.png # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = doc/ +OUTPUT_DIRECTORY = doc/ # If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 # sub-directories (in 2 levels) under the output directory of each output format @@ -79,7 +79,7 @@ OUTPUT_DIRECTORY = doc/ # control the number of sub-directories. # The default value is: NO. -CREATE_SUBDIRS = YES +CREATE_SUBDIRS = YES # Controls the number of sub-directories that will be created when # CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every @@ -90,7 +90,7 @@ CREATE_SUBDIRS = YES # Minimum value: 0, maximum value: 8, default value: 8. # This tag requires that the tag CREATE_SUBDIRS is set to YES. -CREATE_SUBDIRS_LEVEL = 8 +CREATE_SUBDIRS_LEVEL = 8 # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII @@ -98,7 +98,7 @@ CREATE_SUBDIRS_LEVEL = 8 # U+3044. # The default value is: NO. -ALLOW_UNICODE_NAMES = NO +ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this @@ -113,14 +113,14 @@ ALLOW_UNICODE_NAMES = NO # Swedish, Turkish, Ukrainian and Vietnamese. # The default value is: English. -OUTPUT_LANGUAGE = English +OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. -BRIEF_MEMBER_DESC = YES +BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description @@ -129,7 +129,7 @@ BRIEF_MEMBER_DESC = YES # brief descriptions will be completely suppressed. # The default value is: YES. -REPEAT_BRIEF = YES +REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found @@ -140,24 +140,24 @@ REPEAT_BRIEF = YES # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. -ALWAYS_DETAILED_SEC = YES +ALWAYS_DETAILED_SEC = YES # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those @@ -165,14 +165,14 @@ ALWAYS_DETAILED_SEC = YES # operators of the base classes will not be shown. # The default value is: NO. -INLINE_INHERITED_MEMB = NO +INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. -FULL_PATH_NAMES = YES +FULL_PATH_NAMES = YES # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand @@ -184,7 +184,7 @@ FULL_PATH_NAMES = YES # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. -STRIP_FROM_PATH = +STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which @@ -193,14 +193,14 @@ STRIP_FROM_PATH = # specify the list of include paths that are normally passed to the compiler # using the -I flag. -STRIP_FROM_INC_PATH = +STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. -SHORT_NAMES = NO +SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief @@ -209,7 +209,7 @@ SHORT_NAMES = NO # description.) # The default value is: NO. -JAVADOC_AUTOBRIEF = YES +JAVADOC_AUTOBRIEF = YES # If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line # such as @@ -219,7 +219,7 @@ JAVADOC_AUTOBRIEF = YES # interpreted by doxygen. # The default value is: NO. -JAVADOC_BANNER = NO +JAVADOC_BANNER = NO # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If @@ -227,7 +227,7 @@ JAVADOC_BANNER = NO # requiring an explicit \brief command for a brief description.) # The default value is: NO. -QT_AUTOBRIEF = YES +QT_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as @@ -247,26 +247,26 @@ MULTILINE_CPP_IS_BRIEF = NO # documentation blocks is shown as doxygen documentation. # The default value is: YES. -PYTHON_DOCSTRING = YES +PYTHON_DOCSTRING = YES # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. -INHERIT_DOCS = YES +INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part # of the file/class/namespace that contains it. # The default value is: NO. -SEPARATE_MEMBER_PAGES = NO +SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. -TAB_SIZE = 4 +TAB_SIZE = 4 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: @@ -283,7 +283,7 @@ TAB_SIZE = 4 # with the commands \{ and \} for these it is advised to use the version @{ and # @} or use a double escape (\\{ and \\}) -ALIASES = +ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For @@ -291,7 +291,7 @@ ALIASES = # members will be omitted, etc. # The default value is: NO. -OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored @@ -299,19 +299,19 @@ OPTIMIZE_OUTPUT_FOR_C = NO # qualified scopes will look different, etc. # The default value is: NO. -OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. -OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. -OPTIMIZE_OUTPUT_VHDL = NO +OPTIMIZE_OUTPUT_VHDL = NO # Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice # sources only. Doxygen will then generate output that is more tailored for that @@ -319,7 +319,7 @@ OPTIMIZE_OUTPUT_VHDL = NO # separated into more groups, etc. # The default value is: NO. -OPTIMIZE_OUTPUT_SLICE = NO +OPTIMIZE_OUTPUT_SLICE = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given @@ -342,7 +342,7 @@ OPTIMIZE_OUTPUT_SLICE = NO # # Note see also the list of default file extension mappings. -EXTENSION_MAPPING = inl=C++ +EXTENSION_MAPPING = inl=C++ # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable @@ -352,7 +352,7 @@ EXTENSION_MAPPING = inl=C++ # case of backward compatibilities issues. # The default value is: YES. -MARKDOWN_SUPPORT = YES +MARKDOWN_SUPPORT = YES # When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up # to that level are automatically included in the table of contents, even if @@ -361,7 +361,18 @@ MARKDOWN_SUPPORT = YES # Minimum value: 0, maximum value: 99, default value: 5. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. -TOC_INCLUDE_HEADINGS = 5 +TOC_INCLUDE_HEADINGS = 5 + +# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to +# generate identifiers for the Markdown headings. Note: Every identifier is +# unique. +# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a +# sequence number starting at 0 and GITHUB use the lower case version of title +# with any whitespace replaced by '-' and punctuation characters removed. +# The default value is: DOXYGEN. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +MARKDOWN_ID_STYLE = DOXYGEN # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can @@ -369,7 +380,7 @@ TOC_INCLUDE_HEADINGS = 5 # globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. -AUTOLINK_SUPPORT = YES +AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this @@ -379,13 +390,13 @@ AUTOLINK_SUPPORT = YES # diagrams that involve STL classes more complete and accurate. # The default value is: NO. -BUILTIN_STL_SUPPORT = YES +BUILTIN_STL_SUPPORT = YES # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. -CPP_CLI_SUPPORT = NO +CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen @@ -393,7 +404,7 @@ CPP_CLI_SUPPORT = NO # of private inheritance when no explicit protection keyword is present. # The default value is: NO. -SIP_SUPPORT = NO +SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make @@ -403,7 +414,7 @@ SIP_SUPPORT = NO # should set this option to NO. # The default value is: YES. -IDL_PROPERTY_SUPPORT = YES +IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES then doxygen will reuse the documentation of the first @@ -411,7 +422,7 @@ IDL_PROPERTY_SUPPORT = YES # all members of a group must be documented explicitly. # The default value is: NO. -DISTRIBUTE_GROUP_DOC = NO +DISTRIBUTE_GROUP_DOC = NO # If one adds a struct or class to a group and this option is enabled, then also # any nested class or struct is added to the same group. By default this option @@ -427,7 +438,7 @@ GROUP_NESTED_COMPOUNDS = NO # \nosubgrouping command. # The default value is: YES. -SUBGROUPING = YES +SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) @@ -448,7 +459,7 @@ INLINE_GROUPED_CLASSES = NO # Man pages) or section (for LaTeX and RTF). # The default value is: NO. -INLINE_SIMPLE_STRUCTS = YES +INLINE_SIMPLE_STRUCTS = YES # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So @@ -459,7 +470,7 @@ INLINE_SIMPLE_STRUCTS = YES # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. -TYPEDEF_HIDES_STRUCT = NO +TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be @@ -472,7 +483,7 @@ TYPEDEF_HIDES_STRUCT = NO # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. -LOOKUP_CACHE_SIZE = 9 +LOOKUP_CACHE_SIZE = 9 # The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use # during processing. When set to 0 doxygen will based this on the number of @@ -485,7 +496,15 @@ LOOKUP_CACHE_SIZE = 9 # DOT_NUM_THREADS setting. # Minimum value: 0, maximum value: 32, default value: 1. -NUM_PROC_THREADS = 1 +NUM_PROC_THREADS = 1 + +# If the TIMESTAMP tag is set different from NO then each generated page will +# contain the date or date and time when the page was generated. Setting this to +# NO can help when comparing the output of multiple runs. +# Possible values are: YES, NO, DATETIME and DATE. +# The default value is: NO. + +TIMESTAMP = DATE #--------------------------------------------------------------------------- # Build related configuration options @@ -499,31 +518,31 @@ NUM_PROC_THREADS = 1 # normally produced when WARNINGS is set to YES. # The default value is: NO. -EXTRACT_ALL = YES +EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. -EXTRACT_PRIVATE = YES +EXTRACT_PRIVATE = YES # If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual # methods of a class will be included in the documentation. # The default value is: NO. -EXTRACT_PRIV_VIRTUAL = YES +EXTRACT_PRIV_VIRTUAL = YES # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. -EXTRACT_PACKAGE = NO +EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. # The default value is: NO. -EXTRACT_STATIC = YES +EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined # locally in source files will be included in the documentation. If set to NO, @@ -531,7 +550,7 @@ EXTRACT_STATIC = YES # for Java sources. # The default value is: YES. -EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. If set to YES, local methods, # which are defined in the implementation section but not in the interface are @@ -539,7 +558,7 @@ EXTRACT_LOCAL_CLASSES = YES # included. # The default value is: NO. -EXTRACT_LOCAL_METHODS = NO +EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called @@ -548,7 +567,7 @@ EXTRACT_LOCAL_METHODS = NO # are hidden. # The default value is: NO. -EXTRACT_ANON_NSPACES = NO +EXTRACT_ANON_NSPACES = NO # If this flag is set to YES, the name of an unnamed parameter in a declaration # will be determined by the corresponding definition. By default unnamed @@ -563,7 +582,7 @@ RESOLVE_UNNAMED_PARAMS = YES # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. -HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set @@ -572,28 +591,28 @@ HIDE_UNDOC_MEMBERS = NO # if EXTRACT_ALL is enabled. # The default value is: NO. -HIDE_UNDOC_CLASSES = NO +HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # declarations. If set to NO, these declarations will be included in the # documentation. # The default value is: NO. -HIDE_FRIEND_COMPOUNDS = NO +HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. -HIDE_IN_BODY_DOCS = NO +HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. -INTERNAL_DOCS = NO +INTERNAL_DOCS = NO # With the correct setting of option CASE_SENSE_NAMES doxygen will better be # able to match the capabilities of the underlying filesystem. In case the @@ -610,59 +629,59 @@ INTERNAL_DOCS = NO # Possible values are: SYSTEM, NO and YES. # The default value is: SYSTEM. -CASE_SENSE_NAMES = SYSTEM +CASE_SENSE_NAMES = SYSTEM # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. -HIDE_SCOPE_NAMES = YES +HIDE_SCOPE_NAMES = YES # If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will # append additional text to a page's title, such as Class Reference. If set to # YES the compound reference will be hidden. # The default value is: NO. -HIDE_COMPOUND_REFERENCE= NO +HIDE_COMPOUND_REFERENCE = NO # If the SHOW_HEADERFILE tag is set to YES then the documentation for a class # will show which file needs to be included to use the class. # The default value is: YES. -SHOW_HEADERFILE = YES +SHOW_HEADERFILE = YES # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. -SHOW_INCLUDE_FILES = YES +SHOW_INCLUDE_FILES = YES # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each # grouped member an include statement to the documentation, telling the reader # which file to include in order to use the member. # The default value is: NO. -SHOW_GROUPED_MEMB_INC = NO +SHOW_GROUPED_MEMB_INC = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. -FORCE_LOCAL_INCLUDES = NO +FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. -INLINE_INFO = YES +INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. # The default value is: YES. -SORT_MEMBER_DOCS = YES +SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member @@ -670,7 +689,7 @@ SORT_MEMBER_DOCS = YES # this will also influence the order of the classes in the class list. # The default value is: NO. -SORT_BRIEF_DOCS = YES +SORT_BRIEF_DOCS = YES # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and @@ -689,7 +708,7 @@ SORT_MEMBERS_CTORS_1ST = YES # appear in their defined order. # The default value is: NO. -SORT_GROUP_NAMES = NO +SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will @@ -699,7 +718,7 @@ SORT_GROUP_NAMES = NO # list. # The default value is: NO. -SORT_BY_SCOPE_NAME = NO +SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between @@ -709,38 +728,38 @@ SORT_BY_SCOPE_NAME = NO # accept a match between prototype and implementation in such cases. # The default value is: NO. -STRICT_PROTO_MATCHING = NO +STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo # list. This list is created by putting \todo commands in the documentation. # The default value is: YES. -GENERATE_TODOLIST = YES +GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test # list. This list is created by putting \test commands in the documentation. # The default value is: YES. -GENERATE_TESTLIST = NO +GENERATE_TESTLIST = NO # The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. -GENERATE_BUGLIST = NO +GENERATE_BUGLIST = NO # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. -GENERATE_DEPRECATEDLIST= YES +GENERATE_DEPRECATEDLIST = YES # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. -ENABLED_SECTIONS = +ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the @@ -751,28 +770,28 @@ ENABLED_SECTIONS = # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. -MAX_INITIALIZER_LINES = 30 +MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES, the # list will mention the files that were used to generate the documentation. # The default value is: YES. -SHOW_USED_FILES = NO +SHOW_USED_FILES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. -SHOW_FILES = YES +SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. -SHOW_NAMESPACES = YES +SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from @@ -782,7 +801,7 @@ SHOW_NAMESPACES = YES # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. -FILE_VERSION_FILTER = +FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated @@ -796,7 +815,7 @@ FILE_VERSION_FILTER = # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. -LAYOUT_FILE = +LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib @@ -806,7 +825,7 @@ LAYOUT_FILE = # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. -CITE_BIB_FILES = +CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages @@ -817,7 +836,7 @@ CITE_BIB_FILES = # messages are off. # The default value is: NO. -QUIET = YES +QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error (stderr) by doxygen. If WARNINGS is set to YES @@ -826,14 +845,14 @@ QUIET = YES # Tip: Turn warnings on while writing the documentation. # The default value is: YES. -WARNINGS = YES +WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. -WARN_IF_UNDOCUMENTED = YES +WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as documenting some parameters in @@ -841,7 +860,7 @@ WARN_IF_UNDOCUMENTED = YES # using markup commands wrongly. # The default value is: YES. -WARN_IF_DOC_ERROR = YES +WARN_IF_DOC_ERROR = YES # If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete # function parameter documentation. If set to NO, doxygen will accept that some @@ -858,7 +877,7 @@ WARN_IF_INCOMPLETE_DOC = YES # WARN_IF_INCOMPLETE_DOC # The default value is: NO. -WARN_NO_PARAMDOC = NO +WARN_NO_PARAMDOC = NO # If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about # undocumented enumeration values. If set to NO, doxygen will accept @@ -872,10 +891,17 @@ WARN_IF_UNDOC_ENUM_VAL = YES # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS # then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but # at the end of the doxygen process doxygen will return with a non-zero status. -# Possible values are: NO, YES and FAIL_ON_WARNINGS. +# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then doxygen behaves +# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined doxygen will not +# write the warning messages in between other messages but write them at the end +# of a run, in case a WARN_LOGFILE is defined the warning messages will be +# besides being in the defined file also be shown at the end of a run, unless +# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case +# the behavior will remain as with the setting FAIL_ON_WARNINGS. +# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. # The default value is: NO. -WARN_AS_ERROR = NO +WARN_AS_ERROR = NO # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which @@ -886,7 +912,7 @@ WARN_AS_ERROR = NO # See also: WARN_LINE_FORMAT # The default value is: $file:$line: $text. -WARN_FORMAT = "$file:$line: $text" +WARN_FORMAT = "$file:$line: $text" # In the $text part of the WARN_FORMAT command it is possible that a reference # to a more specific place is given. To make it easier to jump to this place @@ -896,7 +922,7 @@ WARN_FORMAT = "$file:$line: $text" # See also: WARN_FORMAT # The default value is: at line $line of file $file. -WARN_LINE_FORMAT = "at line $line of file $file" +WARN_LINE_FORMAT = "at line $line of file $file" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard @@ -905,7 +931,7 @@ WARN_LINE_FORMAT = "at line $line of file $file" # specified the warning and error messages are written to standard output # (stdout). -WARN_LOGFILE = +WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files @@ -917,10 +943,11 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = src \ - include \ - modules \ - apps +INPUT = src \ + include \ + modules \ + apps \ + support/doxygen/README.md # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses @@ -930,7 +957,7 @@ INPUT = src \ # See also: INPUT_FILE_ENCODING # The default value is: UTF-8. -INPUT_ENCODING = UTF-8 +INPUT_ENCODING = UTF-8 # This tag can be used to specify the character encoding of the source files # that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify @@ -940,7 +967,7 @@ INPUT_ENCODING = UTF-8 # form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding # "INPUT_ENCODING" for further information on supported encodings. -INPUT_FILE_ENCODING = +INPUT_FILE_ENCODING = # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and @@ -953,22 +980,22 @@ INPUT_FILE_ENCODING = # Note the list of default checked file patterns might differ from the list of # default file extension mappings. # -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, -# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C -# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, -# *.vhdl, *.ucf, *.qsf and *.ice. +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, +# *.cpp, *.cppm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, +# *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, *.php, +# *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be +# provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. -FILE_PATTERNS = *.cpp \ - *.h \ - *.inl +FILE_PATTERNS = *.cpp \ + *.h \ + *.inl # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. -RECURSIVE = YES +RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a @@ -977,14 +1004,14 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = +EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. -EXCLUDE_SYMLINKS = NO +EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude @@ -993,53 +1020,50 @@ EXCLUDE_SYMLINKS = NO # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* -EXCLUDE_PATTERNS = ext/* \ - bin/* \ - build/* \ - config/* \ - gui/* \ - kernels/* \ - data/* \ - scripts/* \ - shaders/* \ - **/ext/** +EXCLUDE_PATTERNS = ext/* \ + bin/* \ + build/* \ + config/* \ + gui/* \ + kernels/* \ + data/* \ + scripts/* \ + shaders/* \ + **/ext/** # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # ANamespace::AClass, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* -EXCLUDE_SYMBOLS = +EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). -EXAMPLE_PATH = +EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. -EXAMPLE_PATTERNS = * +EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. -EXAMPLE_RECURSIVE = NO +EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). -IMAGE_PATH = +IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program @@ -1065,7 +1089,7 @@ IMAGE_PATH = # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. -INPUT_FILTER = +INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the @@ -1078,14 +1102,14 @@ INPUT_FILTER = # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. -FILTER_PATTERNS = +FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. -FILTER_SOURCE_FILES = NO +FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and @@ -1100,7 +1124,7 @@ FILTER_SOURCE_PATTERNS = # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. -USE_MDFILE_AS_MAINPAGE = README.md +USE_MDFILE_AS_MAINPAGE = support/doxygen/README.md # The Fortran standard specifies that for fixed formatted Fortran code all # characters from position 72 are to be considered as comment. A common @@ -1109,7 +1133,7 @@ USE_MDFILE_AS_MAINPAGE = README.md # be processed before the automatic comment starts. # Minimum value: 7, maximum value: 10000, default value: 72. -FORTRAN_COMMENT_AFTER = 72 +FORTRAN_COMMENT_AFTER = 72 #--------------------------------------------------------------------------- # Configuration options related to source browsing @@ -1122,20 +1146,20 @@ FORTRAN_COMMENT_AFTER = 72 # also VERBATIM_HEADERS is set to NO. # The default value is: NO. -SOURCE_BROWSER = YES +SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. -INLINE_SOURCES = NO +INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. -STRIP_CODE_COMMENTS = YES +STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # entity all documented functions referencing it will be listed. @@ -1147,7 +1171,7 @@ REFERENCED_BY_RELATION = NO # all documented entities called/used by that function will be listed. # The default value is: NO. -REFERENCES_RELATION = NO +REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES then the hyperlinks from functions in REFERENCES_RELATION and @@ -1165,7 +1189,7 @@ REFERENCES_LINK_SOURCE = YES # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. -SOURCE_TOOLTIPS = YES +SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in @@ -1187,7 +1211,7 @@ SOURCE_TOOLTIPS = YES # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. -USE_HTAGS = NO +USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is @@ -1195,7 +1219,7 @@ USE_HTAGS = NO # See also: Section \class. # The default value is: YES. -VERBATIM_HEADERS = NO +VERBATIM_HEADERS = NO # If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the # clang parser (see: @@ -1214,7 +1238,7 @@ CLANG_ASSISTED_PARSING = NO # The default value is: YES. # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. -CLANG_ADD_INC_PATHS = YES +CLANG_ADD_INC_PATHS = YES # If clang assisted parsing is enabled you can provide the compiler with command # line options that you would normally use when invoking the compiler. Note that @@ -1222,7 +1246,7 @@ CLANG_ADD_INC_PATHS = YES # specified with INPUT and INCLUDE_PATH. # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. -CLANG_OPTIONS = +CLANG_OPTIONS = # If clang assisted parsing is enabled you can provide the clang parser with the # path to the directory containing a file called compile_commands.json. This @@ -1235,7 +1259,7 @@ CLANG_OPTIONS = # Note: The availability of this option depends on whether or not doxygen was # generated with the -Duse_libclang=ON option for CMake. -CLANG_DATABASE_PATH = +CLANG_DATABASE_PATH = #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index @@ -1246,7 +1270,7 @@ CLANG_DATABASE_PATH = # classes, structs, unions or interfaces. # The default value is: YES. -ALPHABETICAL_INDEX = YES +ALPHABETICAL_INDEX = YES # The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) # that should be ignored while generating the index headers. The IGNORE_PREFIX @@ -1255,7 +1279,7 @@ ALPHABETICAL_INDEX = YES # after removing the prefix. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. -IGNORE_PREFIX = +IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output @@ -1264,7 +1288,7 @@ IGNORE_PREFIX = # If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. -GENERATE_HTML = YES +GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of @@ -1272,14 +1296,14 @@ GENERATE_HTML = YES # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_OUTPUT = html +HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_FILE_EXTENSION = .html +HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a @@ -1299,7 +1323,7 @@ HTML_FILE_EXTENSION = .html # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_HEADER = +HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard @@ -1309,7 +1333,7 @@ HTML_HEADER = # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_FOOTER = +HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of @@ -1321,7 +1345,7 @@ HTML_FOOTER = # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_STYLESHEET = +HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets @@ -1339,7 +1363,7 @@ HTML_STYLESHEET = # documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_STYLESHEET = +HTML_EXTRA_STYLESHEET = support/doxygen/css/doxygen-awesome.css # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note @@ -1349,7 +1373,7 @@ HTML_EXTRA_STYLESHEET = # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_FILES = +HTML_EXTRA_FILES = # The HTML_COLORSTYLE tag can be used to specify if the generated HTML output # should be rendered with a dark or light theme. @@ -1362,7 +1386,7 @@ HTML_EXTRA_FILES = # The default value is: AUTO_LIGHT. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_COLORSTYLE = DARK +HTML_COLORSTYLE = DARK # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to @@ -1373,7 +1397,7 @@ HTML_COLORSTYLE = DARK # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_COLORSTYLE_HUE = 225 +HTML_COLORSTYLE_HUE = 225 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use gray-scales only. A @@ -1381,7 +1405,7 @@ HTML_COLORSTYLE_HUE = 225 # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_COLORSTYLE_SAT = 18 +HTML_COLORSTYLE_SAT = 18 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 @@ -1392,16 +1416,7 @@ HTML_COLORSTYLE_SAT = 18 # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_COLORSTYLE_GAMMA = 100 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = YES +HTML_COLORSTYLE_GAMMA = 100 # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that @@ -1412,7 +1427,7 @@ HTML_TIMESTAMP = YES # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_DYNAMIC_MENUS = YES +HTML_DYNAMIC_MENUS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the @@ -1420,7 +1435,14 @@ HTML_DYNAMIC_MENUS = YES # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_DYNAMIC_SECTIONS = YES +HTML_DYNAMIC_SECTIONS = YES + +# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be +# dynamically folded and expanded in the generated HTML source code. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_CODE_FOLDING = YES # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand @@ -1448,7 +1470,7 @@ HTML_INDEX_NUM_ENTRIES = 100 # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -GENERATE_DOCSET = NO +GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider @@ -1456,14 +1478,14 @@ GENERATE_DOCSET = NO # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. -DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_FEEDNAME = "Doxygen generated docs" # This tag determines the URL of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # This tag requires that the tag GENERATE_DOCSET is set to YES. -DOCSET_FEEDURL = +DOCSET_FEEDURL = # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. @@ -1471,7 +1493,7 @@ DOCSET_FEEDURL = # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. -DOCSET_BUNDLE_ID = org.doxygen.Project +DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style @@ -1479,13 +1501,13 @@ DOCSET_BUNDLE_ID = org.doxygen.Project # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. -DOCSET_PUBLISHER_ID = org.doxygen.Publisher +DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. -DOCSET_PUBLISHER_NAME = Publisher +DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The @@ -1507,14 +1529,14 @@ DOCSET_PUBLISHER_NAME = Publisher # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -GENERATE_HTMLHELP = NO +GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -CHM_FILE = +CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, @@ -1522,20 +1544,20 @@ CHM_FILE = # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -HHC_LOCATION = +HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated # (YES) or that it should be included in the main .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -GENERATE_CHI = NO +GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -CHM_INDEX_ENCODING = +CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it @@ -1543,14 +1565,24 @@ CHM_INDEX_ENCODING = # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -BINARY_TOC = NO +BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -TOC_EXPAND = NO +TOC_EXPAND = NO + +# The SITEMAP_URL tag is used to specify the full URL of the place where the +# generated documentation will be placed on the server by the user during the +# deployment of the documentation. The generated sitemap is called sitemap.xml +# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL +# is specified no sitemap is generated. For information about the sitemap +# protocol see https://www.sitemaps.org +# This tag requires that the tag GENERATE_HTML is set to YES. + +SITEMAP_URL = # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that @@ -1559,14 +1591,14 @@ TOC_EXPAND = NO # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -GENERATE_QHP = NO +GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. -QCH_FILE = +QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace @@ -1575,7 +1607,7 @@ QCH_FILE = # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_NAMESPACE = org.doxygen.Project +QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual @@ -1584,7 +1616,7 @@ QHP_NAMESPACE = org.doxygen.Project # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_VIRTUAL_FOLDER = doc +QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom @@ -1592,7 +1624,7 @@ QHP_VIRTUAL_FOLDER = doc # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom @@ -1600,21 +1632,21 @@ QHP_CUST_FILTER_NAME = # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_CUST_FILTER_ATTRS = +QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_SECT_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location (absolute path # including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to # run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. -QHG_LOCATION = +QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To @@ -1626,7 +1658,7 @@ QHG_LOCATION = # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -GENERATE_ECLIPSEHELP = NO +GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this @@ -1634,7 +1666,7 @@ GENERATE_ECLIPSEHELP = NO # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. -ECLIPSE_DOC_ID = org.doxygen.Project +ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The @@ -1645,7 +1677,7 @@ ECLIPSE_DOC_ID = org.doxygen.Project # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -DISABLE_INDEX = NO +DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag @@ -1662,7 +1694,7 @@ DISABLE_INDEX = NO # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -GENERATE_TREEVIEW = YES +GENERATE_TREEVIEW = YES # When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the # FULL_SIDEBAR option determines if the side bar is limited to only the treeview @@ -1674,7 +1706,7 @@ GENERATE_TREEVIEW = YES # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -FULL_SIDEBAR = NO +FULL_SIDEBAR = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. @@ -1684,28 +1716,28 @@ FULL_SIDEBAR = NO # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. -ENUM_VALUES_PER_LINE = 6 +ENUM_VALUES_PER_LINE = 6 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. -TREEVIEW_WIDTH = 300 +TREEVIEW_WIDTH = 300 # If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -EXT_LINKS_IN_WINDOW = NO +EXT_LINKS_IN_WINDOW = NO # If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email # addresses. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. -OBFUSCATE_EMAILS = NO +OBFUSCATE_EMAILS = NO # If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg # tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see @@ -1716,7 +1748,7 @@ OBFUSCATE_EMAILS = NO # The default value is: png. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_FORMULA_FORMAT = png +HTML_FORMULA_FORMAT = png # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful @@ -1725,13 +1757,13 @@ HTML_FORMULA_FORMAT = png # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. -FORMULA_FONTSIZE = 10 +FORMULA_FONTSIZE = 10 # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # to create new LaTeX commands to be used in formulas as building blocks. See # the section "Including formulas" for details. -FORMULA_MACROFILE = +FORMULA_MACROFILE = # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # https://www.mathjax.org) which uses client side JavaScript for the rendering @@ -1742,7 +1774,7 @@ FORMULA_MACROFILE = # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -USE_MATHJAX = NO +USE_MATHJAX = NO # With MATHJAX_VERSION it is possible to specify the MathJax version to be used. # Note that the different versions of MathJax have different requirements with @@ -1753,7 +1785,7 @@ USE_MATHJAX = NO # The default value is: MathJax_2. # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_VERSION = MathJax_2 +MATHJAX_VERSION = MathJax_2 # When MathJax is enabled you can set the default output format to be used for # the MathJax output. For more details about the output format see MathJax @@ -1770,7 +1802,7 @@ MATHJAX_VERSION = MathJax_2 # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_FORMAT = HTML-CSS +MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory @@ -1784,7 +1816,7 @@ MATHJAX_FORMAT = HTML-CSS # - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_RELPATH = +MATHJAX_RELPATH = # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example @@ -1796,7 +1828,7 @@ MATHJAX_RELPATH = # MATHJAX_EXTENSIONS = ams # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_EXTENSIONS = +MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site @@ -1805,7 +1837,7 @@ MATHJAX_EXTENSIONS = # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_CODEFILE = +MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and @@ -1826,7 +1858,7 @@ MATHJAX_CODEFILE = # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. -SEARCHENGINE = YES +SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a web server instead of a web client using JavaScript. There @@ -1838,7 +1870,7 @@ SEARCHENGINE = YES # The default value is: NO. # This tag requires that the tag SEARCHENGINE is set to YES. -SERVER_BASED_SEARCH = NO +SERVER_BASED_SEARCH = NO # When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP # script for searching. Instead the search results are written to an XML file @@ -1855,7 +1887,7 @@ SERVER_BASED_SEARCH = NO # The default value is: NO. # This tag requires that the tag SEARCHENGINE is set to YES. -EXTERNAL_SEARCH = NO +EXTERNAL_SEARCH = NO # The SEARCHENGINE_URL should point to a search engine hosted by a web server # which will return the search results when EXTERNAL_SEARCH is enabled. @@ -1867,7 +1899,7 @@ EXTERNAL_SEARCH = NO # details. # This tag requires that the tag SEARCHENGINE is set to YES. -SEARCHENGINE_URL = +SEARCHENGINE_URL = # When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed # search data is written to a file for indexing by an external tool. With the @@ -1875,7 +1907,7 @@ SEARCHENGINE_URL = # The default file is: searchdata.xml. # This tag requires that the tag SEARCHENGINE is set to YES. -SEARCHDATA_FILE = searchdata.xml +SEARCHDATA_FILE = searchdata.xml # When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the # EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is @@ -1883,7 +1915,7 @@ SEARCHDATA_FILE = searchdata.xml # projects and redirect the results back to the right project. # This tag requires that the tag SEARCHENGINE is set to YES. -EXTERNAL_SEARCH_ID = +EXTERNAL_SEARCH_ID = # The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen # projects other than the one defined by this configuration file, but that are @@ -1893,7 +1925,7 @@ EXTERNAL_SEARCH_ID = # EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... # This tag requires that the tag SEARCHENGINE is set to YES. -EXTRA_SEARCH_MAPPINGS = +EXTRA_SEARCH_MAPPINGS = #--------------------------------------------------------------------------- # Configuration options related to the LaTeX output @@ -1902,7 +1934,7 @@ EXTRA_SEARCH_MAPPINGS = # If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. # The default value is: YES. -GENERATE_LATEX = NO +GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of @@ -1910,7 +1942,7 @@ GENERATE_LATEX = NO # The default directory is: latex. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_OUTPUT = latex +LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. @@ -1922,7 +1954,7 @@ LATEX_OUTPUT = latex # the output language. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_CMD_NAME = +LATEX_CMD_NAME = # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate # index for LaTeX. @@ -1932,7 +1964,7 @@ LATEX_CMD_NAME = # The default file is: makeindex. # This tag requires that the tag GENERATE_LATEX is set to YES. -MAKEINDEX_CMD_NAME = makeindex +MAKEINDEX_CMD_NAME = makeindex # The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to # generate index for LaTeX. In case there is no backslash (\) as first character @@ -1942,7 +1974,7 @@ MAKEINDEX_CMD_NAME = makeindex # The default value is: makeindex. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_MAKEINDEX_CMD = makeindex +LATEX_MAKEINDEX_CMD = makeindex # If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX # documents. This may be useful for small projects and may help to save some @@ -1950,7 +1982,7 @@ LATEX_MAKEINDEX_CMD = makeindex # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. -COMPACT_LATEX = NO +COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used by the # printer. @@ -1959,7 +1991,7 @@ COMPACT_LATEX = NO # The default value is: a4. # This tag requires that the tag GENERATE_LATEX is set to YES. -PAPER_TYPE = a4 +PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names # that should be included in the LaTeX output. The package can be specified just @@ -1971,7 +2003,7 @@ PAPER_TYPE = a4 # If left blank no extra packages will be included. # This tag requires that the tag GENERATE_LATEX is set to YES. -EXTRA_PACKAGES = +EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for # the generated LaTeX document. The header should contain everything until the @@ -1988,7 +2020,7 @@ EXTRA_PACKAGES = # description of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_HEADER = +LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for # the generated LaTeX document. The footer should contain everything after the @@ -2000,7 +2032,7 @@ LATEX_HEADER = # doing! # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_FOOTER = +LATEX_FOOTER = # The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined # LaTeX style sheets that are included after the standard style sheets created @@ -2019,7 +2051,7 @@ LATEX_EXTRA_STYLESHEET = # markers available. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_EXTRA_FILES = +LATEX_EXTRA_FILES = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is # prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will @@ -2028,7 +2060,7 @@ LATEX_EXTRA_FILES = # The default value is: YES. # This tag requires that the tag GENERATE_LATEX is set to YES. -PDF_HYPERLINKS = YES +PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as # specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX @@ -2038,22 +2070,29 @@ PDF_HYPERLINKS = YES # The default value is: YES. # This tag requires that the tag GENERATE_LATEX is set to YES. -USE_PDFLATEX = YES +USE_PDFLATEX = YES -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode -# command to the generated LaTeX files. This will instruct LaTeX to keep running -# if errors occur, instead of asking the user for help. +# The LATEX_BATCHMODE tag signals the behavior of LaTeX in case of an error. +# Possible values are: NO same as ERROR_STOP, YES same as BATCH, BATCH In batch +# mode nothing is printed on the terminal, errors are scrolled as if is +# hit at every error; missing files that TeX tries to input or request from +# keyboard input (\read on a not open input stream) cause the job to abort, +# NON_STOP In nonstop mode the diagnostic message will appear on the terminal, +# but there is no possibility of user interaction just like in batch mode, +# SCROLL In scroll mode, TeX will stop only for missing files to input or if +# keyboard input is necessary and ERROR_STOP In errorstop mode, TeX will stop at +# each error, asking for user intervention. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_BATCHMODE = NO +LATEX_BATCHMODE = NO # If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the # index chapters (such as File Index, Compound Index, etc.) in the output. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_HIDE_INDICES = NO +LATEX_HIDE_INDICES = NO # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. See @@ -2061,15 +2100,7 @@ LATEX_HIDE_INDICES = NO # The default value is: plain. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_BIB_STYLE = plain - -# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated -# page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_TIMESTAMP = NO +LATEX_BIB_STYLE = plain # The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) # path from which the emoji images will be read. If a relative path is entered, @@ -2077,7 +2108,7 @@ LATEX_TIMESTAMP = NO # LATEX_OUTPUT directory will be used. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_EMOJI_DIRECTORY = +LATEX_EMOJI_DIRECTORY = #--------------------------------------------------------------------------- # Configuration options related to the RTF output @@ -2088,7 +2119,7 @@ LATEX_EMOJI_DIRECTORY = # readers/editors. # The default value is: NO. -GENERATE_RTF = NO +GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of @@ -2096,7 +2127,7 @@ GENERATE_RTF = NO # The default directory is: rtf. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_OUTPUT = rtf +RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF # documents. This may be useful for small projects and may help to save some @@ -2104,7 +2135,7 @@ RTF_OUTPUT = rtf # The default value is: NO. # This tag requires that the tag GENERATE_RTF is set to YES. -COMPACT_RTF = NO +COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will # contain hyperlink fields. The RTF file will contain links (just like the HTML @@ -2116,7 +2147,7 @@ COMPACT_RTF = NO # The default value is: NO. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_HYPERLINKS = NO +RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # configuration file, i.e. a series of assignments. You only have to provide @@ -2126,14 +2157,14 @@ RTF_HYPERLINKS = NO # default style sheet that doxygen normally uses. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_STYLESHEET_FILE = +RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an RTF document. Syntax is # similar to doxygen's configuration file. A template extensions file can be # generated using doxygen -e rtf extensionFile. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_EXTENSIONS_FILE = +RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # Configuration options related to the man page output @@ -2143,7 +2174,7 @@ RTF_EXTENSIONS_FILE = # classes and files. # The default value is: NO. -GENERATE_MAN = NO +GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of @@ -2152,7 +2183,7 @@ GENERATE_MAN = NO # The default directory is: man. # This tag requires that the tag GENERATE_MAN is set to YES. -MAN_OUTPUT = man +MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to the generated # man pages. In case the manual section does not start with a number, the number @@ -2161,14 +2192,14 @@ MAN_OUTPUT = man # The default value is: .3. # This tag requires that the tag GENERATE_MAN is set to YES. -MAN_EXTENSION = .3 +MAN_EXTENSION = .3 # The MAN_SUBDIR tag determines the name of the directory created within # MAN_OUTPUT in which the man pages are placed. If defaults to man followed by # MAN_EXTENSION with the initial . removed. # This tag requires that the tag GENERATE_MAN is set to YES. -MAN_SUBDIR = +MAN_SUBDIR = # If the MAN_LINKS tag is set to YES and doxygen generates man output, then it # will generate one additional man file for each entity documented in the real @@ -2177,7 +2208,7 @@ MAN_SUBDIR = # The default value is: NO. # This tag requires that the tag GENERATE_MAN is set to YES. -MAN_LINKS = NO +MAN_LINKS = NO #--------------------------------------------------------------------------- # Configuration options related to the XML output @@ -2187,7 +2218,7 @@ MAN_LINKS = NO # captures the structure of the code including all documentation. # The default value is: NO. -GENERATE_XML = NO +GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of @@ -2195,7 +2226,7 @@ GENERATE_XML = NO # The default directory is: xml. # This tag requires that the tag GENERATE_XML is set to YES. -XML_OUTPUT = xml +XML_OUTPUT = xml # If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program # listings (including syntax highlighting and cross-referencing information) to @@ -2204,7 +2235,7 @@ XML_OUTPUT = xml # The default value is: YES. # This tag requires that the tag GENERATE_XML is set to YES. -XML_PROGRAMLISTING = YES +XML_PROGRAMLISTING = YES # If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include # namespace members in file scope as well, matching the HTML output. @@ -2221,7 +2252,7 @@ XML_NS_MEMB_FILE_SCOPE = NO # that can be used to generate PDF. # The default value is: NO. -GENERATE_DOCBOOK = NO +GENERATE_DOCBOOK = NO # The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be put in @@ -2229,7 +2260,7 @@ GENERATE_DOCBOOK = NO # The default directory is: docbook. # This tag requires that the tag GENERATE_DOCBOOK is set to YES. -DOCBOOK_OUTPUT = docbook +DOCBOOK_OUTPUT = docbook #--------------------------------------------------------------------------- # Configuration options for the AutoGen Definitions output @@ -2241,12 +2272,34 @@ DOCBOOK_OUTPUT = docbook # is still experimental and incomplete at the moment. # The default value is: NO. -GENERATE_AUTOGEN_DEF = NO +GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # Configuration options related to Sqlite3 output #--------------------------------------------------------------------------- +# If the GENERATE_SQLITE3 tag is set to YES doxygen will generate a Sqlite3 +# database with symbols found by doxygen stored in tables. +# The default value is: NO. + +GENERATE_SQLITE3 = NO + +# The SQLITE3_OUTPUT tag is used to specify where the Sqlite3 database will be +# put. If a relative path is entered the value of OUTPUT_DIRECTORY will be put +# in front of it. +# The default directory is: sqlite3. +# This tag requires that the tag GENERATE_SQLITE3 is set to YES. + +SQLITE3_OUTPUT = sqlite3 + +# The SQLITE3_OVERWRITE_DB tag is set to YES, the existing doxygen_sqlite3.db +# database file will be recreated with each doxygen run. If set to NO, doxygen +# will warn if an a database file is already found and not modify it. +# The default value is: YES. +# This tag requires that the tag GENERATE_SQLITE3 is set to YES. + +SQLITE3_RECREATE_DB = YES + #--------------------------------------------------------------------------- # Configuration options related to the Perl module output #--------------------------------------------------------------------------- @@ -2257,7 +2310,7 @@ GENERATE_AUTOGEN_DEF = NO # Note that this feature is still experimental and incomplete at the moment. # The default value is: NO. -GENERATE_PERLMOD = NO +GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary # Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI @@ -2265,7 +2318,7 @@ GENERATE_PERLMOD = NO # The default value is: NO. # This tag requires that the tag GENERATE_PERLMOD is set to YES. -PERLMOD_LATEX = NO +PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely # formatted so it can be parsed by a human reader. This is useful if you want to @@ -2275,7 +2328,7 @@ PERLMOD_LATEX = NO # The default value is: YES. # This tag requires that the tag GENERATE_PERLMOD is set to YES. -PERLMOD_PRETTY = YES +PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file are # prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful @@ -2293,7 +2346,7 @@ PERLMOD_MAKEVAR_PREFIX = # C-preprocessor directives found in the sources and include files. # The default value is: YES. -ENABLE_PREPROCESSING = YES +ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names # in the source code. If set to NO, only conditional compilation will be @@ -2302,7 +2355,7 @@ ENABLE_PREPROCESSING = YES # The default value is: NO. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -MACRO_EXPANSION = YES +MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then # the macro expansion is limited to the macros specified with the PREDEFINED and @@ -2310,14 +2363,14 @@ MACRO_EXPANSION = YES # The default value is: NO. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -EXPAND_ONLY_PREDEF = YES +EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES, the include files in the # INCLUDE_PATH will be searched if a #include is found. # The default value is: YES. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -SEARCH_INCLUDES = YES +SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by the @@ -2325,7 +2378,7 @@ SEARCH_INCLUDES = YES # RECURSIVE has no effect here. # This tag requires that the tag SEARCH_INCLUDES is set to YES. -INCLUDE_PATH = +INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the @@ -2333,7 +2386,7 @@ INCLUDE_PATH = # used. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -INCLUDE_FILE_PATTERNS = +INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that are # defined before the preprocessor is started (similar to the -D option of e.g. @@ -2343,7 +2396,7 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = +PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The @@ -2352,7 +2405,7 @@ PREDEFINED = # definition found in the source code. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -EXPAND_AS_DEFINED = YES +EXPAND_AS_DEFINED = YES # If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will # remove all references to function-like macros that are alone on a line, have @@ -2362,7 +2415,7 @@ EXPAND_AS_DEFINED = YES # The default value is: YES. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -SKIP_FUNCTION_MACROS = NO +SKIP_FUNCTION_MACROS = NO #--------------------------------------------------------------------------- # Configuration options related to external references @@ -2381,51 +2434,44 @@ SKIP_FUNCTION_MACROS = NO # the path). If a tag file is not located in the directory in which doxygen is # run, you must also specify the path to the tagfile here. -TAGFILES = +TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create a # tag file that is based on the input files it reads. See section "Linking to # external documentation" for more information about the usage of tag files. -GENERATE_TAGFILE = +GENERATE_TAGFILE = -# If the ALLEXTERNALS tag is set to YES, all external class will be listed in -# the class index. If set to NO, only the inherited external classes will be -# listed. +# If the ALLEXTERNALS tag is set to YES, all external classes and namespaces +# will be listed in the class and namespace index. If set to NO, only the +# inherited external classes will be listed. # The default value is: NO. -ALLEXTERNALS = NO +ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed # in the modules index. If set to NO, only the current project's groups will be # listed. # The default value is: YES. -EXTERNAL_GROUPS = YES +EXTERNAL_GROUPS = YES # If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in # the related pages index. If set to NO, only the current project's pages will # be listed. # The default value is: YES. -EXTERNAL_PAGES = YES +EXTERNAL_PAGES = YES #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- -# You can include diagrams made with dia in doxygen documentation. Doxygen will -# then run dia to produce the diagram and insert it in the documentation. The -# DIA_PATH tag allows you to specify the directory where the dia binary resides. -# If left empty dia is assumed to be found in the default search path. - -DIA_PATH = - # If set to YES the inheritance and collaboration graphs will hide inheritance # and usage relations if the target is undocumented or is not a class. # The default value is: YES. -HIDE_UNDOC_RELATIONS = YES +HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz (see: @@ -2434,7 +2480,7 @@ HIDE_UNDOC_RELATIONS = YES # set to NO # The default value is: NO. -HAVE_DOT = NO +HAVE_DOT = NO # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed # to run in parallel. When set to 0 doxygen will base this on the number of @@ -2444,7 +2490,7 @@ HAVE_DOT = NO # Minimum value: 0, maximum value: 32, default value: 0. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_NUM_THREADS = 0 +DOT_NUM_THREADS = 0 # DOT_COMMON_ATTR is common attributes for nodes, edges and labels of # subgraphs. When you want a differently looking font in the dot files that @@ -2457,7 +2503,7 @@ DOT_NUM_THREADS = 0 # The default value is: fontname=Helvetica,fontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" +DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" # DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can # add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. -o . The external tool should support +# output file formats "png", "eps", "svg", and "ismap". + +MSCGEN_TOOL = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). + +MSCFILE_DIRS = diff --git a/apps/OpenSpace-MinVR/main.cpp b/apps/OpenSpace-MinVR/main.cpp index 6b43cfa748..8dcabe23c2 100644 --- a/apps/OpenSpace-MinVR/main.cpp +++ b/apps/OpenSpace-MinVR/main.cpp @@ -49,7 +49,6 @@ using namespace MinVR; using namespace openspace; -namespace { class Handler : public VREventHandler, public VRRenderHandler, public VRInputDevice { public: @@ -60,6 +59,8 @@ public: void appendNewInputEventsSinceLastCall(VRDataQueue* queue) override; }; +namespace { + constexpr std::string_view _loggerCat = "main_minvr"; VRMain engine; diff --git a/include/openspace/documentation/verifier.h b/include/openspace/documentation/verifier.h index 6bc3d302f9..5eeeba1c1b 100644 --- a/include/openspace/documentation/verifier.h +++ b/include/openspace/documentation/verifier.h @@ -497,7 +497,7 @@ public: * takes two template parameters. The first is the Verifier that one would use to only * check for the type of the object, for example IntVerifier. The second argument is a * function object that has its `operator()` function overloaded and returns a boolean - * value. In these cases, the `std` function objects `std::less`, `std::equal_to, etc are + * value. In these cases, the `std` function objects `std::less`, `std::equal_to`, etc are * used. * * This verifier will apply the `Operator` to the stored value and the incoming value diff --git a/include/openspace/mission/missionmanager.h b/include/openspace/mission/missionmanager.h index 4942941853..6e7d395b34 100644 --- a/include/openspace/mission/missionmanager.h +++ b/include/openspace/mission/missionmanager.h @@ -48,15 +48,11 @@ public: MissionManager(); /** - * Reads a mission from file and maps the mission name to the Mission object. If - * this is the first mission to be loaded, the mission will also be set as the - * current active mission. + * Loads the provided mission. If this is the first mission to be loaded, the mission + * will also be set as the current active mission. * - * \param filename The file that contains the mission that is to be loaded + * \param mission The file that contains the mission that is to be loaded * \return The name of the mission that was loaded - * \pre \p filename must not be empty - * \pre \p filename must not contain tokens - * \pre \p filename must exist */ std::string loadMission(Mission mission); @@ -64,7 +60,7 @@ public: * Unloads a previously loaded mission identified by the provided \p missionName. * * \param missionName The name of the mission that should be unloded - * \pre \p filename must not be empty + * * \pre \p missionName must be a valid mission that has previously been loaded */ void unloadMission(const std::string& missionName); diff --git a/include/openspace/navigation/waypoint.h b/include/openspace/navigation/waypoint.h index 34c6e4151e..c884adad20 100644 --- a/include/openspace/navigation/waypoint.h +++ b/include/openspace/navigation/waypoint.h @@ -81,8 +81,8 @@ struct NodeCameraStateSpec { * above the bounding sphere may also be given. * \param startPoint an optional previous waypoint. If not specified, the current camera * position will be used. - * \param userLinear if true, the new waypoint will be computed along a straight line - * from the start waypoint to the scene graph node or position. + * \param useLinear if true, the new waypoint will be computed along a straight line + * from the start waypoint to the scene graph node or position. * \return the computed WayPoint */ Waypoint computeWaypointFromNodeInfo(const NodeCameraStateSpec& spec, diff --git a/include/openspace/properties/templateproperty.h b/include/openspace/properties/templateproperty.h index 73c161f267..9d80a58d5d 100644 --- a/include/openspace/properties/templateproperty.h +++ b/include/openspace/properties/templateproperty.h @@ -113,7 +113,6 @@ public: * decoding is successful, the new value is set, otherwise it remains unchanged. * * \param state The Lua state from which the value will be decoded - * \return `true` if the decoding succeeded; `false` otherwise */ virtual void setLuaValue(lua_State* state) override; diff --git a/include/openspace/properties/triggerproperty.h b/include/openspace/properties/triggerproperty.h index 54311a57af..35bd620414 100644 --- a/include/openspace/properties/triggerproperty.h +++ b/include/openspace/properties/triggerproperty.h @@ -38,6 +38,7 @@ public: /** * Initializes the TriggerProperty by delegating the `identifier` and * `guiName` to the Property constructor. + * * \param info The PropertyInfo structure that contains all the required static * information for initializing this Property. * \pre \p info.identifier must not be empty @@ -47,6 +48,7 @@ public: /** * Returns the class name `TriggerProperty`. + * * \return The class name `TriggerProperty` */ std::string_view className() const override; @@ -54,14 +56,15 @@ public: /** * Accepts only the `LUA_TNIL` type and will notify all the listeners * that the event has been triggered. + * * \param state The unused Lua state - * \return Returns always `true` */ void setLuaValue(lua_State* state) override; /** * Silently ignores any value that is passed into this function and will trigger the * listeners regardless of the value + * * \param value The ignored value */ void set(std::any value) override; diff --git a/include/openspace/rendering/renderable.h b/include/openspace/rendering/renderable.h index 9ca5adfbd7..cb41bf07b4 100644 --- a/include/openspace/rendering/renderable.h +++ b/include/openspace/rendering/renderable.h @@ -44,15 +44,14 @@ namespace ghoul::opengl { namespace openspace { +class Camera; struct RenderData; -struct UpdateData; struct RendererTasks; struct SurfacePositionHandle; +struct UpdateData; namespace documentation { struct Documentation; } -class Camera; - // Unfortunately we can't move this struct into the Renderable until // https://bugs.llvm.org/show_bug.cgi?id=36684 is fixed struct RenderableSettings { @@ -102,7 +101,7 @@ public: // representation is, the 'surface' is always the sphere around which interaction is // handled virtual SurfacePositionHandle calculateSurfacePositionHandle( - const glm::dvec3& targetModelSpace) const; + const glm::dvec3& targetModelSpace) const; virtual bool renderedWithDesiredData() const; @@ -211,6 +210,8 @@ protected: }) const; private: + void registerUpdateRenderBinFromOpacity(); + double _boundingSphere = 0.0; double _interactionSphere = 0.0; SceneGraphNode* _parent = nullptr; @@ -218,8 +219,6 @@ private: bool _automaticallyUpdateRenderBin = true; bool _hasOverrideRenderBin = false; - void registerUpdateRenderBinFromOpacity(); - // We only want the SceneGraphNode to be able manipulate the parent, so we don't want // to provide a set method for this. Otherwise, anyone might mess around with our // parentage and that's no bueno diff --git a/include/openspace/scene/scene.h b/include/openspace/scene/scene.h index 188d20bad6..f6c6bd6fc6 100644 --- a/include/openspace/scene/scene.h +++ b/include/openspace/scene/scene.h @@ -67,8 +67,8 @@ public: struct InvalidSceneError : ghoul::RuntimeError { /** - * \param message The reason that caused this exception to be thrown - * \param component The optional compoment that caused this exception to be thrown + * \param msg The reason that caused this exception to be thrown + * \param comp The optional compoment that caused this exception to be thrown * \pre message may not be empty */ explicit InvalidSceneError(std::string msg, std::string comp = ""); @@ -195,7 +195,7 @@ public: * * \param prop The Property that should not longer be updated * - * \pre \prop must not be nullptr + * \pre \p prop must not be nullptr * \post No interpolation record exists for \p prop */ void removePropertyInterpolation(properties::Property* prop); @@ -203,11 +203,11 @@ public: /** * Informs all Property%s with active interpolations about applying a new update tick * using the Property::interpolateValue method, passing a parameter `t` which is `0` - * if no time has passed between the #addInterpolation method and `1` if an amount of - * time equal to the requested interpolation time has passed. The parameter `t` is - * updated with a resolution of 1 microsecond, which means that if this function is - * called twice within 1 microsecond, the passed parameter `t` might be the same for - * both calls + * if no time has passed between the #addPropertyInterpolation method and `1` if an + * amount of time equal to the requested interpolation time has passed. The parameter + * `t` is updated with a resolution of 1 microsecond, which means that if this + * function is called twice within 1 microsecond, the passed parameter `t` might be + * the same for both calls. */ void updateInterpolations(); @@ -281,9 +281,6 @@ private: * * \param L the lua state to (eventually) push to * \param value string representation of the value with which to set property - * \param didPushToLua Bool reference that represents the lua push state at the end - * of this function call. This will be set to true if the value (e.g. table) - * has already been pushed to the lua stack * \return The ProfilePropertyLua variant type translated from string representation */ ProfilePropertyLua propertyProcessValue(ghoul::lua::LuaState& L, diff --git a/include/openspace/util/json_helper.h b/include/openspace/util/json_helper.h index f3692dbeab..6761e6bfcf 100644 --- a/include/openspace/util/json_helper.h +++ b/include/openspace/util/json_helper.h @@ -72,7 +72,6 @@ std::string formatJson(T value); * * \param json The json to sort * \param key The key the json should be sorted by - * \return The sorted JSON */ void sortJson(nlohmann::json& json, const std::string& key); diff --git a/include/openspace/util/spicemanager.h b/include/openspace/util/spicemanager.h index eec285c09f..aad2c1f737 100644 --- a/include/openspace/util/spicemanager.h +++ b/include/openspace/util/spicemanager.h @@ -1008,7 +1008,6 @@ private: * by using mainly the `ckcov_c` and `ckobj_c` functions. * * \param path The path to the kernel that should be examined - * \return true if the operation was successful * * \pre \p path must be nonempty and be an existing file * \post Coverage times are stored only if loading was successful @@ -1023,7 +1022,6 @@ private: * by using mainly the `spkcov_c` and `spkobj_c` functions. * * \param path The path to the kernel that should be examined - * \return true if the operation was successful * * \pre \p path must be nonempty and be an existing file * \post Coverage times are stored only if loading was successful diff --git a/modules/base/rendering/renderabletrail.h b/modules/base/rendering/renderabletrail.h index a6a8a39188..d0635b0444 100644 --- a/modules/base/rendering/renderabletrail.h +++ b/modules/base/rendering/renderabletrail.h @@ -101,8 +101,10 @@ struct Appearance : properties::PropertyOwner { /** * The render method will set up the shader information and then render first the * information contained in the the `_primaryRenderInformation`, then the optional - * `_floatingRenderInformation` using the provided \p data + * `_floatingRenderInformation` using the provided \p data. + * * \param data The data that is necessary to render this Renderable + * \param rendererTask A place to store render tasks from this Renderable */ void render(const RenderData& data, RendererTasks& rendererTask) override; diff --git a/modules/fieldlinessequence/util/kameleonfieldlinehelper.cpp b/modules/fieldlinessequence/util/kameleonfieldlinehelper.cpp index 53e7a2cbb3..e17157b7e9 100644 --- a/modules/fieldlinessequence/util/kameleonfieldlinehelper.cpp +++ b/modules/fieldlinessequence/util/kameleonfieldlinehelper.cpp @@ -35,7 +35,7 @@ #ifdef _MSC_VER #pragma warning (push) - // Boost throws #pragma warning: there is no warning number '4675' +// Boost throws #pragma warning: there is no warning number '4675' #pragma warning (disable : 4619) #endif // _MSC_VER @@ -74,21 +74,6 @@ namespace openspace::fls { #endif // OPENSPACE_MODULE_KAMELEON_ENABLED // ------------------------------------------------------------------------------------ // -/** 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 the kameleon module to - * be activated! - * \param state, FieldlineState which should hold the extracted data - * \param cdfPath, std::string of the absolute path to a .cdf file - * \param seedPoints, vector of seed points from which to trace field lines - * \param tracingVar, which quantity to trace lines from. Typically "b" for magnetic field - * lines and "u" for velocity flow lines - * \param extraVars, extra scalar quantities to be stored in the FieldlinesState; e.g. "T" - * for temperature, "rho" for density or "P" for pressure - * \param extraMagVars, variables which should be used for extracting magnitudes, must be - * a multiple of 3; e.g. "ux", "uy" & "uz" to get the magnitude of the velocity - * vector at each line vertex - */ bool convertCdfToFieldlinesState(FieldlinesState& state, const std::string& cdfPath, const std::unordered_map>& seedMap, diff --git a/modules/fieldlinessequence/util/kameleonfieldlinehelper.h b/modules/fieldlinessequence/util/kameleonfieldlinehelper.h index af06f94365..8381a2a204 100644 --- a/modules/fieldlinessequence/util/kameleonfieldlinehelper.h +++ b/modules/fieldlinessequence/util/kameleonfieldlinehelper.h @@ -36,6 +36,23 @@ class FieldlinesState; namespace fls { +/** 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 the kameleon module to + * be activated! + * + * \param state FieldlineState which should hold the extracted data + * \param cdfPath std::string of the absolute path to a .cdf file + * \param seedMap vector of seed points from which to trace field lines + * \param manualTimeOffset an offset that is applied to all fieldlines + * \param tracingVar which quantity to trace lines from. Typically "b" for magnetic field + * lines and "u" for velocity flow lines + * \param extraVars extra scalar quantities to be stored in the FieldlinesState; e.g. "T" + * for temperature, "rho" for density or "P" for pressure + * \param extraMagVars variables which should be used for extracting magnitudes, must be + * a multiple of 3; e.g. "ux", "uy" & "uz" to get the magnitude of the velocity + * vector at each line vertex + */ bool convertCdfToFieldlinesState(FieldlinesState& state, const std::string& cdfPath, const std::unordered_map>& seedMap, double manualTimeOffset, const std::string& tracingVar, diff --git a/modules/gaia/rendering/octreemanager.h b/modules/gaia/rendering/octreemanager.h index 6deac38b55..e15aae9cf7 100644 --- a/modules/gaia/rendering/octreemanager.h +++ b/modules/gaia/rendering/octreemanager.h @@ -64,16 +64,13 @@ public: /** * Initializes a one layer Octree with root and 8 children that covers all stars. - * - * \param maxDist together with \param maxstarsPerNode (if defined) determines the - * depth of the tree as well as how many nodes will be created. */ void initOctree(long long cpuRamBudget = 0, int maxDist = 0, int maxStarsPerNode = 0); /** - * Initializes a stack of size \param maxNodes that keeps track of all free spot in - * buffer stream. Can be used to trigger a rebuild of buffer(s). + * Initializes a stack. Can be used to trigger a rebuild of buffer(s). * + * \param maxNodes the maximum number of nodes in the buffer * \param useVBO defines if VBO or SSBO is used as buffer(s) * \param datasetFitInMemory defines if streaming of nodes during runtime is used */ @@ -113,8 +110,8 @@ public: * Builds render data structure by traversing the Octree and checking for intersection * with view frustum. Every vector in map contains data for one node. * The corresponding integer key is the index where chunk should be inserted into - * streaming buffer. Calls `checkNodeIntersection()` for every branch. - * \pdeltaStars keeps track of how many stars that were added/removed this render + * streaming buffer. Calls #checkNodeIntersection for every branch. + * \p deltaStars keeps track of how many stars that were added/removed this render * call. */ std::map> traverseData(const glm::dmat4& mvp, @@ -133,27 +130,33 @@ public: void clearAllData(int branchIndex = -1); /** - * Write entire Octree structure to a binary file. \param writeData defines if data - * should be included or if only structure should be written to the file. - * Calls `writeNodeToFile()` which recursively writes all nodes. + * Write entire Octree structure to a binary file. + * + * \param outFileStream the stream to which the file will be written + * \param writeData defines if data should be included or if only structure should be + * written to the file. Calls #writeNodeToFile which recursively writes all + * nodes */ void writeToFile(std::ofstream& outFileStream, bool writeData); /** - * Read a constructed Octree from a file. \returns the total number of (distinct) - * stars read. + * Read a constructed Octree from a file. * + * \param inFileStream the stream from which the octree should be loaded * \param readData defines if full data or only structure should be read. - * Calls `readNodeFromFile()` which recursively reads all nodes. + * Calls `readNodeFromFile()` which recursively reads all nodes + * \param folderPath the path to the folder where the binary files are located + * \return the total number of (distinct) stars read */ int readFromFile(std::ifstream& inFileStream, bool readData, const std::string& folderPath = std::string()); /** * Write specified part of Octree to multiple files, including all data. - * \param branchIndex defines which branch to write. - * Clears specified branch after writing is done. - * Calls `writeNodeToMultipleFiles()` for the specified branch. + * + * \param outFolderPath The path where files should be written + * \param branchIndex Defines which branch to write. Clears specified branch after + * writing is done. Calls `writeNodeToMultipleFiles()` for the specified branch */ void writeToMultipleFiles(const std::string& outFolderPath, size_t branchIndex); @@ -171,7 +174,7 @@ public: bool isRebuildOngoing() const; /** - * \returns current CPU RAM budget in bytes. + * \return current CPU RAM budget in bytes. */ long long cpuRamBudget() const; @@ -230,6 +233,8 @@ private: /** * Private help function for `printStarsPerNode()`. * + * \param node the node for which the stars should be printed + * \param prefix the prefix that should be added to the string * \return an accumulated string containing all descendant nodes. */ std::string printStarsPerNode(const OctreeNode& node, @@ -239,8 +244,14 @@ private: * Private help function for `traverseData()`. Recursively checks which * nodes intersect with the view frustum (interpreted as an AABB) and decides if data * should be optimized away or not. Keeps track of which nodes that are visible and - * loaded (if streaming). \param deltaStars keeps track of how many stars that were - * added/removed this render call. + * loaded (if streaming). + * + * \param node the node that should be checked + * \param mvp the model-view-projection matrix used to check intersection + * \param screenSize the size of the screen in pixels + * \param deltaStars keeps track of how many stars that were added/removed this render + * call + * \param mode the render mode that should be used */ std::map> checkNodeIntersection(OctreeNode& node, const glm::dmat4& mvp, const glm::vec2& screenSize, int& deltaStars, @@ -249,8 +260,11 @@ private: /** * Checks if specified node existed in cache, and removes it if that's the case. * If node is an inner node then all children will be checked recursively as well as - * long as \param recursive is not set to false. \param deltaStars keeps track of how - * many stars that were removed. + * 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 recursive defines if decentents should be removed as well */ std::map> removeNodeFromCache(OctreeNode& node, int& deltaStars, bool recursive = true); @@ -271,40 +285,52 @@ private: void createNodeChildren(OctreeNode& node); /** - * Checks if node should be inserted into stream or not. \returns true if it should, - * (i.e. it doesn't already exists, there is room for it in the buffer and node data - * is loaded if streaming). \returns false otherwise. + * Checks if node should be inserted into stream or not. + * + * \return `true` if it should, (i.e. it doesn't already exists, there is room for it + * in the buffer and node data is loaded if streaming), `false` otherwise */ bool updateBufferIndex(OctreeNode& node); /** - * Node should be inserted into stream. This function \returns the data to be - * inserted. If VBOs are used then the chunks will be appended by zeros, otherwise - * only the star data corresponding to RenderOption \param option will be inserted. + * Node should be inserted into stream. * + * \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. + * \returns the data to be inserted */ std::vector constructInsertData(const OctreeNode& node, gaia::RenderMode mode, int& deltaStars); /** - * Write a node to outFileStream. \param writeData defines if data should be included - * or if only structure should be written. + * Write a node to outFileStream. + * + * \param outFileStream the stream to which the node will be written + * \param node the OctreeNode that should be written to file + * \param writeData defines if data should be included or if only structure should be + * written */ void writeNodeToFile(std::ofstream& outFileStream, const OctreeNode& node, bool writeData); /** - * Read a node from file and its potential children. \param readData defines if full - * data or only structure should be read. - * \returns accumulated sum of all read stars in node and its descendants. + * Read a node from file and its potential children. + * + * \param inFileStream the stream from which the node will be read + * \param node the file will be read into this node + * \param readData defines if full data or only structure should be read + * \return accumulated sum of all read stars in node and its descendants. */ int readNodeFromFile(std::ifstream& inFileStream, OctreeNode& node, bool readData); /** - * Write node data to a file. \param outFilePrefix specifies the accumulated path - * and name of the file. If \param threadWrites is set to true then one new thread - * will be created for each child to write its descendents. + * Write node data to a file. + * + * \param outFilePrefix specifies the accumulated path and name of the file + * \param node the OctreeNode that should be written to file + * \param threadWrites is set to true then one new thread will be created for each + * child to write its descendents */ void writeNodeToMultipleFiles(const std::string& outFilePrefix, OctreeNode& node, bool threadWrites); @@ -312,19 +338,27 @@ private: /** * Finds the neighboring node on the same level (or a higher level if there is no * corresponding level) in the specified direction. Also fetches data from found node - * if it's not already loaded. \param additionalLevelsToFetch determines if any - * descendants of the found node should be fetched as well (if they exists). + * if it's not already loaded. + * + * \param firstParentId the id of the first parent node that should be checked + * \param x the x coordinate of the node that should be found + * \param y the y coordinate of the node that should be found + * \param z the z coordinate of the node that should be found + * \param additionalLevelsToFetch determines if any descendants of the found node + * should be fetched as well (if they exists). */ void findAndFetchNeighborNode(unsigned long long firstParentId, int x, int y, int z, int additionalLevelsToFetch); /** - * Fetches data from all children of \param parentNode, as long as it's not already + * Fetches data from all children of the \p parentNode, as long as it's not already * fetched, it exists and it can fit in RAM. + * + * \param parentNode the node whose children should be fetched * \param additionalLevelsToFetch determines how many levels of descendants to fetch. - * If it is set to 0 no additional level will be fetched. - * If it is set to a negative value then all descendants will be fetched recursively. - * Calls `fetchNodeDataFromFile()` for every child that passes the tests. + * If it is set to 0 no additional level will be fetched. If it is set to a + * negative value then all descendants will be fetched recursively. Calls + * #fetchNodeDataFromFile for every child that passes the tests */ void fetchChildrenNodes(OctreeNode& parentNode, int additionalLevelsToFetch); @@ -336,9 +370,11 @@ private: void fetchNodeDataFromFile(OctreeNode& node); /** - * Loops though all nodes in \param nodesToRemove and clears them from RAM. - * Also checks if any ancestor should change the `hasLoadedDescendant` flag - * by calling `propagateUnloadedNodes()` with all ancestors. + * Loops though all nodes in \p nodesToRemove and clears them from RAM. Also checks if + * any ancestor should change the `hasLoadedDescendant` flag by calling + * #propagateUnloadedNodes() with all ancestors. + * + * \param nodesToRemove list of the nodes that should be deleted */ void removeNodesFromRam(const std::vector& nodesToRemove); @@ -349,9 +385,11 @@ private: void removeNode(OctreeNode& node); /** - * Loops through \param ancestorNodes backwards and checks if parent node has any + * Loops through \p ancestorNodes backwards and checks if parent node has any * loaded descendants left. If not, then flag `hasLoadedDescendant` will be * set to false for that parent node and next parent in line will be checked. + * + * \param ancestorNodes the list of ancestors that should be checked */ void propagateUnloadedNodes(std::vector> ancestorNodes); diff --git a/modules/gaia/tasks/constructoctreetask.h b/modules/gaia/tasks/constructoctreetask.h index fc4e08ea82..1aa1d49adf 100644 --- a/modules/gaia/tasks/constructoctreetask.h +++ b/modules/gaia/tasks/constructoctreetask.h @@ -74,10 +74,11 @@ private: bool checkAllFilters(const std::vector& filterValues); /** - * \returns true if star should be filtered away and false if all filters passed. - * \param range contains ]min, max[ and \param filterValue corresponding value in + * \p range contains ]min, max[ and \p filterValue corresponding value in * star. Star is filtered either if min = max = filterValue or if filterValue < min * (when min != 0.0) or filterValue > max (when max != 0.0). + * + * \return true if star should be filtered away and false if all filters passed. */ bool filterStar(const glm::vec2& range, float filterValue, float normValue = 0.f); diff --git a/modules/gaia/tasks/readfilejob.h b/modules/gaia/tasks/readfilejob.h index 7661ef6154..f1fa487b43 100644 --- a/modules/gaia/tasks/readfilejob.h +++ b/modules/gaia/tasks/readfilejob.h @@ -35,14 +35,19 @@ struct ReadFileJob : public Job>> { /** * Constructs a Job that will read a single FITS file in a concurrent thread and * divide the star data into 8 octants depending on position. + * + * \param filePath the file from which to load the data * \param allColumns define which columns that will be read, it should correspond - * to the pre-defined order in the job. If additional columns are defined they will - * be read but slow down the process. - * Proper conversions of positions and velocities will take place and all values - * will be checked for NaNs. - * If \param firstRow is < 1 then reading will begin at first row in table. - * If \param lastRow < firstRow then entire table will be read. - * \param nValuesPerStar defines how many values that will be stored per star. + * to the pre-defined order in the job. If additional columns are defined they + * will be read but slow down the process. Proper conversions of positions and + * velocities will take place and all values will be checked for NaNs. If + * \p firstRow is < 1 then reading will begin at first row in table. If + * \p lastRow < firstRow then entire table will be read + * \param firstRow the index of the first row to be read + * \param lastRow the index of the last row to be read + * \param nDefaultCols defines how many columns that will be read per star + * \param nValuesPerStar defines how many values that will be stored per star + * \param fitsReader the reader that should be used in this job */ ReadFileJob(std::string filePath, std::vector allColumns, int firstRow, int lastRow, size_t nDefaultCols, int nValuesPerStar, diff --git a/modules/gaia/tasks/readfitstask.h b/modules/gaia/tasks/readfitstask.h index a3d4838f38..8236a572ba 100644 --- a/modules/gaia/tasks/readfitstask.h +++ b/modules/gaia/tasks/readfitstask.h @@ -61,10 +61,14 @@ private: void readAllFitsFilesFromFolder(const Task::ProgressCallback& progressCallback); /** - * Writes \param data to octant [\param index] file. + * Writes data to an octant file. + * + * \param data the data that should be be written to file + * \param index the index of the octant that should be written * \param isFirstWrite defines if this is the first write to specified octant, if so - * the file is created, otherwise the accumulated data is appended to the end of the - * file. + * the file is created, otherwise the accumulated data is appended to the end + * of the file + * \param nValuesPerStar the number of values that should be stored per star */ int writeOctantToFile(const std::vector& data, int index, std::vector& isFirstWrite, int nValuesPerStar); diff --git a/modules/globebrowsing/src/asynctiledataprovider.h b/modules/globebrowsing/src/asynctiledataprovider.h index d7d68681af..10f5dcc204 100644 --- a/modules/globebrowsing/src/asynctiledataprovider.h +++ b/modules/globebrowsing/src/asynctiledataprovider.h @@ -44,8 +44,9 @@ struct RawTile; class AsyncTileDataProvider { public: /** + * \param name is the name for this provider * \param rawTileDataReader is the reader that will be used for the asynchronous - * tile loading. + * tile loading */ AsyncTileDataProvider(std::string name, std::unique_ptr rawTileDataReader); diff --git a/modules/globebrowsing/src/memoryawaretilecache.h b/modules/globebrowsing/src/memoryawaretilecache.h index 10cf9f9115..0a9f6f5431 100644 --- a/modules/globebrowsing/src/memoryawaretilecache.h +++ b/modules/globebrowsing/src/memoryawaretilecache.h @@ -57,7 +57,7 @@ struct ProviderTileHasher { * Creates a hash which can be used as key in hash maps. * First set the bits to be unique for all tiles. * +-------+------------+-------+------------+ - * | USAGE | BIT RANGE | #BITS | MAX VALUE | + * | USAGE | BIT RANGE | BITS | MAX VALUE | * +-------+------------+-------+------------+ * | level | 0 - 5 | 5 | 31 | * | x | 5 - 35 | 30 | 1073741824 | diff --git a/modules/globebrowsing/src/rawtiledatareader.h b/modules/globebrowsing/src/rawtiledatareader.h index f2860846d5..42739cf63c 100644 --- a/modules/globebrowsing/src/rawtiledatareader.h +++ b/modules/globebrowsing/src/rawtiledatareader.h @@ -49,9 +49,12 @@ public: * Opens a GDALDataset in readonly mode and calculates meta data required for * reading tile using a TileIndex. * - * \param filePath, a path to a specific file GDAL can read - * \param config, Configuration used for initialization - * \param baseDirectory, the base directory to use in future loading operations + * \param filePath the path to a specific file GDAL can read + * \param initData information about the textures that will be creatd by this reader + * \param cacheProperties contains settings about whether the reader should + * utilize cache + * \param preprocess whether the loaded data should be calculate meta data about the + * dataset */ RawTileDataReader(std::string filePath, TileTextureInitData initData, TileCacheProperties cacheProperties, diff --git a/modules/globebrowsing/src/skirtedgrid.h b/modules/globebrowsing/src/skirtedgrid.h index 49ce527d53..ed5bd54885 100644 --- a/modules/globebrowsing/src/skirtedgrid.h +++ b/modules/globebrowsing/src/skirtedgrid.h @@ -41,12 +41,6 @@ public: /** * \param xSegments is the number of grid cells in the x direction. * \param ySegments is the number of grid cells in the y direction. - * \param usePositions determines whether or not to upload any vertex position data - * to the GPU. - * \param useTextureCoordinates determines whether or not to upload any vertex texture - * coordinate data to the GPU. - * \param useNormals determines whether or not to upload any vertex normal data - * to the GPU. */ SkirtedGrid(unsigned int xSegments, unsigned int ySegments); ~SkirtedGrid() = default; diff --git a/modules/globebrowsing/src/timequantizer.h b/modules/globebrowsing/src/timequantizer.h index 0f788dde9d..cae3ea89e1 100644 --- a/modules/globebrowsing/src/timequantizer.h +++ b/modules/globebrowsing/src/timequantizer.h @@ -33,7 +33,8 @@ namespace openspace { class Time; } namespace openspace::globebrowsing { -/* RangedTime class is used to define an acceptable time range. Functionality includes +/** + * RangedTime class is used to define an acceptable time range. Functionality includes * checking if a given date/time is within that range, or clamping a date to enforce * this range. */ @@ -41,8 +42,8 @@ class RangedTime { public: RangedTime() {} - /* - * Constructor that accepts an ISO8601 date/time string (YYYY-MM-DDTHH:mm:ss) for an + /** + * Constructor that accepts an ISO8601 date/time string (`YYYY-MM-DDTHH:mm:ss`) for an * allowable time range defined by start and end values. * * \param start The date/time start of the time range. @@ -50,52 +51,50 @@ public: */ RangedTime(std::string start, std::string end); - /* + /** * Checks if a date/time value falls within the start/end range defined in this * instance of the class. * * \param checkTime The time to test if it falls within the range - * - * \returns true if the input date/time falls between the start and end date/times + * \return true if the input date/time falls between the start and end date/times */ bool includes(const Time& checkTime) const; - /* + /** * Enforces the start/end range on a given date/time string by clamping the value * * \param checkTime An ISO8601 date/time string to clamp if falls outside of range - * - * \returns clamped value of input parameter, will be equal to the start value if - * less than start, equal to end if greater than end, or equal to input - * parameter if falls in-between + * \return clamped value of input parameter, will be equal to the start value if + * less than start, equal to end if greater than end, or equal to input + * parameter if falls in-between */ const char* clamp(const char* checkTime); - /* + /** * Get the start date/time of the time range * - * \returns The ISO8601 date/time string that defines the start of the range + * \return The ISO8601 date/time string that defines the start of the range */ std::string_view start() const; - /* + /** * Get the end date/time of the time range * - * \returns The ISO8601 date/time string that defines the end of the range + * \return The ISO8601 date/time string that defines the end of the range */ std::string_view end() const; - /* + /** * Set the start date/time of the time range * - * \param The ISO8601 date/time string that defines the start of the range + * \param start The ISO8601 date/time string that defines the start of the range */ void setStart(const std::string start); - /* + /** * Set the end date/time of the time range * - * \param The ISO8601 date/time string that defines the end of the range + * \param start The ISO8601 date/time string that defines the end of the range */ void setEnd(const std::string start); @@ -106,7 +105,8 @@ private: double _endJ2000; }; -/* DateTime class is used to manage a date/time value and provide methods for increment/ +/** + * DateTime class is used to manage a date/time value and provide methods for increment/ * decrementing the value, which gets complicated because of the varying days of the * different months, leap years, etc. * This class exists to handle date/time values within a "people-friendly" calendar @@ -117,108 +117,120 @@ private: class DateTime { public: DateTime() = default; - /* - * Constructor that initializes with date/time string + /** + * Constructor that initializes with date/time string. * - * \params initDateTime the ISO8601 date/time string (YYYY-MM-DDTHH:mm:ss) + * \param initDateTime the ISO8601 date/time string (`YYYY-MM-DDTHH:mm:ss`) */ DateTime(std::string_view initDateTime); - /* - * Set the date/time value + /** + * Set the date/time value. * - * \params input the ISO8601 date/time string (YYYY-MM-DDTHH:mm:ss) to set + * \param input the ISO8601 date/time string (`YYYY-MM-DDTHH:mm:ss`) to set */ void setTime(std::string_view input); - /* - * Get the date/time value in ISO8601 format + /** + * Get the date/time value in ISO8601 format. * - * \returns the date/time value string + * \return the date/time value string */ std::string ISO8601() const; - /* + /** * Get the J2000 seconds equivalent of the object's date/time, using - * the loaded SPICE kernel + * the loaded SPICE kernel. * - * \returns J2000 seconds of date/time + * \return J2000 seconds of date/time */ double J2000() const; - /* - * Get the year of the object's date/time (YYYY format) - * \returns integer value of the year + /** + * Get the year of the object's date/time (YYYY format). + * + * \return integer value of the year */ int year() const; - /* - * Get the month of the object's date/time (1 - 12) - * \returns integer value of the month + /** + * Get the month of the object's date/time (1 - 12). + * + * \return integer value of the month */ int month() const; - /* - * Get the day-of-month of the object's date/time (1 - 31) - * \returns integer value of the day + /** + * Get the day-of-month of the object's date/time (1 - 31). + * + * \return integer value of the day */ int day() const; - /* + /** * Get the hour of the object's date/time - * \returns integer value of the hour (0 - 23) + * + * \return integer value of the hour (0 - 23) */ int hour() const; - /* + /** * Get the minute of the object's date/time - * \returns integer value of the minutes + * + * \return integer value of the minutes */ int minute() const; - /* + /** * Get the seconds of the object's date/time - * \returns integer value of the seconds + * + * \return integer value of the seconds */ int second() const; - /* + /** * Set the year of the object's date/time + * * \param y integer value of the year */ void setYear(int y); - /* + /** * Set the month of the object's date/time (1 - 12) + * * \param m integer value of the year */ void setMonth(int m); - /* + /** * Set the day-of-month of the object's date/time (1 - 31) + * * \param d integer value of the day */ void setDay(int d); - /* + /** * Set the hour of the object's date/time (0 - 23) + * * \param h integer value of the hour */ void setHour(int h); - /* + /** * Set the minute of the object's date/time + * * \param m integer value of the minute */ void setMinute(int m); - /* + /** * Set the seconds of the object's date/time + * * \param s integer value of the seconds */ void setSecond(int s); - /* + /** * Increment operation for the date/time * * \param value integer value for number of units in an operation @@ -227,14 +239,13 @@ public: * \param error The difference in J2000 seconds from current date/time to target * (a positive value means target is in the future) * \param resolution The J2000 seconds of the interval defined by the value & unit - * - * \returns The number of increments that were performed in order to get as close as - * possible to the target, where each increment is defined by the value & - * unit (and approximated but not fixed by the resolution param) + * \return The number of increments that were performed in order to get as close as + * possible to the target, where each increment is defined by the value & + * unit (and approximated but not fixed by the resolution param) */ int increment(int value, char unit, double error, double resolution); - /* + /** * Decrement operation for the date/time * * \param value integer value for number of units in an operation @@ -243,14 +254,13 @@ public: * \param error The difference in J2000 seconds from current date/time to target * (a positive value means target is in the future) * \param resolution The J2000 seconds of the interval defined by the value & unit - * - * \returns The number of decrements that were performed in order to get as close as - * possible to the target, where each decrement is defined by the value & - * unit (and approximated but not fixed by the resolution param) + * \return The number of decrements that were performed in order to get as close as + * possible to the target, where each decrement is defined by the value & + * unit (and approximated but not fixed by the resolution param) */ int decrement(int value, char unit, double error, double resolution); - /* + /** * Single increment operation for the date/time * * \param value integer value for number of units in an operation @@ -259,7 +269,7 @@ public: */ void incrementOnce(int value, char unit); - /* + /** * Single decrement operation for the date/time * * \param value integer value for number of units in an operation @@ -278,74 +288,74 @@ private: }; /** -* Used to quantize time to discrete values. -*/ + * Used to quantize time to discrete values. + */ class TimeQuantizer { public: TimeQuantizer() = default; - /* + + /** * Constructor that initializes with formatted strings for start & ends date/times, * and a time resolution within that range * - * \params start the ISO8601 date/time string (YYYY-MM-DDTHH:mm:ss) for start - * \params end the ISO8601 date/time string (YYYY-MM-DDTHH:mm:ss) for end - * \params resolution the formatted resolution, which consists of an integer & unit - * character. The acceptable unit characters are: - * (y)ear Example: '1y' = 1 year. No range limitations - * (M)onth Example: '4M' = 4 months. Allowable values: 1, 2, 3, 4, 6 - * (d)ay Example: '10d' = 10 days. Allowable values: 1 - 28 - * (h)our Example: '12h' = 12 hours. Allowable values: 1, 2, 3, 4, 6, 12 - * (m)inute Example: '15m' = 15 minutes. Allowable values: 0, 15, 30 + * \param start the ISO8601 date/time string (YYYY-MM-DDTHH:mm:ss) for start + * \param end the ISO8601 date/time string (YYYY-MM-DDTHH:mm:ss) for end + * \param resolution the formatted resolution, which consists of an integer & unit + * character. The acceptable unit characters are: + * (y)ear Example: '1y' = 1 year. No range limitations + * (M)onth Example: '4M' = 4 months. Allowable values: 1, 2, 3, 4, 6 + * (d)ay Example: '10d' = 10 days. Allowable values: 1 - 28 + * (h)our Example: '12h' = 12 hours. Allowable values: 1, 2, 3, 4, 6, 12 + * (m)inute Example: '15m' = 15 minutes. Allowable values: 0, 15, 30 */ TimeQuantizer(std::string start, std::string end, const std::string& resolution); - /* + /** * Set the time range start & end date/time range. * * \param start The ISO8601 date/time string for start of the time range - * \param end The ISO8601 date/time string for end of the time range. + * \param end The ISO8601 date/time string for end of the time range. */ void setStartEndRange(const std::string& start, const std::string& end); - /* + /** * Set the time resolution * * \param resolutionString String that defines the resolution within the time range. - * see comment header for constructor for the allowable - * values and ranges. + * see comment header for constructor for the allowable values and ranges. */ void setResolution(const std::string& resolutionString); /** - * Takes a time resulition string and parses it into a double - * value representing the time resolution as seconds. - * - * Example: parseTimeResolutionStr("1d"); - * - * \param resolutionStr with the format {number}{unit} where supported units are: - * (s)econds, (m)inutes, (h)ours, (d)ays, (y)ears - * \return the time resolution in seconds - */ + * Takes a time resulition string and parses it into a double + * value representing the time resolution as seconds. + * + * Example: parseTimeResolutionStr("1d"); + * + * \param resolutionStr with the format {number}{unit} where supported units are: + * (s)econds, (m)inutes, (h)ours, (d)ays, (y)ears + * \return the time resolution in seconds + */ double parseTimeResolutionStr(const std::string& resolutionStr); /** - * Quantizes a OpenSpace Time into descrete values. If the provided Time \p t is - * outside the time range, it will be clamped to the the time range. - * - * \param t Time instance, which will be quantized - * \param clamp Whether or not time should be clamped if not t is in the time range - * \return wether or not time was quantized - */ + * Quantizes a OpenSpace Time into descrete values. If the provided Time \p t is + * outside the time range, it will be clamped to the the time range. + * + * \param t Time instance, which will be quantized + * \param clamp Whether or not time should be clamped if not t is in the time range + * \return wether or not time was quantized + */ bool quantize(Time& t, bool clamp); /** - * Returns a list of quantized Time strings that represent all the valid quantized - * time%s between \p start and \p end. - * - * \param start The start time for the time range quantization - * \param end The end time for the time range quantization - * \return A list of quantized times between \p start and \end - */ + * Returns a list of quantized Time strings that represent all the valid quantized + * time%s between \p start and \p end. + * + * \param start The start time for the time range quantization + * \param end The end time for the time range quantization + * \return A list of quantized times between \p start and \p end + */ std::vector quantized(Time& start, Time& end); private: diff --git a/modules/space/translation/gptranslation.h b/modules/space/translation/gptranslation.h index b93ddee990..e07d2925a0 100644 --- a/modules/space/translation/gptranslation.h +++ b/modules/space/translation/gptranslation.h @@ -40,7 +40,8 @@ public: * the file that contains the general pertubation information as well as the file * format that is to be used. * - * \param The ghoul::Dictionary that contains the information for this TLETranslation + * \param dictionary The ghoul::Dictionary that contains the information for this + * TLETranslation */ explicit GPTranslation(const ghoul::Dictionary& dictionary); diff --git a/modules/space/translation/keplertranslation.h b/modules/space/translation/keplertranslation.h index e68e0a67de..99f4c375cb 100644 --- a/modules/space/translation/keplertranslation.h +++ b/modules/space/translation/keplertranslation.h @@ -66,7 +66,7 @@ public: /** * Method returning the translation vector at a given time. * - * \param time The time to use when doing the position lookup + * \param data provides information from the engine about, for example, the time */ glm::dvec3 position(const UpdateData& data) const override; diff --git a/modules/webbrowser/include/browserinstance.h b/modules/webbrowser/include/browserinstance.h index aa2d1c46c7..73fc907c0d 100644 --- a/modules/webbrowser/include/browserinstance.h +++ b/modules/webbrowser/include/browserinstance.h @@ -75,7 +75,7 @@ public: /** * Call when the window has been reshaped. * - * \param wrapper the windowWrapper capable of + * \param windowSize the size of the window in pixels */ void reshape(const glm::ivec2& windowSize); diff --git a/modules/webbrowser/include/eventhandler.h b/modules/webbrowser/include/eventhandler.h index 683a60fbc9..b2754eb7ef 100644 --- a/modules/webbrowser/include/eventhandler.h +++ b/modules/webbrowser/include/eventhandler.h @@ -73,6 +73,8 @@ private: * sent to CEF. * * \param key the pressed key + * \param mods the key modifier that was pressed + * \param action the action that was performed that triggered this event * \return true if event found, false otherwise */ bool specialKeyEvent(Key key, KeyModifier mods, KeyAction action); diff --git a/src/documentation/verifier.cpp b/src/documentation/verifier.cpp index 30536b6cdd..ebbfec3dff 100644 --- a/src/documentation/verifier.cpp +++ b/src/documentation/verifier.cpp @@ -35,89 +35,87 @@ namespace openspace::documentation { // The explicit template instantiations for many of the commonly used template values // This cuts down on the compilation time by only compiling these once -template struct Vector2Verifier; -template struct Vector2Verifier; -template struct Vector3Verifier; -template struct Vector3Verifier; -template struct Vector4Verifier; -template struct Vector4Verifier; +template class Vector2Verifier; +template class Vector2Verifier; +template class Vector3Verifier; +template class Vector3Verifier; +template class Vector4Verifier; +template class Vector4Verifier; -template struct Vector2ListVerifier; -template struct Vector2ListVerifier; -template struct Vector3ListVerifier; -template struct Vector3ListVerifier; -template struct Vector4ListVerifier; -template struct Vector4ListVerifier; +template class Vector2ListVerifier; +template class Vector2ListVerifier; +template class Vector3ListVerifier; +template class Vector3ListVerifier; +template class Vector4ListVerifier; +template class Vector4ListVerifier; +template class Matrix2x2Verifier; +template class Matrix2x3Verifier; +template class Matrix2x4Verifier; +template class Matrix3x2Verifier; +template class Matrix3x3Verifier; +template class Matrix3x4Verifier; +template class Matrix4x2Verifier; +template class Matrix4x3Verifier; +template class Matrix4x4Verifier; -template struct Matrix2x2Verifier; -template struct Matrix2x3Verifier; -template struct Matrix2x4Verifier; -template struct Matrix3x2Verifier; -template struct Matrix3x3Verifier; -template struct Matrix3x4Verifier; -template struct Matrix4x2Verifier; -template struct Matrix4x3Verifier; -template struct Matrix4x4Verifier; +template class LessVerifier; +template class LessVerifier; +template class LessEqualVerifier; +template class LessEqualVerifier; +template class GreaterVerifier; +template class GreaterVerifier; +template class GreaterEqualVerifier; +template class GreaterEqualVerifier; +template class EqualVerifier; +template class EqualVerifier; +template class EqualVerifier; +template class EqualVerifier; +template class UnequalVerifier; +template class UnequalVerifier; +template class UnequalVerifier; +template class UnequalVerifier; -template struct LessVerifier; -template struct LessVerifier; -template struct LessEqualVerifier; -template struct LessEqualVerifier; -template struct GreaterVerifier; -template struct GreaterVerifier; -template struct GreaterEqualVerifier; -template struct GreaterEqualVerifier; -template struct EqualVerifier; -template struct EqualVerifier; -template struct EqualVerifier; -template struct EqualVerifier; -template struct UnequalVerifier; -template struct UnequalVerifier; -template struct UnequalVerifier; -template struct UnequalVerifier; +template class InListVerifier; +template class InListVerifier; +template class InListVerifier; +template class InListVerifier; +template class NotInListVerifier; +template class NotInListVerifier; +template class NotInListVerifier; +template class NotInListVerifier; -template struct InListVerifier; -template struct InListVerifier; -template struct InListVerifier; -template struct InListVerifier; -template struct NotInListVerifier; -template struct NotInListVerifier; -template struct NotInListVerifier; -template struct NotInListVerifier; +template class InRangeVerifier; +template class InRangeVerifier; +template class InRangeVerifier; +template class InRangeVerifier; +template class InRangeVerifier; +template class InRangeVerifier; +template class InRangeVerifier; +template class InRangeVerifier; +template class NotInRangeVerifier; +template class NotInRangeVerifier; +template class NotInRangeVerifier; +template class NotInRangeVerifier; +template class NotInRangeVerifier; +template class NotInRangeVerifier; +template class NotInRangeVerifier; +template class NotInRangeVerifier; -template struct InRangeVerifier; -template struct InRangeVerifier; -template struct InRangeVerifier; -template struct InRangeVerifier; -template struct InRangeVerifier; -template struct InRangeVerifier; -template struct InRangeVerifier; -template struct InRangeVerifier; -template struct NotInRangeVerifier; -template struct NotInRangeVerifier; -template struct NotInRangeVerifier; -template struct NotInRangeVerifier; -template struct NotInRangeVerifier; -template struct NotInRangeVerifier; -template struct NotInRangeVerifier; -template struct NotInRangeVerifier; - - -template struct AnnotationVerifier; -template struct AnnotationVerifier; -template struct AnnotationVerifier; -template struct AnnotationVerifier; -template struct AnnotationVerifier; -//template struct AnnotationVerifier; -template struct AnnotationVerifier; -template struct AnnotationVerifier; -//template struct AnnotationVerifier; -template struct AnnotationVerifier; -template struct AnnotationVerifier; -//template struct AnnotationVerifier; -template struct AnnotationVerifier; -template struct AnnotationVerifier; +template class AnnotationVerifier; +template class AnnotationVerifier; +template class AnnotationVerifier; +template class AnnotationVerifier; +template class AnnotationVerifier; +//template class AnnotationVerifier; +template class AnnotationVerifier; +template class AnnotationVerifier; +//template class AnnotationVerifier; +template class AnnotationVerifier; +template class AnnotationVerifier; +//template class AnnotationVerifier; +template class AnnotationVerifier; +template class AnnotationVerifier; std::string BoolVerifier::type() const { return "Boolean"; diff --git a/src/engine/settings.cpp b/src/engine/settings.cpp index 6ae9451721..1f433b30ac 100644 --- a/src/engine/settings.cpp +++ b/src/engine/settings.cpp @@ -158,7 +158,8 @@ void saveSettings(const Settings& settings, const std::filesystem::path& filenam case properties::Property::Visibility::Developer: json["visibility"] = "Developer"; break; - + default: + throw ghoul::MissingCaseException(); } } if (settings.bypassLauncher.has_value()) { diff --git a/support/doxygen/README.md b/support/doxygen/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/support/doxygen/css b/support/doxygen/css new file mode 160000 index 0000000000..8cea9a073e --- /dev/null +++ b/support/doxygen/css @@ -0,0 +1 @@ +Subproject commit 8cea9a073ecd50a5b2c0958a3df100292d6c7374 From 7db7c4084108d8d1f40bd75e63452c46cc459d35 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 20 Nov 2023 23:39:17 +0100 Subject: [PATCH 179/701] Doxygen style overhaul (#2954) Reformatting the existing Doxygen comments to be unified --- Doxyfile | 25 +- ext/ghoul | 2 +- .../openspace/documentation/documentation.h | 51 +-- .../documentation/documentationengine.h | 4 +- include/openspace/documentation/verifier.h | 317 ++++++++++---- include/openspace/engine/globalscallbacks.h | 9 +- include/openspace/engine/logfactory.h | 12 +- include/openspace/engine/moduleengine.h | 21 +- include/openspace/engine/openspaceengine.h | 35 +- include/openspace/engine/syncengine.h | 37 +- include/openspace/events/event.h | 42 +- include/openspace/events/eventengine.h | 19 +- .../interaction/camerainteractionstates.h | 12 +- .../openspace/interaction/delayedvariable.h | 6 +- .../interaction/interactionmonitor.h | 2 +- include/openspace/interaction/interpolator.h | 2 +- .../interaction/joystickinputstate.h | 6 +- .../openspace/interaction/sessionrecording.h | 305 +++++++------ .../interaction/websocketinputstate.h | 2 +- include/openspace/mission/mission.h | 7 +- include/openspace/mission/missionmanager.h | 9 +- .../openspace/navigation/keyframenavigator.h | 15 +- .../openspace/navigation/navigationhandler.h | 10 +- .../openspace/navigation/orbitalnavigator.h | 78 ++-- include/openspace/navigation/path.h | 84 ++-- include/openspace/navigation/pathcurve.h | 19 +- include/openspace/navigation/pathnavigator.h | 19 +- include/openspace/navigation/waypoint.h | 14 +- include/openspace/network/messagestructures.h | 2 +- .../network/messagestructureshelper.h | 22 +- include/openspace/network/parallelpeer.h | 6 +- .../openspace/properties/numericalproperty.h | 7 +- include/openspace/properties/optionproperty.h | 23 +- include/openspace/properties/property.h | 107 ++--- include/openspace/properties/propertyowner.h | 43 +- .../properties/scalar/shortproperty.h | 13 - .../openspace/properties/selectionproperty.h | 18 +- .../openspace/properties/templateproperty.h | 75 ++-- .../openspace/properties/triggerproperty.h | 10 +- include/openspace/rendering/dashboard.h | 6 +- include/openspace/rendering/fadeable.h | 2 +- .../openspace/rendering/framebufferrenderer.h | 21 +- include/openspace/rendering/helper.h | 2 +- include/openspace/rendering/renderable.h | 39 +- include/openspace/rendering/renderengine.h | 8 +- .../rendering/screenspacerenderable.h | 10 +- include/openspace/rendering/volume.h | 133 ------ include/openspace/rendering/volumeraycaster.h | 58 ++- include/openspace/scene/asset.h | 37 +- include/openspace/scene/assetmanager.h | 26 +- include/openspace/scene/profile.h | 7 +- include/openspace/scene/scene.h | 71 +-- include/openspace/scripting/lualibrary.h | 12 +- include/openspace/scripting/scriptengine.h | 9 +- include/openspace/scripting/scriptscheduler.h | 56 ++- include/openspace/util/collisionhelper.h | 12 +- include/openspace/util/concurrentjobmanager.h | 4 +- include/openspace/util/concurrentqueue.h | 2 +- include/openspace/util/coordinateconversion.h | 16 +- include/openspace/util/factorymanager.h | 24 +- include/openspace/util/histogram.h | 12 +- include/openspace/util/httprequest.h | 62 +-- include/openspace/util/job.h | 6 +- include/openspace/util/json_helper.h | 18 +- include/openspace/util/openspacemodule.h | 29 +- .../openspace/util/resourcesynchronization.h | 39 +- include/openspace/util/screenlog.h | 15 +- include/openspace/util/spicemanager.h | 408 ++++++++++-------- include/openspace/util/syncable.h | 4 +- include/openspace/util/syncbuffer.h | 3 - include/openspace/util/syncdata.h | 21 +- include/openspace/util/time.h | 76 ++-- include/openspace/util/timeline.h | 24 +- include/openspace/util/timemanager.h | 6 +- include/openspace/util/timerange.h | 6 +- include/openspace/util/touch.h | 37 +- include/openspace/util/tstring.h | 19 +- include/openspace/util/universalhelpers.h | 18 +- modules/base/rendering/renderablenodearrow.h | 3 +- modules/base/rendering/renderabletrail.h | 25 +- modules/base/rendering/renderabletrailorbit.h | 15 +- .../rendering/renderabletrailtrajectory.h | 4 +- modules/base/rendering/screenspacedashboard.h | 4 - .../base/rendering/screenspaceframebuffer.h | 10 +- modules/debugging/rendering/debugrenderer.h | 97 ++--- .../rendering/renderablebillboardscloud.h | 1 - modules/exoplanets/exoplanetshelper.h | 101 +++-- .../rendering/renderableorbitdisc.h | 4 +- .../tasks/exoplanetsdatapreparationtask.h | 26 +- modules/fieldlinessequence/util/commons.h | 6 +- .../util/kameleonfieldlinehelper.h | 22 +- .../fitsfilereader/include/fitsfilereader.h | 18 +- modules/gaia/rendering/octreeculler.h | 13 +- modules/gaia/rendering/octreemanager.h | 38 +- modules/gaia/rendering/renderablegaiastars.h | 12 +- modules/gaia/tasks/constructoctreetask.h | 29 +- modules/gaia/tasks/readfilejob.h | 16 +- modules/gaia/tasks/readfitstask.h | 10 +- modules/galaxy/tasks/milkywayconversiontask.h | 4 +- .../tasks/milkywaypointsconversiontask.h | 4 +- .../globebrowsing/src/asynctiledataprovider.h | 6 +- modules/globebrowsing/src/basictypes.h | 28 +- modules/globebrowsing/src/ellipsoid.h | 20 +- modules/globebrowsing/src/gdalwrapper.h | 9 +- modules/globebrowsing/src/geodeticpatch.h | 18 +- .../src/geojson/geojsoncomponent.h | 12 +- .../src/geojson/geojsonmanager.h | 2 +- .../src/geojson/geojsonproperties.h | 16 +- .../src/geojson/globegeometryfeature.h | 56 ++- .../src/geojson/globegeometryhelper.h | 17 +- modules/globebrowsing/src/gpulayergroup.h | 6 +- modules/globebrowsing/src/layergroup.h | 16 +- .../globebrowsing/src/layerrendersettings.h | 11 +- modules/globebrowsing/src/lrucache.h | 9 +- modules/globebrowsing/src/lruthreadpool.h | 16 +- .../globebrowsing/src/memoryawaretilecache.h | 4 +- .../src/prioritizingconcurrentjobmanager.h | 16 +- modules/globebrowsing/src/renderableglobe.h | 59 ++- modules/globebrowsing/src/shadowcomponent.h | 1 - modules/globebrowsing/src/skirtedgrid.h | 13 +- modules/globebrowsing/src/tileloadjob.h | 15 +- .../src/tileprovider/temporaltileprovider.h | 5 +- .../src/tileprovider/tileprovider.h | 10 +- .../globebrowsing/src/tiletextureinitdata.h | 5 +- modules/globebrowsing/src/timequantizer.h | 131 +++--- modules/imgui/include/guicomponent.h | 24 +- modules/iswa/rendering/datacygnet.h | 6 +- modules/iswa/rendering/dataplane.h | 2 +- modules/iswa/rendering/datasphere.h | 2 +- modules/iswa/rendering/iswacygnet.h | 4 +- modules/iswa/rendering/kameleonplane.h | 9 +- modules/iswa/rendering/texturecygnet.h | 7 +- modules/iswa/rendering/textureplane.h | 6 +- modules/iswa/util/dataprocessor.h | 2 - modules/kameleon/include/kameleonwrapper.h | 4 +- modules/multiresvolume/rendering/tsp.h | 17 +- .../include/topics/flightcontrollertopic.h | 2 +- modules/skybrowser/include/utility.h | 28 +- modules/space/horizonsfile.h | 15 +- modules/space/kepler.h | 6 +- .../rendering/renderableconstellationbounds.h | 20 +- .../rendering/renderableconstellationlines.h | 2 +- .../rendering/renderableconstellationsbase.h | 35 +- .../space/rendering/renderablehabitablezone.h | 8 +- .../space/rendering/renderabletravelspeed.h | 4 +- .../space/tasks/generatedebrisvolumetask.h | 16 +- modules/space/translation/gptranslation.h | 4 +- .../space/translation/horizonstranslation.h | 15 +- modules/space/translation/keplertranslation.h | 14 +- .../rendering/renderablefov.h | 31 +- .../util/imagesequencer.h | 17 +- modules/statemachine/include/statemachine.h | 7 +- modules/statemachine/statemachinemodule.h | 2 +- modules/sync/syncs/httpsynchronization.h | 28 +- modules/sync/syncs/urlsynchronization.h | 30 +- modules/touch/include/directinputsolver.h | 21 +- modules/touch/include/touchinteraction.h | 66 +-- modules/touch/include/tuioear.h | 8 +- modules/touch/touchmodule.h | 10 +- .../rendering/renderabletimevaryingvolume.h | 1 - modules/webbrowser/include/browserinstance.h | 12 +- modules/webbrowser/include/eventhandler.h | 4 +- src/CMakeLists.txt | 1 - 163 files changed, 2266 insertions(+), 2035 deletions(-) delete mode 100644 include/openspace/rendering/volume.h diff --git a/Doxyfile b/Doxyfile index 44468a071b..6417b0167a 100644 --- a/Doxyfile +++ b/Doxyfile @@ -947,6 +947,7 @@ INPUT = src \ include \ modules \ apps \ + ext/ghoul \ support/doxygen/README.md # This tag can be used to specify the character encoding of the source files @@ -987,9 +988,7 @@ INPUT_FILE_ENCODING = # provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, # *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. -FILE_PATTERNS = *.cpp \ - *.h \ - *.inl +FILE_PATTERNS = *.cpp *.h *.inl # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. @@ -1020,16 +1019,16 @@ EXCLUDE_SYMLINKS = NO # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* -EXCLUDE_PATTERNS = ext/* \ - bin/* \ - build/* \ - config/* \ - gui/* \ - kernels/* \ - data/* \ - scripts/* \ - shaders/* \ - **/ext/** +EXCLUDE_PATTERNS = */ext/curl \ + */ext/date \ + */ext/json \ + */ext/spice \ + */ext/vld \ + */ext/tinythread \ + */ext/ghoul/ext/* \ + */modules/*/ext/* \ + */apps/OpenSpace-MinVR/ext/* \ + */apps/OpenSpace/ext/sgct/ext/* # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the diff --git a/ext/ghoul b/ext/ghoul index fbd80eae0f..c2992bd52f 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit fbd80eae0ff589a9fa2fb5e2c8af8e4491fe4e2d +Subproject commit c2992bd52f7c4e29a85dcbe44e3e6a89ffec0c19 diff --git a/include/openspace/documentation/documentation.h b/include/openspace/documentation/documentation.h index c8c7385613..28d2029922 100644 --- a/include/openspace/documentation/documentation.h +++ b/include/openspace/documentation/documentation.h @@ -56,11 +56,16 @@ struct TestResult { struct Offense { /// The Reason for the offense enum class Reason { - Unknown, ///< Unknown reason - MissingKey, ///< The offending key that was requested was not found - WrongType, ///< The key's value was not of the expected type - Verification, ///< The value did not pass a necessary non-type verifier - UnknownIdentifier ///< The identifier for a ReferencingVerifier did not exist + /// Unknown reason + Unknown, + /// The offending key that was requested was not found + MissingKey, + /// The key's value was not of the expected type + WrongType, + /// The value did not pass a necessary non-type verifier + Verification, + /// The identifier for a ReferencingVerifier did not exist + UnknownIdentifier }; /// The offending key that caused the Offense. In the case of a nested table, /// this value will be the fully qualified name of the key @@ -80,7 +85,8 @@ struct TestResult { struct Warning { /// The reason for the warning enum class Reason { - Deprecated ///< The value is marked as deprecated and should not used + /// The value is marked as deprecated and should not used + Deprecated }; /// The offending key that caused the Warning. In the case of a nested table, @@ -90,7 +96,6 @@ struct TestResult { Reason reason; }; - /// Is `true` if the TestResult is positive, `false` otherwise bool success = false; /// Contains a list of offenses that were found in the test. Is empty if @@ -130,10 +135,10 @@ void logError(const SpecificationError& error, std::string component = ""); * DocumentationEntry::Wildcard, any key in the containing Documentation will be tested * against the provided verifier. The most convenient way of creating DocumentationEntry%s * is by using an inline initializer list such as: - *\verbatim -DocumentationEntry e = { "key", new IntVerifier, "Documentation text", Optional::Yes }; -\endverbatim - + * ``` + * DocumentationEntry e = { "key", new IntVerifier, "Documentation text", Optional::Yes }; + * ``` + * * Furthermore, these initializer lists can be crated all at once for a Documentation. * Even if the Verifier%s are specified using the `new` operators, they will not leak * memory as the DocumentationEntry takes ownership of them in the constructor. @@ -190,8 +195,7 @@ struct DocumentationEntry { * \pre \p k must not be empty * \pre \p v must not be nullptr */ - DocumentationEntry(std::string k, Verifier* v, Optional opt, - std::string doc = ""); + DocumentationEntry(std::string k, Verifier* v, Optional opt, std::string doc = ""); /// The key that is described by this DocumentationEntry std::string key; @@ -203,7 +207,6 @@ struct DocumentationEntry { std::string documentation; }; - /** * This struct contains the documentation and specification for a ghoul::Dictionary. It is * used to impose restrictions on keys and values and determine whether a given @@ -211,16 +214,16 @@ struct DocumentationEntry { * #testSpecificationAndThrow methods). Each Documentation consists of a human-readable * `name`, and a list of DocumentationEntry%s that each describe a single key value. The * most convenient way of creating a Documentation is by using nested initializer lists: - *\verbatim -Documentation doc = { - "Documentation for an arbitrary dictionary", - { // A list of DocumentationEntry%s; also specified using initializer lists - { "key1", new IntVerifier, "Documentation key1", Optional::Yes }, - { "key2", new FloatVerifier, "Documentation key2" }, - { "key3", new StringVerifier } - } -}; -\endverbatim + * ``` + * Documentation doc = { + * "Documentation for an arbitrary dictionary", + * { // A list of DocumentationEntry%s; also specified using initializer lists + * { "key1", new IntVerifier, "Documentation key1", Optional::Yes }, + * { "key2", new FloatVerifier, "Documentation key2" }, + * { "key3", new StringVerifier } + * } + * }; + * ``` * * If multiple DocumentationEntries cover the same key, they are all evaluated for that * specific key. The same holds true if there is a DocumentationEntry with a diff --git a/include/openspace/documentation/documentationengine.h b/include/openspace/documentation/documentationengine.h index 88ec3042c7..a21f563b90 100644 --- a/include/openspace/documentation/documentationengine.h +++ b/include/openspace/documentation/documentationengine.h @@ -47,8 +47,7 @@ public: * Constructor of a DuplicateDocumentationException storing the offending * Documentation for later use. * - * \param doc The Documentation whose identifier was previously - * registered + * \param doc The Documentation whose identifier was previously registered */ DuplicateDocumentationException(Documentation doc); @@ -92,7 +91,6 @@ public: nlohmann::json generateJsonJson() const; private: - /// The list of all Documentation%s that are stored by the DocumentationEngine std::vector _documentations; diff --git a/include/openspace/documentation/verifier.h b/include/openspace/documentation/verifier.h index 5eeeba1c1b..fc7cc06b71 100644 --- a/include/openspace/documentation/verifier.h +++ b/include/openspace/documentation/verifier.h @@ -58,7 +58,7 @@ public: * \return A TestResult struct that contains information about whether the key adheres * to the demands of the specific Verifier. If it does not, * TestResult::offenders will either contain \p key or, in the case of a - * TableVerifier, a list of all offending subkeys as fully qualified names. + * TableVerifier, a list of all offending subkeys as fully qualified names * * \post If the return values' TestResult::success is `true`, its * TestResult::offenders is empty @@ -98,6 +98,7 @@ public: * The base class Verifier for all Verifier%s that have to test against a specific value * type. This Verifier tests whether a given key exists and whether it has the same type * as the template parameter `T`. + * * \tparam T The type against which the key's value is tested */ template @@ -112,7 +113,7 @@ public: * \param dictionary The ghoul::Dictionary that contains the \p key to be tested * \param key The key inside the \p dictinoary that is to be tested * \return A TestResult that contains the information whether the \p key exists in the - * \p dictionary and whether the key's value's type agrees with `T`. + * \p dictionary and whether the key's value's type agrees with `T` * * \post The return values' TestResult::success is either `true` and * TestResult::offenders is empty, or it is `false` and TestResult::offenders @@ -220,7 +221,7 @@ public: /** * A Verifier that checks whether a given key inside a ghoul::Dictionary is a string and - * a valid date time + * a valid date time. */ class DateTimeVerifier : public StringVerifier { public: @@ -312,21 +313,27 @@ public: // Vector verifiers //---------------------------------------------------------------------------------------- -/// This Verifier checks whether the value is of type `glm::tvec2` +/** + * This Verifier checks whether the value is of type `glm::tvec2`. + */ template class Vector2Verifier : public TemplateVerifier> { public: std::string type() const override; }; -/// This Verifier checks whether the value is of type `glm::tvec3` +/** + * This Verifier checks whether the value is of type `glm::tvec3`. + */ template class Vector3Verifier : public TemplateVerifier> { public: std::string type() const override; }; -/// This Verifier checks whether the value is of type `glm::tvec4` +/** + * This Verifier checks whether the value is of type `glm::tvec4`. + */ template class Vector4Verifier : public TemplateVerifier> { public: @@ -351,7 +358,7 @@ public: /** * A Verifier that checks whether all values contained in a Table are of - * type `glm::tvec2` + * type `glm::tvec2`. */ template class Vector2ListVerifier : public TableVerifier { @@ -369,7 +376,7 @@ public: /** * A Verifier that checks whether all values contained in a Table are of - * type `glm::tvec3` + * type `glm::tvec3`. */ template class Vector3ListVerifier : public TableVerifier { @@ -387,7 +394,7 @@ public: /** * A Verifier that checks whether all values contained in a Table are of - * type `glm::tvec4` + * type `glm::tvec4`. */ template class Vector4ListVerifier : public TableVerifier { @@ -408,7 +415,7 @@ public: //---------------------------------------------------------------------------------------- /** - * This Verifier checks whether the value is of type `glm::mat2x2` + * This Verifier checks whether the value is of type `glm::mat2x2`. */ template class Matrix2x2Verifier : public TemplateVerifier> { @@ -417,7 +424,7 @@ public: }; /** - * This Verifier checks whether the value is of type `glm::mat2x3` + * This Verifier checks whether the value is of type `glm::mat2x3`. */ template class Matrix2x3Verifier : public TemplateVerifier> { @@ -426,7 +433,7 @@ public: }; /** - * This Verifier checks whether the value is of type `glm::mat2x4` + * This Verifier checks whether the value is of type `glm::mat2x4`. */ template class Matrix2x4Verifier : public TemplateVerifier> { @@ -435,7 +442,7 @@ public: }; /** - * This Verifier checks whether the value is of type `glm::mat3x2` + * This Verifier checks whether the value is of type `glm::mat3x2`. */ template class Matrix3x2Verifier : public TemplateVerifier> { @@ -444,7 +451,7 @@ public: }; /** - * This Verifier checks whether the value is of type `glm::mat3x3` + * This Verifier checks whether the value is of type `glm::mat3x3`. */ template class Matrix3x3Verifier : public TemplateVerifier> { @@ -453,7 +460,7 @@ public: }; /** - * This Verifier checks whether the value is of type `glm::mat3x4` + * This Verifier checks whether the value is of type `glm::mat3x4`. */ template class Matrix3x4Verifier : public TemplateVerifier> { @@ -462,7 +469,7 @@ public: }; /** - * This Verifier checks whether the value is of type `glm::mat4x2` + * This Verifier checks whether the value is of type `glm::mat4x2`. */ template class Matrix4x2Verifier : public TemplateVerifier> { @@ -471,7 +478,7 @@ public: }; /** - * This Verifier checks whether the value is of type `glm::mat4x3` + * This Verifier checks whether the value is of type `glm::mat4x3`. */ template class Matrix4x3Verifier : public TemplateVerifier> { @@ -480,7 +487,7 @@ public: }; /** - * This Verifier checks whether the value is of type `glm::mat4x4` + * This Verifier checks whether the value is of type `glm::mat4x4`. */ template class Matrix4x4Verifier : public TemplateVerifier> { @@ -513,6 +520,7 @@ public: /** * Constructor for an OperatorVerifier. As all operators need to compare the incoming * value to a stored value, we require the comparison \p value to be passed in here. + * * \param value The value against which the tested value is compared using the * `Operator` */ @@ -530,7 +538,7 @@ public: * \p key%'s value has the wrong type, it will be added to the TestResult's * offense list with the reason TestResult::Offense::Reason::WrongType; if the * `Operator` returns false, it will be added with the reason - * TestResult::Offense::Verification instead. + * TestResult::Offense::Verification instead */ TestResult operator()(const ghoul::Dictionary& dictionary, const std::string& key) const override; @@ -683,7 +691,7 @@ public: * \p key%'s value has the wrong type, it will be added to the TestResult's * offense list with the reason TestResult::Offense::Reason::WrongType; if the * value is not in the list, it will be added with the reason - * TestResult::Offense::Verification instead. + * TestResult::Offense::Verification instead */ TestResult operator()(const ghoul::Dictionary& dictionary, const std::string& key) const override; @@ -725,7 +733,7 @@ public: * \p key%'s value has the wrong type, it will be added to the TestResult's * offense list with the reason TestResult::Offense::Reason::WrongType; if the * value is in the list, it will be added with the reason - * TestResult::Offense::Verification instead. + * TestResult::Offense::Verification instead */ TestResult operator()(const ghoul::Dictionary& dictionary, const std::string& key) const override; @@ -777,7 +785,7 @@ public: * offense list with the reason TestResult::Offense::Reason::WrongType; if the * value is outside the range defined by the lower and upper limits passed to * the constructor, it will be added with the reason - * TestResult::Offense::Verification instead. + * TestResult::Offense::Verification instead */ TestResult operator()(const ghoul::Dictionary& dictionary, const std::string& key) const override; @@ -827,7 +835,7 @@ public: * offense list with the reason TestResult::Offense::Reason::WrongType; if the * value is greater or equal to the lower limit and less or equal to the upper * limit, it will be added with the reason TestResult::Offense::Verification - * instead. + * instead */ TestResult operator()(const ghoul::Dictionary& dictionary, const std::string& key) const override; @@ -863,7 +871,7 @@ public: * passed to the user when a documentation is requested. * * \param annotation The annotation that is stored and returned to the user when it - * is requested. + * is requested * * \pre annotation must not be empty */ @@ -961,7 +969,7 @@ public: * TestResult::offenses list contains \p with a reason of * TestResult::Offense::Reason::Verification. If \p key%'s value passes either * of the two Verifier%s, the result's TestResult::success is `true` and the - * TestResult::offenses is empty. + * TestResult::offenses is empty */ TestResult operator()(const ghoul::Dictionary& dictionary, const std::string& key) const override; @@ -972,118 +980,271 @@ public: std::vector> values; }; -/// A short-hand definition for a Verifier checking for `glm::bvec2` +/** + * A short-hand definition for a Verifier checking for `glm::bvec2`. + */ using BoolVector2Verifier = Vector2Verifier; -/// A short-hand definition for a Verifier checking for `glm::ivec2` + +/** + * A short-hand definition for a Verifier checking for `glm::ivec2`. + */ using IntVector2Verifier = Vector2Verifier; -/// A short-hand definition for a Verifier checking for `glm::dvec2` + +/** + * A short-hand definition for a Verifier checking for `glm::dvec2`. + */ using DoubleVector2Verifier = Vector2Verifier; -/// A short-hand definition for a Verifier checking for `glm::bvec3` + +/** + * A short-hand definition for a Verifier checking for `glm::bvec3`. + */ using BoolVector3Verifier = Vector3Verifier; -/// A short-hand definition for a Verifier checking for `glm::ivec3` + +/** + * A short-hand definition for a Verifier checking for `glm::ivec3`. + */ using IntVector3Verifier = Vector3Verifier; -/// A short-hand definition for a Verifier checking for `glm::dvec3` + +/** + * A short-hand definition for a Verifier checking for `glm::dvec3`. + */ using DoubleVector3Verifier = Vector3Verifier; -/// A short-hand definition for a Verifier checking for `glm::bvec4` + +/** + * A short-hand definition for a Verifier checking for `glm::bvec4`. + */ using BoolVector4Verifier = Vector4Verifier; -/// A short-hand definition for a Verifier checking for `glm::ivec4` + +/** + * A short-hand definition for a Verifier checking for `glm::ivec4`. + */ using IntVector4Verifier = Vector4Verifier; -/// A short-hand definition for a Verifier checking for `glm::dvec4` + +/** + * A short-hand definition for a Verifier checking for `glm::dvec4`. + */ using DoubleVector4Verifier = Vector4Verifier; -/// A short-hand definition for a Verifier checking for `glm::dmat2x2` +/** + * A short-hand definition for a Verifier checking for `glm::dmat2x2`. + */ using DoubleMatrix2x2Verifier = Matrix2x2Verifier; + using DoubleMatrix2Verifier = DoubleMatrix2x2Verifier; -/// A short-hand definition for a Verifier checking for `glm::dmat2x3` + +/** + * A short-hand definition for a Verifier checking for `glm::dmat2x3`. + */ using DoubleMatrix2x3Verifier = Matrix2x3Verifier; -/// A short-hand definition for a Verifier checking for `glm::dmat2x4` + +/** + * A short-hand definition for a Verifier checking for `glm::dmat2x4`. + */ using DoubleMatrix2x4Verifier = Matrix2x4Verifier; -/// A short-hand definition for a Verifier checking for `glm::dmat3x2` + +/** + * A short-hand definition for a Verifier checking for `glm::dmat3x2`. + */ using DoubleMatrix3x2Verifier = Matrix3x2Verifier; -/// A short-hand definition for a Verifier checking for `glm::dmat3x3` + +/** + * A short-hand definition for a Verifier checking for `glm::dmat3x3`. + */ using DoubleMatrix3x3Verifier = Matrix3x3Verifier; + using DoubleMatrix3Verifier = DoubleMatrix3x3Verifier; -/// A short-hand definition for a Verifier checking for `glm::dmat3x4` + +/** + * A short-hand definition for a Verifier checking for `glm::dmat3x4`. + */ using DoubleMatrix3x4Verifier = Matrix3x4Verifier; -/// A short-hand definition for a Verifier checking for `glm::dmat4x2` + +/** + * A short-hand definition for a Verifier checking for `glm::dmat4x2`. + */ using DoubleMatrix4x2Verifier = Matrix4x2Verifier; -/// A short-hand definition for a Verifier checking for `glm::dmat4x3` + +/** + * A short-hand definition for a Verifier checking for `glm::dmat4x3`. + */ using DoubleMatrix4x3Verifier = Matrix4x3Verifier; -/// A short-hand definition for a Verifier checking for `glm::dmat4x4` + +/** + * A short-hand definition for a Verifier checking for `glm::dmat4x4`. + */ using DoubleMatrix4x4Verifier = Matrix4x4Verifier; + using DoubleMatrix4Verifier = DoubleMatrix4x4Verifier; -/// A short-hand definition for a LessVerifier with a type check for `int` +/** + * A short-hand definition for a LessVerifier with a type check for `int`. + */ using IntLessVerifier = LessVerifier; -/// A short-hand definition for a LessVerifier with a type check for `double` + +/** + * A short-hand definition for a LessVerifier with a type check for `double`. + */ using DoubleLessVerifier = LessVerifier; -/// A short-hand definition for a LessEqualVerifier with a type check for `int` + +/** + * A short-hand definition for a LessEqualVerifier with a type check for `int`. + */ using IntLessEqualVerifier = LessEqualVerifier; -/// A short-hand definition for a LessEqualVerifier with a type check for `double` + +/** + * A short-hand definition for a LessEqualVerifier with a type check for `double`. + */ using DoubleLessEqualVerifier = LessEqualVerifier; -/// A short-hand definition for a GreaterVerifier with a type check for `int` + +/** + * A short-hand definition for a GreaterVerifier with a type check for `int`. + */ using IntGreaterVerifier = GreaterVerifier; -/// A short-hand definition for a GreaterVerifier with a type check for `double` + +/** + * A short-hand definition for a GreaterVerifier with a type check for `double`. + */ using DoubleGreaterVerifier = GreaterVerifier; -/// A short-hand definition for a GreaterEqualVerifier with a type check for `int` + +/** + * A short-hand definition for a GreaterEqualVerifier with a type check for `int`. + */ using IntGreaterEqualVerifier = GreaterEqualVerifier; -/// A short-hand definition for a GreaterEqualVerifier with a type check for `double` + +/** + * A short-hand definition for a GreaterEqualVerifier with a type check for `double`. + */ using DoubleGreaterEqualVerifier = GreaterEqualVerifier; -/// A short-hand definition for a EqualVerifier with a type check for `bool` + +/** + * A short-hand definition for a EqualVerifier with a type check for `bool`. + */ using BoolEqualVerifier = EqualVerifier; -/// A short-hand definition for a EqualVerifier with a type check for `int` + +/** + * A short-hand definition for a EqualVerifier with a type check for `int`. + */ using IntEqualVerifier = EqualVerifier; -/// A short-hand definition for a EqualVerifier with a type check for `double` + +/** + * A short-hand definition for a EqualVerifier with a type check for `double`. + */ using DoubleEqualVerifier = EqualVerifier; -/// A short-hand definition for a EqualVerifier with a type check for `string` + +/** + * A short-hand definition for a EqualVerifier with a type check for `string`. + */ using StringEqualVerifier = EqualVerifier; -/// A short-hand definition for a UnequalVerifier with a type check for `bool` + +/** + * A short-hand definition for a UnequalVerifier with a type check for `bool`. + */ using BoolUnequalVerifier = UnequalVerifier; -/// A short-hand definition for a UnequalVerifier with a type check for `int` + +/** + * A short-hand definition for a UnequalVerifier with a type check for `int`. + */ using IntUnequalVerifier = UnequalVerifier; -/// A short-hand definition for a UnequalVerifier with a type check for `double` + +/** + * A short-hand definition for a UnequalVerifier with a type check for `double`. + */ using DoubleUnequalVerifier = UnequalVerifier; -/// A short-hand definition for a UnequalVerifier with a type check for `string` + +/** + * A short-hand definition for a UnequalVerifier with a type check for `string`. + */ using StringUnequalVerifier = UnequalVerifier; -/// A short-hand definition for a InListVerifier with a type check for `bool` +/** + * A short-hand definition for a InListVerifier with a type check for `bool`. + */ using BoolInListVerifier = InListVerifier; -/// A short-hand definition for a InListVerifier with a type check for `int` + +/** + * A short-hand definition for a InListVerifier with a type check for `int`. + */ using IntInListVerifier = InListVerifier; -/// A short-hand definition for a InListVerifier with a type check for `double` + +/** + * A short-hand definition for a InListVerifier with a type check for `double`. + */ using DoubleInListVerifier = InListVerifier; -/// A short-hand definition for a InListVerifier with a type check for `string` + +/** + * A short-hand definition for a InListVerifier with a type check for `string`. + */ using StringInListVerifier = InListVerifier; -/// A short-hand definition for a NotInListVerifier with a type check for `bool` + +/** + * A short-hand definition for a NotInListVerifier with a type check for `bool`. + */ using BoolNotInListVerifier = NotInListVerifier; -/// A short-hand definition for a NotInListVerifier with a type check for `int` + +/** + * A short-hand definition for a NotInListVerifier with a type check for `int`. + */ using IntNotInListVerifier = NotInListVerifier; -/// A short-hand definition for a NotInListVerifier with a type check for `double` + +/** + * A short-hand definition for a NotInListVerifier with a type check for `double`. + */ using DoubleNotInListVerifier = NotInListVerifier; -/// A short-hand definition for a NotInListVerifier with a type check for `string` + +/** + * A short-hand definition for a NotInListVerifier with a type check for `string`. + */ using StringNotInListVerifier = NotInListVerifier; -/// A short-hand definition for a InRangeVerifier with a type check for `int` +/** + * A short-hand definition for a InRangeVerifier with a type check for `int`. + */ using IntInRangeVerifier = InRangeVerifier; -/// A short-hand definition for a InRangeVerifier with a type check for `double` + +/** + * A short-hand definition for a InRangeVerifier with a type check for `double`. + */ using DoubleInRangeVerifier = InRangeVerifier; -/// A short-hand definition for a InRangeVerifier with a type check for `vec2` + +/** + * A short-hand definition for a InRangeVerifier with a type check for `vec2`. + */ using Vec2InRangeVerifier = InRangeVerifier; -/// A short-hand definition for a NotInRangeVerifier with a type check for `int` + +/** + * A short-hand definition for a NotInRangeVerifier with a type check for `int`. + */ using IntNotInRangeVerifier = NotInRangeVerifier; -/// A short-hand definition for a NotInRangeVerifier with a type check for `double` + +/** + * A short-hand definition for a NotInRangeVerifier with a type check for `double`. + */ using DoubleNotInRangeVerifier = NotInRangeVerifier; -/// A short-hand definition for a AnnotationVerifier with a type check for `bool` +/** + * A short-hand definition for a AnnotationVerifier with a type check for `bool`. + */ using BoolAnnotationVerifier = AnnotationVerifier; -/// A short-hand definition for a AnnotationVerifier with a type check for `int` + +/** + * A short-hand definition for a AnnotationVerifier with a type check for `int`. + */ using IntAnnotationVerifier = AnnotationVerifier; -/// A short-hand definition for a AnnotationVerifier with a type check for `double` + +/** + * A short-hand definition for a AnnotationVerifier with a type check for `double`. + */ using DoubleAnnotationVerifier = AnnotationVerifier; -/// A short-hand definition for a AnnotationVerifier with a type check for `string` + +/** + * A short-hand definition for a AnnotationVerifier with a type check for `string`. + */ using StringAnnotationVerifier = AnnotationVerifier; -/// A short-hand definition for a AnnotationVerifier with a type check for -/// `ghoul::Dictionary` + +/** + * A short-hand definition for a AnnotationVerifier with a type check for + * `ghoul::Dictionary` + */ using TableAnnotationVerifier = AnnotationVerifier; // Definitions of external templates that are instantiated in the cpp file diff --git a/include/openspace/engine/globalscallbacks.h b/include/openspace/engine/globalscallbacks.h index a0f606b65c..4dba55e44e 100644 --- a/include/openspace/engine/globalscallbacks.h +++ b/include/openspace/engine/globalscallbacks.h @@ -66,11 +66,10 @@ inline std::vector>* touchExit; /** * If the framerate becomes slow, Chromium Embedded Framework (used in Web Browser Module) * needs to perform its message loop work more frequently than once per frame. If this - * method is not called frequently enough, the GUI will become much less responsive. - * A future more long-term may decouple the browser's message work loop from the main - * render loop altogehter using a separate thread. - * Currently, this method is called from within the RenderEngine, - * between calls to individual renderables. + * method is not called frequently enough, the GUI will become much less responsive. A + * future more long-term may decouple the browser's message work loop from the main render + * loop altogehter using a separate thread. Currently, this method is called from within + * the RenderEngine, between calls to individual renderables. */ extern void (*webBrowserPerformanceHotfix)(); diff --git a/include/openspace/engine/logfactory.h b/include/openspace/engine/logfactory.h index 3216e44e32..e4cce1ba43 100644 --- a/include/openspace/engine/logfactory.h +++ b/include/openspace/engine/logfactory.h @@ -43,12 +43,14 @@ namespace documentation { struct Documentation; } * logfile should be created. Both logs can be customized using the `Append`, * `TimeStamping`, `DateStamping`, `CategoryStamping`, and `LogLevelStamping` values. * - * \param dictionary The dictionary from which the ghoul::logging::Log should be created + * \param dictionary The dictionary from which the ghoul::logging::Log should be created * \return The created ghoul::logging::Log - * \post The return value will not be `nullptr` - * \throw ghoul::RuntimeError If there was an error creating the ghoul::logging::Log - * \sa ghoul::logging::TextLog - * \sa ghoul::logging::HTMLLog + * + * \post The return value will not be `nullptr` + * \throw ghoul::RuntimeError If there was an error creating the ghoul::logging::Log + * + * \sa ghoul::logging::TextLog + * \sa ghoul::logging::HTMLLog */ std::unique_ptr createLog(const ghoul::Dictionary& dictionary); diff --git a/include/openspace/engine/moduleengine.h b/include/openspace/engine/moduleengine.h index 8a37586007..4bfe52c166 100644 --- a/include/openspace/engine/moduleengine.h +++ b/include/openspace/engine/moduleengine.h @@ -45,9 +45,9 @@ namespace scripting { struct LuaLibrary; } * The ModuleEngine is the central repository for registering and accessing * OpenSpaceModule for the current application run. By initializing (#initialize) the * ModuleEngine, the default set of OpenSpaceModule%s as generated by CMake in the - * `moduleregistration.h` file is automatically registered and created. - * Additional OpenSpaceModule%s can be registered with the #registerModule function, which - * will internally call the OpenSpaceModule::initialize method. + * `moduleregistration.h` file is automatically registered and created. Additional + * OpenSpaceModule%s can be registered with the #registerModule function, which will + * internally call the OpenSpaceModule::initialize method. */ class ModuleEngine : public properties::PropertyOwner { public: @@ -55,11 +55,10 @@ public: /** * Registers all of the OpenSpaceModule%s which are created by the CMake configuration - * and stored in the `moduleregistration.h` file. For all of those modules - * the OpenSpaceModule::initialize method with will called. + * and stored in the `moduleregistration.h` file. For all of those modules the + * OpenSpaceModule::initialize method with will called. * - * \throw ghoul::RuntimeError If two modules in the default modules have the same - * name + * \throw ghoul::RuntimeError If two modules in the default modules have the same name */ void initialize(const std::map& moduleConfigurations); @@ -104,7 +103,7 @@ public: * to have the public static member variable `name` which must be equal to * the name of the module used in its constructor. * - * \return a pointer to the module of the given subclass + * \return A pointer to the module of the given subclass */ template ModuleSubClass* module() const; @@ -118,9 +117,9 @@ public: ghoul::systemcapabilities::Version requiredOpenGLVersion() const; /** - * Returns the Lua library that contains all Lua functions available to affect the - * modules. - */ + * Returns the Lua library that contains all Lua functions available to affect the + * modules. + */ static scripting::LuaLibrary luaLibrary(); private: diff --git a/include/openspace/engine/openspaceengine.h b/include/openspace/engine/openspaceengine.h index 73a97a54e8..291a65aefa 100644 --- a/include/openspace/engine/openspaceengine.h +++ b/include/openspace/engine/openspaceengine.h @@ -51,15 +51,17 @@ class Scene; namespace scripting { struct LuaLibrary; } - // Structure that is responsible for the delayed shutdown of the application +/** + * Structure that is responsible for the delayed shutdown of the application. + */ struct ShutdownInformation { - // Whether the application is currently in shutdown mode (i.e. counting down the - // timer and closing it at '0' + /// Whether the application is currently in shutdown mode (i.e. counting down the + /// timer and closing it at '0' bool inShutdown = false; - // Total amount of time the application will wait before actually shutting down + /// Total amount of time the application will wait before actually shutting down float waitTime = 0.f; - // Current state of the countdown; if it reaches '0', the application will - // close + /// Current state of the countdown; if it reaches '0', the application will + /// close float timer = 0.f; }; @@ -73,9 +75,11 @@ struct CommandlineArguments { class OpenSpaceEngine : public properties::PropertyOwner { public: - // A mode that specifies which part of the system is currently in control. - // The mode can be used to limit certain features, like setting time, navigation - // or triggering scripts + /** + * A mode that specifies which part of the system is currently in control. The mode + * can be used to limit certain features, like setting time, navigation or triggering + * scripts. + */ enum class Mode { UserControl = 0, SessionRecordingPlayback, @@ -180,7 +184,8 @@ private: * Sets the camera position using the time contents of a profile. The function will * set an absolute position or a go-to-geolocation command using the globebrowsing * module. - * \param p The Profile to be read. + * + * \param p The Profile to be read */ void setCameraFromProfile(const Profile& p); @@ -188,21 +193,21 @@ void setCameraFromProfile(const Profile& p); * Reads a list of modules from a profile, and executes scripts based on whether or * not the corresponding module is loaded. * - * \param p The Profile to be read. + * \param p The Profile to be read */ void setModulesFromProfile(const Profile& p); /** * Registers actions from the contents of a profile. * - * \param p The Profile to be read. + * \param p The Profile to be read */ void setActionsFromProfile(const Profile& p); /** * Registers keybindings from the contents of a profile. * - * \param p The Profile to be read. + * \param p The Profile to be read */ void setKeybindingsFromProfile(const Profile& p); @@ -211,7 +216,7 @@ void setKeybindingsFromProfile(const Profile& p); * If any nodes are listed, a script to mark these will be queued with the * script engine. * - * \param p The Profile to be read. + * \param p The Profile to be read */ void setMarkInterestingNodesFromProfile(const Profile& p); @@ -220,7 +225,7 @@ void setMarkInterestingNodesFromProfile(const Profile& p); * at the end of the initialization. Any openspace lua commands are allowed, * and will be added to the script queue. * - * \param p The Profile to be read. + * \param p The Profile to be read */ void setAdditionalScriptsFromProfile(const Profile& p); diff --git a/include/openspace/engine/syncengine.h b/include/openspace/engine/syncengine.h index 1b5107d4ba..fb6d9933f2 100644 --- a/include/openspace/engine/syncengine.h +++ b/include/openspace/engine/syncengine.h @@ -36,72 +36,71 @@ namespace openspace { class Syncable; /** - * Manages a collection of `Syncable`s and ensures they are synchronized - * over SGCT nodes. Encoding/Decoding order is handles internally. + * Manages a collection of `Syncable`s and ensures they are synchronized over SGCT nodes. + * Encoding/Decoding order is handles internally. */ class SyncEngine { public: BooleanType(IsMaster); /** - * Creates a new SyncEngine which a buffer size of \p syncBufferSize + * Creates a new SyncEngine which a buffer size of \p syncBufferSize. + * * \pre syncBufferSize must be bigger than 0 */ SyncEngine(unsigned int syncBufferSize); /** - * Encodes all added Syncables in the injected `SyncBuffer`. - * This method is only called on the SGCT master node + * Encodes all added Syncables in the injected `SyncBuffer`. This method is only + * called on the SGCT master node. */ std::vector encodeSyncables(); /** - * Decodes the `SyncBuffer` into the added Syncables. - * This method is only called on the SGCT client nodes + * Decodes the `SyncBuffer` into the added Syncables. This method is only called on + * the SGCT client nodes. */ void decodeSyncables(std::vector data); /** - * Invokes the presync method of all added Syncables + * Invokes the presync method of all added Syncables. */ void preSynchronization(IsMaster isMaster); /** - * Invokes the postsync method of all added Syncables + * Invokes the postsync method of all added Syncables. */ void postSynchronization(IsMaster isMaster); /** * Add a Syncable to be synchronized over the SGCT cluster. - * \pre syncable must not be nullptr + * + * \pre syncable must not be `nullptr` */ void addSyncable(Syncable* syncable); /** - * Add multiple Syncables to be synchronized over the SGCT cluster + * Add multiple Syncables to be synchronized over the SGCT cluster. + * * \pre syncables must not contain any nullptr */ void addSyncables(const std::vector& syncables); /** - * Remove a Syncable from being synchronized over the SGCT cluster + * Remove a Syncable from being synchronized over the SGCT cluster. */ void removeSyncable(Syncable* syncable); /** - * Remove multiple Syncables from being synchronized over the SGCT cluster + * Remove multiple Syncables from being synchronized over the SGCT cluster. */ void removeSyncables(const std::vector& syncables); private: - /** - * Vector of Syncables. The vectors ensures consistent encode/decode order - */ + /// Vector of Syncables. The vectors ensures consistent encode/decode order. std::vector _syncables; - /** - * Databuffer used in encoding/decoding - */ + /// Databuffer used in encoding/decoding SyncBuffer _syncBuffer; }; diff --git a/include/openspace/events/event.h b/include/openspace/events/event.h index 08f15512d9..9f2f344bae 100644 --- a/include/openspace/events/event.h +++ b/include/openspace/events/event.h @@ -111,7 +111,7 @@ void logAllEvents(const Event* e); // /** - * This event is created whenever a new scene graph node is added to the system. By the + * This event is created whenever a new scene graph node is added to the system. By the * time this event is signalled, the scene graph node has already been created and added * to the scene. */ @@ -130,7 +130,7 @@ struct EventSceneGraphNodeAdded : public Event { }; /** - * This event is created whenever a scene graph node was removed. By the time this event + * This event is created whenever a scene graph node was removed. By the time this event * is signalled, the scene graph node has already been removed. */ struct EventSceneGraphNodeRemoved : public Event { @@ -164,7 +164,7 @@ struct EventParallelConnection : public Event { /** * Creates an instance of an EventParallelConnection event. * - * \param state_ The new state of the parallel connection system; is one of + * \param state_ The new state of the parallel connection system; is one of * `Established`, `Lost`, `HostshipGained`, or `HostshipLost` */ explicit EventParallelConnection(State state_); @@ -201,8 +201,8 @@ struct EventApplicationShutdown : public Event { /** * Creates an instance of an EventApplicationShutdown event. * - * \param state_ The next state of the application shutdown sequence; is one of - * `Started`, `Aborted`, or `Finished` + * \param state_ The next state of the application shutdown sequence; is one of + * `Started`, `Aborted`, or `Finished` */ explicit EventApplicationShutdown(State state_); const State state; @@ -210,7 +210,7 @@ struct EventApplicationShutdown : public Event { /** * This event is created when a new screenspace renderable has been created. By the time - * this event is craeted, the screenspace renderable is already registered and available. + * this event is created, the screenspace renderable is already registered and available. */ struct EventScreenSpaceRenderableAdded : public Event { static constexpr Type Type = Event::Type::ScreenSpaceRenderableAdded; @@ -229,7 +229,7 @@ struct EventScreenSpaceRenderableAdded : public Event { /** * This event is created when a screenspace renderable has been removed from the system. * When this event is created, the screenspace renderable has already been removed and is - * no longer available + * no longer available. */ struct EventScreenSpaceRenderableRemoved : public Event { static constexpr Type Type = Event::Type::ScreenSpaceRenderableRemoved; @@ -248,18 +248,18 @@ struct EventScreenSpaceRenderableRemoved : public Event { * distances. Right now, only movement relative to camera's focus node is considered. * Each scene graph node has an interaction sphere radius that serves as the reference * distance for all spheres. -``` -Diagram of events for a camera moving from right-to-left. Interaction sphere is 'O' in -middle, and ')' are spherical boundaries. The approach factor, reach factor, and -interaction sphere radius are all taken from the current focus node. - -|<------------------->| Approach factor * Interaction sphere - |<------>| Reach Factor * Interaction sphere - -( ( O ) ) -^ ^ ^ ^ -Exiting Receding Reaching Approaching -``` + * ``` + * Diagram of events for a camera moving from right-to-left. Interaction sphere is 'O' in + * middle, and ')' are spherical boundaries. The approach factor, reach factor, and + * interaction sphere radius are all taken from the current focus node. + * + * |<------------------->| Approach factor * Interaction sphere + * |<------>| Reach Factor * Interaction sphere + * + * ( ( O ) ) + * ^ ^ ^ ^ + * Exiting Receding Reaching Approaching + * ``` */ struct EventCameraFocusTransition : public Event { static constexpr Type Type = Event::Type::CameraFocusTransition; @@ -347,7 +347,7 @@ struct EventPlanetEclipsed : public Event { /** * This event is created when the interpolation of a property value is finished. If the - * interpolation time of a property change is 0s, this event is not fired + * interpolation time of a property change is 0s, this event is not fired. */ struct EventInterpolationFinished : public Event { static constexpr Type Type = Event::Type::InterpolationFinished; @@ -562,7 +562,7 @@ struct EventCameraPathFinished : public Event { }; /** - * This event is created when the a camera moves location + * This event is created when the a camera moves location. */ struct EventCameraMovedPosition : public Event { static constexpr Type Type = Event::Type::CameraMovedPosition; diff --git a/include/openspace/events/eventengine.h b/include/openspace/events/eventengine.h index 212a0305af..b0a84b79c3 100644 --- a/include/openspace/events/eventengine.h +++ b/include/openspace/events/eventengine.h @@ -48,7 +48,7 @@ public: * This function returns the first event stored in the EventEngine, or `nullptr` if * no event exists. To navigate the full list of events, you can access the returned * Event's next function. If the end of the list is reached, the next pointer will be - * a nullptr + * a `nullptr`. * * \return The first event stored in the EventEngine or nullptr if no event exists */ @@ -57,11 +57,11 @@ public: /** * Publish a new event of type T by providing optional arguments Args to the Event's * constructor. An example of usage is - * `engine.publishEvent("a", 2.0);` which would call the - * constructor of `MyEvent` with a `const char*` and `double` parameter. + * `engine.publishEvent("a", 2.0);` which would call the constructor of + * `MyEvent` with a `const char*` and `double` parameter. * - * \param args The arguments that are passed to the constructor of T * \tparam T The subclass of Event that is to be published + * \param args The arguments that are passed to the constructor of T */ template void publishEvent(Args&&... args); @@ -101,7 +101,7 @@ public: /** * Removing registration for a specific event identified by the \p identifier. * - * \param identifier The unique identifier of the event that should be removed. + * \param identifier The unique identifier of the event that should be removed */ void unregisterEventAction(uint32_t identifier); @@ -130,7 +130,7 @@ public: /** * Triggers all actions that are registered for events that are in the current event - * queue + * queue. */ void triggerActions() const; @@ -144,10 +144,9 @@ private: /// The last event in the chain of events stored in the memory pool events::Event* _lastEvent = nullptr; - - // The type is duplicated in the ActionInfo as well, but we want it in the ActionInfo - // to be able to return them to a caller and we want it in this unordered_map to make - // the lookup really fast. So having this extra wasted memory is probably worth it + /// The type is duplicated in the ActionInfo as well, but we want it in the ActionInfo + /// to be able to return them to a caller and we want it in this unordered_map to make + /// the lookup really fast. So having this extra wasted memory is probably worth it std::unordered_map> _eventActions; static uint32_t nextRegisteredEventId; diff --git a/include/openspace/interaction/camerainteractionstates.h b/include/openspace/interaction/camerainteractionstates.h index b220db6115..5e31c37c5f 100644 --- a/include/openspace/interaction/camerainteractionstates.h +++ b/include/openspace/interaction/camerainteractionstates.h @@ -33,9 +33,9 @@ namespace openspace::interaction { class CameraInteractionStates { public: /** - * \param sensitivity - * \param velocityScaleFactor can be set to 60 to remove the inertia of the - * interaction. Lower value will make it harder to move the camera. + * \param sensitivity Interaction sensitivity + * \param velocityScaleFactor Can be set to 60 to remove the inertia of the + * interaction. Lower value will make it harder to move the camera */ CameraInteractionStates(double sensitivity, double velocityScaleFactor); virtual ~CameraInteractionStates() = default; @@ -54,9 +54,9 @@ public: void resetVelocities(); - /* - * Returns true if any of the velocities are larger than zero, - * i.e. wether an interaction happened + /** + * Returns true if any of the velocities are larger than zero, i.e. wether an + * interaction happened. */ bool hasNonZeroVelocities(bool checkOnlyMovement = false); diff --git a/include/openspace/interaction/delayedvariable.h b/include/openspace/interaction/delayedvariable.h index 7f71c8f13b..67046c7bdf 100644 --- a/include/openspace/interaction/delayedvariable.h +++ b/include/openspace/interaction/delayedvariable.h @@ -28,9 +28,9 @@ namespace openspace::interaction { /** - * Class that acts as a smoothing filter to a variable. The filter has a step - * response on a form that resembles the function y = 1-e^(-t/scale). The variable - * will be updated as soon as it is set to a value (calling the set() function). + * Class that acts as a smoothing filter to a variable. The filter has a step response on + * a form that resembles the function y = 1-e^(-t/scale). The variable will be updated as + * soon as it is set to a value (calling the set() function). */ template class DelayedVariable { diff --git a/include/openspace/interaction/interactionmonitor.h b/include/openspace/interaction/interactionmonitor.h index 9cd80e210d..6cc2907a0e 100644 --- a/include/openspace/interaction/interactionmonitor.h +++ b/include/openspace/interaction/interactionmonitor.h @@ -52,7 +52,7 @@ public: /* * Called from all places we want to mark activity from. Updates the last registered - * interaction time + * interaction time. */ void markInteraction(); diff --git a/include/openspace/interaction/interpolator.h b/include/openspace/interaction/interpolator.h index 867b63ab66..d017bd8618 100644 --- a/include/openspace/interaction/interpolator.h +++ b/include/openspace/interaction/interpolator.h @@ -29,7 +29,7 @@ namespace openspace::interaction { -/* +/** * Interpolates a typename T using a transfer function. */ template diff --git a/include/openspace/interaction/joystickinputstate.h b/include/openspace/interaction/joystickinputstate.h index 76f68ff437..6c9cd42fa0 100644 --- a/include/openspace/interaction/joystickinputstate.h +++ b/include/openspace/interaction/joystickinputstate.h @@ -37,7 +37,7 @@ namespace openspace::interaction { /** * Actions that any button of a joystick can have. Each button must be in one of these - * states + * states. */ enum class JoystickAction : uint8_t { /// Idle state if the button is unpressed and has been unpressed since last frame @@ -81,7 +81,7 @@ struct JoystickInputStates : public std::array static constexpr int MaxNumJoysticks = 16; /** - * This function return the number of axes the joystick with the given name has + * This function return the number of axes the joystick with the given name has. * * \param joystickName The name of the joystick to check how many axes it has, * if empty the max number of axes for all joysticks are returned @@ -90,7 +90,7 @@ struct JoystickInputStates : public std::array int numAxes(const std::string& joystickName = "") const; /** - * This function return the number of buttons the joystick with the given name has + * This function return the number of buttons the joystick with the given name has. * * \param joystickName The name of the joystick to check how many buttons it has, * if empty the max number of buttons for all joysticks are returned diff --git a/include/openspace/interaction/sessionrecording.h b/include/openspace/interaction/sessionrecording.h index 0741e4e6f6..284ea1e459 100644 --- a/include/openspace/interaction/sessionrecording.h +++ b/include/openspace/interaction/sessionrecording.h @@ -72,9 +72,9 @@ public: double timeSim; }; - /* - * Struct for storing a script substring that, if found in a saved script, - * will be replaced by its substringReplacement counterpart. + /** + * Struct for storing a script substring that, if found in a saved script, will be + * replaced by its substringReplacement counterpart. */ struct ScriptSubstringReplace { std::string substringFound; @@ -110,9 +110,9 @@ public: void deinitialize(); /** - * This is called with every rendered frame. If in recording state, the camera - * state will be saved to the recording file (if its state has changed since last). - * If in playback state, the next keyframe will be used (if it is time to do so). + * This is called with every rendered frame. If in recording state, the camera state + * will be saved to the recording file (if its state has changed since last). If in + * playback state, the next keyframe will be used (if it is time to do so). */ void preSynchronization(); @@ -123,12 +123,12 @@ public: void render(); /** - * Current time based on playback mode + * Current time based on playback mode. */ double currentTime() const; /** - * Fixed delta time set by user for use during saving of frame during playback mode + * Fixed delta time set by user for use during saving of frame during playback mode. */ double fixedDeltaTimeDuringFrameOutput() const; @@ -140,9 +140,8 @@ public: * However, during playback it is incremented by the fixed framerate of the playback * rather than the actual clock value (as in normal operation). * - * \returns number of microseconds elapsed since playback started in terms of the - * number of rendered frames multiplied by the fixed time increment per - * frame + * \return Number of microseconds elapsed since playback started in terms of the + * number of rendered frames multiplied by the fixed time increment per frame */ std::chrono::steady_clock::time_point currentPlaybackInterpolationTime() const; @@ -151,28 +150,27 @@ public: * used when playback is set to be in the mode where a screenshot is captured with * every rendered frame (enableTakeScreenShotDuringPlayback() is used to enable this * mode). At the start of playback, this timer is set to the value of the current - * applicationTime function provided by the window delegate (used during normal - * mode or playback). However, during playback it is incremented by the fixed - * framerate of the playback rather than the actual clock value. + * applicationTime function provided by the window delegate (used during normal mode + * or playback). However, during playback it is incremented by the fixed framerate of + * the playback rather than the actual clock value. * - * \returns application time in seconds, for use in playback-with-frames mode + * \return Application time in seconds, for use in playback-with-frames mode */ double currentApplicationInterpolationTime() const; /** - * Starts a recording session, which will save data to the provided filename - * according to the data format specified, and will continue until recording is - * stopped using stopRecording() method. + * Starts a recording session, which will save data to the provided filename according + * to the data format specified, and will continue until recording is stopped using + * stopRecording() method. * - * \param filename file saved with recorded keyframes. - * - * \returns true if recording to file starts without errors. + * \param filename File saved with recorded keyframes + * \return `true` if recording to file starts without errors */ bool startRecording(const std::string& filename); /** - * Starts a recording session, which will save data to the provided filename - * in ASCII data format until recording is stopped using stopRecording() method. + * Starts a recording session, which will save data to the provided filename in ASCII + * data format until recording is stopped using stopRecording() method. * * \param dataMode The format in which the session recording is stored */ @@ -187,23 +185,23 @@ public: /** * Used to check if a session recording is in progress. * - * \return true if recording is in progress + * \return `true` if recording is in progress */ bool isRecording() const; /** * Starts a playback session, which can run in one of three different time modes. * - * \param filename file containing recorded keyframes to play back. The file path - * is relative to the base recordings directory specified in the - * config file by the RECORDINGS variable - * \param timeMode which of the 3 time modes to use for time reference during - * \param forceSimTimeAtStart if true simulation time is forced to that of playback + * \param filename File containing recorded keyframes to play back. The file path is + * relative to the base recordings directory specified in the config + * file by the RECORDINGS variable + * \param timeMode Which of the 3 time modes to use for time reference during + * \param forceSimTimeAtStart If true simulation time is forced to that of playback * playback: recorded time, application time, or simulation time. See the * LuaLibrary entry for SessionRecording for details on these time modes - * \param loop if true then the file will playback in loop mode, continuously - * looping back to the beginning until it is manually stopped - * \param shouldWaitForFinishedTiles if true, the playback will wait for tiles to be + * \param loop If true then the file will playback in loop mode, continuously looping + * back to the beginning until it is manually stopped + * \param shouldWaitForFinishedTiles If true, the playback will wait for tiles to be * finished before progressing to the next frame. This value is only used when * `enableTakeScreenShotDuringPlayback` was called before. Otherwise this value * will be ignored @@ -214,8 +212,8 @@ public: bool forceSimTimeAtStart, bool loop, bool shouldWaitForFinishedTiles); /** - * Used to stop a playback in progress. If open, the playback file will be closed, - * and all keyframes deleted from memory. + * Used to stop a playback in progress. If open, the playback file will be closed, and + * all keyframes deleted from memory. */ void stopPlayback(); @@ -227,33 +225,34 @@ public: bool isPlaybackPaused(); /** - * Pauses a playback session. This does both the normal pause functionality of - * setting simulation delta time to zero, and pausing the progression through the - * timeline. + * Pauses a playback session. This does both the normal pause functionality of setting + * simulation delta time to zero, and pausing the progression through the timeline. * - * \param pause if true, then will set playback timeline progression to zero + * \param pause If `true`, then will set playback timeline progression to zero */ void setPlaybackPause(bool pause); /** - * Enables that rendered frames should be saved during playback + * Enables that rendered frames should be saved during playback. + * * \param fps Number of frames per second. */ void enableTakeScreenShotDuringPlayback(int fps); /** - * Used to disable that renderings are saved during playback + * Used to disable that renderings are saved during playback. */ void disableTakeScreenShotDuringPlayback(); /** * Used to check if a session playback is in progress. - * \returns true if playback is in progress. + * + * \return `true` if playback is in progress */ bool isPlayingBack() const; /** - * Is saving frames during playback + * Is saving frames during playback. */ bool isSavingFramesDuringPlayback() const; @@ -289,15 +288,14 @@ public: /** * \return The Lua library that contains all Lua functions available to affect the - * interaction + * interaction */ static openspace::scripting::LuaLibrary luaLibrary(); /** * Used to request a callback for notification of playback state change. * - * \param cb function handle for callback - * + * \param cb Function handle for callback * \return CallbackHandle value of callback number */ CallbackHandle addStateChangeCallback(StateChangeCallback cb); @@ -305,14 +303,14 @@ public: /** * Removes the callback for notification of playback state change. * - * \param callback function handle for the callback + * \param callback Function handle for the callback */ void removeStateChangeCallback(CallbackHandle callback); /** * Provides list of available playback files. * - * \return vector of filenames in recordings dir + * \return Vector of filenames in recordings dir */ std::vector playbackList() const; @@ -320,12 +318,11 @@ public: * Reads a camera keyframe from a binary format playback file, and populates input * references with the parameters of the keyframe. * - * \param times reference to a timestamps structure which contains recorded times - * \param kf reference to a camera keyframe which contains camera details - * \param file an ifstream reference to the playback file being read - * \param lineN keyframe number in playback file where this keyframe resides - * - * \return true if data read has no errors + * \param times Reference to a timestamps structure which contains recorded times + * \param kf Reference to a camera keyframe which contains camera details + * \param file An ifstream reference to the playback file being read + * \param lineN Keyframe number in playback file where this keyframe resides + * \return `true` if data read has no errors */ bool readCameraKeyframeBinary(Timestamps& times, datamessagestructures::CameraKeyframe& kf, std::ifstream& file, int lineN); @@ -334,12 +331,11 @@ public: * Reads a camera keyframe from an ascii format playback file, and populates input * references with the parameters of the keyframe. * - * \param times reference to a timestamps structure which contains recorded times - * \param kf reference to a camera keyframe which contains camera details - * \param currentParsingLine string containing the most current line that was read - * \param lineN line number in playback file where this keyframe resides - * - * \return true if data read has no errors + * \param times Reference to a timestamps structure which contains recorded times + * \param kf Reference to a camera keyframe which contains camera details + * \param currentParsingLine String containing the most current line that was read + * \param lineN Line number in playback file where this keyframe resides + * \return `true` if data read has no errors */ bool readCameraKeyframeAscii(Timestamps& times, datamessagestructures::CameraKeyframe& kf, std::string currentParsingLine, @@ -349,12 +345,11 @@ public: * Reads a time keyframe from a binary format playback file, and populates input * references with the parameters of the keyframe. * - * \param times reference to a timestamps structure which contains recorded times - * \param kf reference to a time keyframe which contains time details - * \param file an ifstream reference to the playback file being read - * \param lineN keyframe number in playback file where this keyframe resides - * - * \return true if data read has no errors + * \param times Reference to a timestamps structure which contains recorded times + * \param kf Reference to a time keyframe which contains time details + * \param file An ifstream reference to the playback file being read + * \param lineN Keyframe number in playback file where this keyframe resides + * \return `true` if data read has no errors */ bool readTimeKeyframeBinary(Timestamps& times, datamessagestructures::TimeKeyframe& kf, std::ifstream& file, int lineN); @@ -363,12 +358,11 @@ public: * Reads a time keyframe from an ascii format playback file, and populates input * references with the parameters of the keyframe. * - * \param times reference to a timestamps structure which contains recorded times - * \param kf reference to a time keyframe which contains time details - * \param currentParsingLine string containing the most current line that was read - * \param lineN line number in playback file where this keyframe resides - * - * \return true if data read has no errors + * \param times Reference to a timestamps structure which contains recorded times + * \param kf Reference to a time keyframe which contains time details + * \param currentParsingLine String containing the most current line that was read + * \param lineN Line number in playback file where this keyframe resides + * \return `true` if data read has no errors */ bool readTimeKeyframeAscii(Timestamps& times, datamessagestructures::TimeKeyframe& kf, std::string currentParsingLine, @@ -378,13 +372,12 @@ public: * Reads a script keyframe from a binary format playback file, and populates input * references with the parameters of the keyframe. * - * \param times reference to a timestamps structure which contains recorded times - * \param kf reference to a script keyframe which contains the size of the script - * (in chars) and the text itself - * \param file an ifstream reference to the playback file being read - * \param lineN keyframe number in playback file where this keyframe resides - * - * \return true if data read has no errors + * \param times Reference to a timestamps structure which contains recorded times + * \param kf Reference to a script keyframe which contains the size of the script (in + * chars) and the text itself + * \param file An ifstream reference to the playback file being read + * \param lineN Keyframe number in playback file where this keyframe resides + * \return `true` if data read has no errors */ bool readScriptKeyframeBinary(Timestamps& times, datamessagestructures::ScriptMessage& kf, std::ifstream& file, int lineN); @@ -393,36 +386,35 @@ public: * Reads a script keyframe from an ascii format playback file, and populates input * references with the parameters of the keyframe. * - * \param times reference to a timestamps structure which contains recorded times - * \param kf reference to a script keyframe which contains the size of the script - * (in chars) and the text itself - * \param currentParsingLine string containing the most current line that was read - * \param lineN line number in playback file where this keyframe resides - * - * \return true if data read has no errors + * \param times Reference to a timestamps structure which contains recorded times + * \param kf Reference to a script keyframe which contains the size of the script (in + * chars) and the text itself + * \param currentParsingLine String containing the most current line that was read + * \param lineN Line number in playback file where this keyframe resides + * \return `true` if data read has no errors */ bool readScriptKeyframeAscii(Timestamps& times, datamessagestructures::ScriptMessage& kf, std::string currentParsingLine, int lineN); /** - * Writes a camera keyframe to a binary format recording file using a CameraKeyframe + * Writes a camera keyframe to a binary format recording file using a CameraKeyframe. * - * \param times reference to a timestamps structure which contains recorded times - * \param kf reference to a camera keyframe which contains the camera details - * \param kfBuffer a buffer temporarily used for preparing data to be written - * \param file an ofstream reference to the recording file being written-to + * \param times Reference to a timestamps structure which contains recorded times + * \param kf Reference to a camera keyframe which contains the camera details + * \param kfBuffer A buffer temporarily used for preparing data to be written + * \param file An ofstream reference to the recording file being written-to */ void saveCameraKeyframeBinary(Timestamps& times, datamessagestructures::CameraKeyframe& kf, unsigned char* kfBuffer, std::ofstream& file); /** - * Writes a camera keyframe to an ascii format recording file using a CameraKeyframe + * Writes a camera keyframe to an ascii format recording file using a CameraKeyframe. * - * \param times reference to a timestamps structure which contains recorded times - * \param kf reference to a camera keyframe which contains the camera details - * \param file an ofstream reference to the recording file being written-to + * \param times Reference to a timestamps structure which contains recorded times + * \param kf Reference to a camera keyframe which contains the camera details + * \param file An ofstream reference to the recording file being written-to */ void saveCameraKeyframeAscii(Timestamps& times, datamessagestructures::CameraKeyframe& kf, std::ofstream& file); @@ -430,113 +422,111 @@ public: /** * Writes a time keyframe to a binary format recording file using a TimeKeyframe * - * \param times reference to a timestamps structure which contains recorded times - * \param kf reference to a time keyframe which contains the time details - * \param kfBuffer a buffer temporarily used for preparing data to be written - * \param file an ofstream reference to the recording file being written-to + * \param times Reference to a timestamps structure which contains recorded times + * \param kf Reference to a time keyframe which contains the time details + * \param kfBuffer A buffer temporarily used for preparing data to be written + * \param file An ofstream reference to the recording file being written-to */ void saveTimeKeyframeBinary(Timestamps& times, datamessagestructures::TimeKeyframe& kf, unsigned char* kfBuffer, std::ofstream& file); /** - * Writes a time keyframe to an ascii format recording file using a TimeKeyframe + * Writes a time keyframe to an ascii format recording file using a TimeKeyframe. * - * \param times reference to a timestamps structure which contains recorded times - * \param kf reference to a time keyframe which contains the time details - * \param file an ofstream reference to the recording file being written-to + * \param times Reference to a timestamps structure which contains recorded times + * \param kf Reference to a time keyframe which contains the time details + * \param file An ofstream reference to the recording file being written-to */ void saveTimeKeyframeAscii(Timestamps& times, datamessagestructures::TimeKeyframe& kf, std::ofstream& file); /** - * Writes a script keyframe to a binary format recording file using a ScriptMessage + * Writes a script keyframe to a binary format recording file using a ScriptMessage. * - * \param times reference to a timestamps structure which contains recorded times - * \param sm reference to a ScriptMessage object which contains the script details - * \param smBuffer a buffer temporarily used for preparing data to be written - * \param file an ofstream reference to the recording file being written-to + * \param times Reference to a timestamps structure which contains recorded times + * \param sm Reference to a ScriptMessage object which contains the script details + * \param smBuffer A buffer temporarily used for preparing data to be written + * \param file An ofstream reference to the recording file being written-to */ void saveScriptKeyframeBinary(Timestamps& times, datamessagestructures::ScriptMessage& sm, unsigned char* smBuffer, std::ofstream& file); /** - * Writes a script keyframe to an ascii format recording file using a ScriptMessage + * Writes a script keyframe to an ascii format recording file using a ScriptMessage. * - * \param times reference to a timestamps structure which contains recorded times - * \param sm reference to a ScriptMessage which contains the script details - * \param file an ofstream reference to the recording file being written-to + * \param times Reference to a timestamps structure which contains recorded times + * \param sm Reference to a ScriptMessage which contains the script details + * \param file An ofstream reference to the recording file being written-to */ void saveScriptKeyframeAscii(Timestamps& times, datamessagestructures::ScriptMessage& sm, std::ofstream& file); /** * Since session recordings only record changes, the initial conditions aren't - * preserved when a playback starts. This function is called whenever a property - * value is set and a recording is in progress. Before the set happens, this - * function will read the current value of the property and store it so that when - * the recording is finished, the initial state will be added as a set property - * command at the beginning of the recording file, to be applied when playback - * starts. + * preserved when a playback starts. This function is called whenever a property value + * is set and a recording is in progress. Before the set happens, this function will + * read the current value of the property and store it so that when the recording is + * finished, the initial state will be added as a set property command at the + * beginning of the recording file, to be applied when playback starts. * * \param prop The property being set */ void savePropertyBaseline(properties::Property& prop); /** - * Reads header information from a session recording file + * Reads header information from a session recording file. * - * \param stream reference to ifstream that contains the session recording file data - * \param readLen_chars number of characters to be read, which may be the expected + * \param stream Reference to ifstream that contains the session recording file data + * \param readLen_chars Number of characters to be read, which may be the expected * length of the header line, or an arbitrary number of characters within it */ static std::string readHeaderElement(std::ifstream& stream, size_t readLen_chars); /** - * Reads header information from a session recording file + * Reads header information from a session recording file. * - * \param stream reference to ifstream that contains the session recording file - * data - * \param readLen_chars number of characters to be read, which may be the expected + * \param stream Reference to ifstream that contains the session recording file data + * \param readLen_chars Number of characters to be read, which may be the expected * length of the header line, or an arbitrary number of characters within it */ static std::string readHeaderElement(std::stringstream& stream, size_t readLen_chars); /** - * Writes a header to a binary recording file buffer + * Writes a header to a binary recording file buffer. * - * \param times reference to a timestamps structure which contains recorded times - * \param type single character signifying the keyframe type - * \param kfBuffer the char buffer holding the recording info to be written - * \param idx index into write buffer (this is updated with the num of chars written) + * \param times Reference to a timestamps structure which contains recorded times + * \param type Single character signifying the keyframe type + * \param kfBuffer The char buffer holding the recording info to be written + * \param idx Index into write buffer (this is updated with the num of chars written) */ static void saveHeaderBinary(Timestamps& times, char type, unsigned char* kfBuffer, size_t& idx); /** - * Writes a header to an ascii recording file buffer + * Writes a header to an ASCII recording file buffer. * - * \param times reference to a timestamps structure which contains recorded times - * \param type string signifying the keyframe type - * \param line the stringstream buffer being written to + * \param times Reference to a timestamps structure which contains recorded times + * \param type String signifying the keyframe type + * \param line The stringstream buffer being written to */ static void saveHeaderAscii(Timestamps& times, const std::string& type, std::stringstream& line); /** - * Saves a keyframe to an ascii recording file + * Saves a keyframe to an ASCII recording file. * - * \param entry the ascii string version of the keyframe (any type) - * \param file ofstream object to write to + * \param entry The ASCII string version of the keyframe (any type) + * \param file `std::ofstream` object to write to */ static void saveKeyframeToFile(std::string entry, std::ofstream& file); /** - * Checks if a specified recording file ends with a particular file extension + * Checks if a specified recording file ends with a particular file extension. * - * \param filename the name of the file to record to - * \param extension the file extension to check for + * \param filename The name of the file to record to + * \param extension The file extension to check for */ static bool hasFileExtension(std::string filename, std::string extension); @@ -545,10 +535,9 @@ public: * (will determine the file format conversion to convert from based on the file's * header version number). * - * \param filename name of the file to convert + * \param filename Name of the file to convert * \param depth iteration number to prevent runaway recursion (init call with zero) - * - * \return string containing the filename of the previous conversion step. This is + * \return String containing the filename of the previous conversion step. This is * used if there are multiple conversion steps where each step has to use * the output of the previous. */ @@ -558,43 +547,42 @@ public: * Converts file format of a session recording file to the current format version * (will determine the file format conversion to convert from based on the file's * header version number). Accepts a relative path (currently from task runner dir) - * rather than a path assumed to be relative to ${RECORDINGS}. + * rather than a path assumed to be relative to `${RECORDINGS}`. * * \param filenameRelative name of the file to convert */ void convertFileRelativePath(std::string filenameRelative); /** - * Goes to legacy session recording inherited class, and calls its convertFile() + * Goes to legacy session recording inherited class, and calls its #convertFile * method, and then returns the resulting conversion filename. * - * \param filename name of the file to convert - * \param depth iteration number to prevent runaway recursion (init call with zero) - * + * \param filename Name of the file to convert + * \param depth Iteration number to prevent runaway recursion (init call with zero) * \return string containing the filename of the conversion */ virtual std::string getLegacyConversionResult(std::string filename, int depth); - /* - * Version string for file format version currently supported by this class + /** + * Version string for file format version currently supported by this class. * * \return string of the file format version this class supports */ virtual std::string fileFormatVersion(); - /* - * Version string for file format version that a conversion operation will convert - * to (e.g. upgrades to this version). This is only relevant for inherited classes - * that support conversion from legacy versions (if called in the base class, it - * will return its own current version). + /** + * Version string for file format version that a conversion operation will convert to + * (e.g. upgrades to this version). This is only relevant for inherited classes that + * support conversion from legacy versions (if called in the base class, it will + * return its own current version). * * \return string of the file format version this class supports */ virtual std::string targetFileFormatVersion(); - /* - * Determines a filename for the conversion result based on the original filename - * and the file format version number. + /** + * Determines a filename for the conversion result based on the original filename and + the file format version number. * * \param filename source filename to be converted * @@ -776,6 +764,7 @@ protected: "NavigationHandler.OrbitalNavigator.RetargetAnchor", "NavigationHandler.OrbitalNavigator.RetargetAim" }; + //A script that begins with an exact match of any of the strings contained in // _scriptRejects will not be recorded const std::vector _scriptRejects = { @@ -791,12 +780,14 @@ protected: "Anchor", "Aim" }; + //Any script snippet included in this vector will be trimmed from any script // from the script manager, before it is recorded in the session recording file. // The remainder of the script will be retained. const std::vector _scriptsToBeTrimmed = { "openspace.sessionRecording.togglePlaybackPause" }; + //Any script snippet included in this vector will be trimmed from any script // from the script manager, before it is recorded in the session recording file. // The remainder of the script will be retained. diff --git a/include/openspace/interaction/websocketinputstate.h b/include/openspace/interaction/websocketinputstate.h index af010226e7..0b57864a23 100644 --- a/include/openspace/interaction/websocketinputstate.h +++ b/include/openspace/interaction/websocketinputstate.h @@ -37,7 +37,7 @@ namespace openspace::interaction { /** * Actions that any button of a websocket can have. Each button must be in one of these - * states + * states. */ enum class WebsocketAction : uint8_t { /// Idle state if the button is unpressed and has been unpressed since last frame diff --git a/include/openspace/mission/mission.h b/include/openspace/mission/mission.h index 281fe107ae..731e1951a3 100644 --- a/include/openspace/mission/mission.h +++ b/include/openspace/mission/mission.h @@ -51,8 +51,8 @@ struct Milestone { * phases within phases. Designed for WORM usage (Write Once, Read Multiple), and, * therefore, has only accessors. * - * Each MissionPhase is characterized by its MissionPhase::name, a TimeRange, an - * optional MissionPhase::description, and optional subphases. + * Each MissionPhase is characterized by its MissionPhase::name, a TimeRange, an optional + * MissionPhase::description, and optional subphases. */ class MissionPhase { public: @@ -147,6 +147,7 @@ public: /** * Returns the Documentation that describes the ghoul::Dictionarty that this * MissionPhase can be constructed from. + * * \return The Documentation that describes the required structure for a Dictionary */ static documentation::Documentation Documentation(); @@ -161,7 +162,7 @@ protected: * \param trace The list of MissionPhase%s that are active during the time \p time * \param maxDepth The maximum depth of levels that will be considered * - * \pre maxDepth must not be negative + * \pre \p maxDepth must not be negative */ void phaseTrace(double time, Trace& trace, int maxDepth) const; diff --git a/include/openspace/mission/missionmanager.h b/include/openspace/mission/missionmanager.h index 6e7d395b34..e7a3f9f1bc 100644 --- a/include/openspace/mission/missionmanager.h +++ b/include/openspace/mission/missionmanager.h @@ -78,18 +78,18 @@ public: * Sets the mission with the name \p missionName as the current mission. The current * mission is what is return by `currentMission()`. * - * \pre missionName must not be empty + * \pre \p missionName must not be empty */ void setCurrentMission(const std::string& missionName); /** - * Returns true if a current mission exists + * Returns true if a current mission exists. */ bool hasCurrentMission() const; /** - * Returns the latest mission specified to `setCurrentMission()`. If no mission has - * been specified, the first mission loaded will be returned. If no mission has been + * Returns the latest mission specified to #setCurrentMission. If no mission has been + * specified, the first mission loaded will be returned. If no mission has been * loaded, a warning will be printed and a dummy mission will be returned. */ const Mission& currentMission(); @@ -99,7 +99,6 @@ public: */ const std::map& missionMap(); - static scripting::LuaLibrary luaLibrary(); private: diff --git a/include/openspace/navigation/keyframenavigator.h b/include/openspace/navigation/keyframenavigator.h index e38fba0bfb..9bb1a3ee4f 100644 --- a/include/openspace/navigation/keyframenavigator.h +++ b/include/openspace/navigation/keyframenavigator.h @@ -60,13 +60,14 @@ public: }; /** - * Update camera position using the next camera pose keyframe from the timeline. - * Returns true if camera was set to a pose from the next keyframe. - * Returns false if no keyframes are available after the current time. - * \param camera A reference to the camera object to have its pose updated. - * \param ignoreFutureKeyframes true if only past keyframes are to be used. - * \returns true only if a new future keyframe is available to set camera pose. - */ + * Update camera position using the next camera pose keyframe from the timeline. + * Returns true if camera was set to a pose from the next keyframe. Returns false if + * no keyframes are available after the current time. + * + * \param camera A reference to the camera object to have its pose updated + * \param ignoreFutureKeyframes `true` if only past keyframes are to be used + * \return true only if a new future keyframe is available to set camera pose + */ bool updateCamera(Camera& camera, bool ignoreFutureKeyframes); static bool updateCamera(Camera* camera, const CameraPose prevPose, const CameraPose nextPose, double t, bool ignoreFutureKeyframes); diff --git a/include/openspace/navigation/navigationhandler.h b/include/openspace/navigation/navigationhandler.h index fa32df0e4d..ebec211fd3 100644 --- a/include/openspace/navigation/navigationhandler.h +++ b/include/openspace/navigation/navigationhandler.h @@ -151,7 +151,7 @@ public: * Set camera state from a provided navigation state next frame. The actual position * will computed from the scene in the same frame as it is set. * - * \param state the navigation state to compute a camera positon from + * \param state The navigation state to compute a camera positon from */ void setNavigationStateNextFrame(const NavigationState& state); @@ -161,14 +161,14 @@ public: * node info. The actual position will computed from the scene in the same frame as * it is set. * - * \param spec the node specification from which to compute the resulting camera pose + * \param spec The node specification from which to compute the resulting camera pose */ void setCameraFromNodeSpecNextFrame(NodeCameraStateSpec spec); /** - * \return The Lua library that contains all Lua functions available to affect the - * interaction - */ + * \return The Lua library that contains all Lua functions available to affect the + * interaction + */ static scripting::LuaLibrary luaLibrary(); private: diff --git a/include/openspace/navigation/orbitalnavigator.h b/include/openspace/navigation/orbitalnavigator.h index 0d5f440cb9..334c8cb400 100644 --- a/include/openspace/navigation/orbitalnavigator.h +++ b/include/openspace/navigation/orbitalnavigator.h @@ -43,9 +43,9 @@ #include namespace openspace { - class SceneGraphNode; class Camera; struct CameraPose; + class SceneGraphNode; struct SurfacePositionHandle; } // namespace @@ -87,10 +87,10 @@ public: void updateCameraScalingFromAnchor(double deltaTime); void resetVelocities(); - /* + /** * This function should be called on every camera interaction: for example when - * navigating using an input device, changing the focus node or starting a path or - * a session recording playback + * navigating using an input device, changing the focus node or starting a path or a + * session recording playback */ void updateOnCameraInteraction(); @@ -143,16 +143,15 @@ public: glm::quat anchorNodeToCameraRotation() const; /** - * Compute a camera position that pushed the camera position to - * a valid position over the anchor node, accounting for the - * minimal allowed distance + * Compute a camera position that pushed the camera position to a valid position over + * the anchor node, accounting for the minimal allowed distance */ glm::dvec3 pushToSurfaceOfAnchor(const glm::dvec3& cameraPosition) const; /** - * \return the Lua library that contains all Lua functions available to affect the - * OrbitalNavigator - */ + * \return The Lua library that contains all Lua functions available to affect the + * OrbitalNavigator + */ static scripting::LuaLibrary luaLibrary(); private: @@ -184,12 +183,11 @@ private: Friction _friction; - // Anchor: Node to follow and orbit + /// Anchor: Node to follow and orbit properties::StringProperty _anchor; - // Aim: Node to look at (when camera direction is reset), - // Empty string means same as anchor. - // If these are the same node we call it the `focus` node + /// Aim: Node to look at (when camera direction is reset), empty string means same as + /// anchor. If these are the same node we call it the `focus` node properties::StringProperty _aim; // Reset camera direction to the anchor node. @@ -283,6 +281,7 @@ private: * Decomposes the camera's rotation in to a global and a local rotation defined by * CameraRotationDecomposition. The global rotation defines the rotation so that the * camera points towards the reference position. + * * The local rotation defines the differential from the global to the current total * rotation so that `cameraRotation = globalRotation * localRotation`. */ @@ -290,40 +289,42 @@ private: glm::dvec3 reference); /** - * Composes a pair of global and local rotations into a quaternion that can be used - * as the world rotation for a camera. + * Composes a pair of global and local rotations into a quaternion that can be used as + * the world rotation for a camera. */ glm::dquat composeCameraRotation(const CameraRotationDecomposition& composition); - /* - * Moves and rotates the camera around the anchor node in order to maintain the - * screen space position of the aim node. Also interpolates to the aim node, when - * retargeting the aim. + /** + * Moves and rotates the camera around the anchor node in order to maintain the screen + * space position of the aim node. Also interpolates to the aim node, when retargeting + * the aim. */ CameraPose followAim(CameraPose pose, glm::dvec3 cameraToAnchor, Displacement anchorToAim); - /* - * Perform a camera roll on the local camera rotation - * \returns a local camera rotation modified with a roll. + /** + * Perform a camera roll on the local camera rotation. + * + * \return A local camera rotation modified with a roll */ glm::dquat roll(double deltaTime, const glm::dquat& localCameraRotation) const; /** * Performs rotation around the cameras x and y axes. - * \returns a local camera rotation modified with two degrees of freedom. + * + * \return A local camera rotation modified with two degrees of freedom */ glm::dquat rotateLocally(double deltaTime, const glm::dquat& localCameraRotation) const; /** * Interpolates the camera rotation based on active interpolators. - * \returns a new rotation quaternion + * + * \return A new rotation quaternion */ glm::dquat interpolateLocalRotation(double deltaTime, const glm::dquat& localCameraRotation); - Displacement interpolateRetargetAim(double deltaTime, CameraPose pose, glm::dvec3 cameraToAnchor, Displacement anchorToAim); @@ -332,7 +333,7 @@ private: /** * Modify the camera position and global rotation to rotate around the up vector - * of the current anchor based on x-wise input + * of the current anchor based on x-wise input. * * The up-vector to rotate around is determined by the "_upToUseForRotation" property */ @@ -344,18 +345,18 @@ private: * result in an orbital rotation around the object. This function does not affect the * rotation but only the position. * - * \return a position vector adjusted in the horizontal direction. + * \return A position vector adjusted in the horizontal direction. */ glm::dvec3 translateHorizontally(double deltaTime, double speedScale, const glm::dvec3& cameraPosition, const glm::dvec3& objectPosition, const glm::dquat& globalCameraRotation, const SurfacePositionHandle& positionHandle) const; - /* + /** * Adds rotation to the camera position so that it follows the rotation of the anchor - * node defined by the differential anchorNodeRotationDiff. + * node defined by the differential \p anchorNodeRotationDiff. * - * \return a position updated with the rotation defined by anchorNodeRotationDiff + * \return A position updated with the rotation defined by \p anchorNodeRotationDiff */ glm::dvec3 followAnchorNodeRotation(const glm::dvec3& cameraPosition, const glm::dvec3& objectPosition, const glm::dquat& anchorNodeRotationDiff) const; @@ -363,7 +364,7 @@ private: /** * Updates the global rotation so that it points towards the anchor node. * - * \return a global rotation quaternion defining a rotation towards the anchor node + * \return A global rotation quaternion defining a rotation towards the anchor node */ glm::dquat rotateGlobally(const glm::dquat& globalCameraRotation, const glm::dquat& aimNodeRotationDiff, @@ -371,7 +372,8 @@ private: /** * Translates the camera position towards or away from the anchor node. - * \returns a position vector adjusted in the vertical direction. + * + * \return A position vector adjusted in the vertical direction. */ glm::dvec3 translateVertically(double deltaTime, const glm::dvec3& cameraPosition, const glm::dvec3& objectPosition, @@ -380,7 +382,7 @@ private: /** * Rotates the camera around the out vector of the surface. * - * \return a quaternion adjusted to rotate around the out vector of the surface + * \return A quaternion adjusted to rotate around the out vector of the surface */ glm::dquat rotateHorizontally(double deltaTime, const glm::dquat& globalCameraRotation, @@ -389,7 +391,7 @@ private: /** * Push the camera out to the surface of the object. * - * \return a position vector adjusted to be at least _minimumAllowedDistance meters + * \return A position vector adjusted to be at least _minimumAllowedDistance meters * above the actual surface of the object */ glm::dvec3 pushToSurface(const glm::dvec3& cameraPosition, @@ -417,7 +419,7 @@ private: void resetIdleBehavior(); /** - * Apply the currently selected idle behavior to the position and rotations + * Apply the currently selected idle behavior to the position and rotations. */ void applyIdleBehavior(double deltaTime, glm::dvec3& position, glm::dquat& localRotation, glm::dquat& globalRotation); @@ -441,8 +443,8 @@ private: * vector coincides with the axis, and should be used with care. * * Used for: - * IdleBehavior::Behavior::OrbitAtConstantLat (axis = north = z-axis) and - * IdleBehavior::Behavior::OrbitAroundUp (axis = up = y-axis) + * - IdleBehavior::Behavior::OrbitAtConstantLat (axis = north = z-axis) and + * - IdleBehavior::Behavior::OrbitAroundUp (axis = up = y-axis) * * \param axis The axis to arbit around, given in model coordinates of the anchor * \param angle The rotation angle to use for the motion diff --git a/include/openspace/navigation/path.h b/include/openspace/navigation/path.h index 0d9851f6c1..5be7c88fca 100644 --- a/include/openspace/navigation/path.h +++ b/include/openspace/navigation/path.h @@ -44,12 +44,12 @@ public: AvoidCollision = 0, ZoomOutOverview, Linear, - AvoidCollisionWithLookAt // @TODO (2021-08-13, emmbr) This type right now leads - // to rapid rotations, but is useful in specific - // scenarios, e.g. close to surfaces. Later we want to - // remove it, and create a curve type that looks nicely - // at the targets when moving, avoids collisions and - // doesn't introduce sudden large changes in rotation + + // @TODO (2021-08-13, emmbr) This type right now leads to rapid rotations, but is + // useful in specific scenarios, e.g. close to surfaces. Later we want to remove + // it, and create a curve type that looks nicely at the targets when moving, + // avoids collisions and doesn't introduce sudden large changes in rotation + AvoidCollisionWithLookAt }; Path(Waypoint start, Waypoint end, Type type, @@ -59,55 +59,55 @@ public: Waypoint endPoint() const; /** - * Return the total length of the the curve for the path, in meters + * Return the total length of the the curve for the path, in meters. */ double pathLength() const; /** * Return a vector of positions corresponding to the control points of the path's - * spline curve + * spline curve. */ std::vector controlPoints() const; /** * Take a step along the current path, corresponding to the delta time step \p dt, and * return the resulting camera pose. The \p speedScale is a factor that will be - * multiplied with the traversal speed + * multiplied with the traversal speed. */ CameraPose traversePath(double dt, float speedScale = 1.f); /** * Function that can be used to permaturely quit a path, for example when skipping - * to the end + * to the end. */ void quitPath(); /** * Return the identifer of the node that is the current appropriate anchor node, of * the start and end waypoint's reference node. Dtermined based on how far along the - * path we have traveled + * path we have traveled. */ std::string currentAnchor() const; /** - * Return wether the path has reached its end point or not + * Return wether the path has reached its end point or not. */ bool hasReachedEnd() const; /** * Compute the interpolated camera pose at a certain distance along a *linear* * path. Note that the linear path is a special case, to avoid risks of precision - * problems for long paths + * problems for long paths. */ CameraPose linearInterpolatedPose(double distance, double displacement); /** - * Compute the interpolated camera pose at a certain distance along the path + * Compute the interpolated camera pose at a certain distance along the path. */ CameraPose interpolatedPose(double distance) const; /** - * Reset variables used to play back path + * Reset variables used to play back path. */ void resetPlaybackVariables(); @@ -116,49 +116,49 @@ public: private: /** * Interpolate between the paths start and end rotation using the approach that - * corresponds to the path's curve type. The interpolation parameter \p t is the - * same as for the position interpolation, i.e. the relative traveled distance - * along the path, in [0, 1] + * corresponds to the path's curve type. The interpolation parameter \p t is the same + * as for the position interpolation, i.e. the relative traveled distance along the + * path, in [0, 1]. * - * \param t The interpolation parameter, given as the relative traveled distance - along the path, in [0, 1] + * \param t The interpolation parameter, given as the relative traveled distance along + * the path, in [0, 1] */ glm::dquat interpolateRotation(double t) const; /** - * Compute the interpolated rotation quaternion using an eased SLERP approach + * Compute the interpolated rotation quaternion using an eased SLERP approach. * - * \param t The interpolation variable for the rotatation interpolation. - * Should be the relative traveled distance, in [0, 1] + * \param t The interpolation variable for the rotatation interpolation. Should be the + * relative traveled distance, in [0, 1] */ glm::dquat easedSlerpRotation(double t) const; /** - * Compute the interpolated rotation quaternion using a method that is customized - * for linear paths. The camera will first interpoalte to look at the targetted - * node, and keep doing so for most of the path. At the end, when within a certain - * distance from the target, the rotation is interpolated so that the camera ends up - * in the target pose at the end of the path. + * Compute the interpolated rotation quaternion using a method that is customized for + * linear paths. The camera will first interpoalte to look at the targetted node, and + * keep doing so for most of the path. At the end, when within a certain distance from + * the target, the rotation is interpolated so that the camera ends up in the target + * pose at the end of the path. * - * \param t The interpolation variable for the rotatation interpolation. - * Should be the relative traveled distance, in [0, 1] + * \param t The interpolation variable for the rotatation interpolation. Should be the + * relative traveled distance, in [0, 1] */ glm::dquat linearPathRotation(double t) const; /** * Compute the interpolated rotation quaternion using an approach that first - * interpolates to look at the start node, and then the end node, before - * interpolating to the end rotation + * interpolates to look at the start node, and then the end node, before interpolating + * to the end rotation. * - * \param t The interpolation variable for the rotatation interpolation. - * Should be the relative traveled distance, in [0, 1] + * \param t The interpolation variable for the rotatation interpolation. Should be the + * relative traveled distance, in [0, 1] */ glm::dquat lookAtTargetsRotation(double t) const; /** * Evaluate the current traversal speed along the path, based on the currently - * traveled distance. The final speed will be scaled to match the desired duration - * for the path (which might have been specified by the user) + * traveled distance. The final speed will be scaled to match the desired duration for + * the path (which might have been specified by the user). * * \param traveledDistance The current distance traveled along the path, in meters */ @@ -180,13 +180,13 @@ private: }; /** - * Create a path based on an instruction given as a dictionary. (See top of cpp file - * for documentation on keys and values for the dictionary.) - * If /p forceType is specified, that type will primarily be used as the type for the - * created path. Secondly, the type will be read from the dictionary, and lastly it will - * use the default from PathNavigator. + * Create a path based on an instruction given as a dictionary (see top of cpp file + * for documentation on keys and values for the dictionary). If \p forceType is specified, + * that type will primarily be used as the type for the created path. Secondly, the type + * will be read from the dictionary, and lastly it will use the default from + * PathNavigator. * - * \return the created path + * \return The created path */ Path createPathFromDictionary(const ghoul::Dictionary& dictionary, std::optional forceType = std::nullopt); diff --git a/include/openspace/navigation/pathcurve.h b/include/openspace/navigation/pathcurve.h index 7e8e549e71..5aa8deed13 100644 --- a/include/openspace/navigation/pathcurve.h +++ b/include/openspace/navigation/pathcurve.h @@ -46,7 +46,7 @@ public: virtual ~PathCurve() = 0; /** - * Return the length of the curve, in meters + * Return the length of the curve, in meters. */ double length() const; @@ -56,7 +56,7 @@ public: * the full length of the path. * * Can be overridden by subclasses that want more control over the position - * interpolation + * interpolation. */ virtual glm::dvec3 positionAt(double relativeDistance) const; @@ -66,27 +66,26 @@ public: * position. Note that u does not correspond to the relatively traveled distance. * * Can be overridden by subclasses that want more control over the position - * interpolation + * interpolation. */ virtual glm::dvec3 interpolate(double u) const; /** - * Return the positions defining the control points for the spline interpolation + * Return the positions defining the control points for the spline interpolation. */ std::vector points() const; protected: /** - * Precompute information related to the spline parameters that are - * needed for arc length reparameterization. Must be called after - * control point creation. + * Precompute information related to the spline parameters that are needed for arc + * length reparameterization. Must be called after control point creation. */ void initializeParameterData(); /** - * Compute curve parameter u that matches the input arc length s. - * Input s is a length value in meters, in the range [0, _totalLength]. - * The returned curve parameter u is in range [0, 1]. + * Compute curve parameter u that matches the input arc length s. Input s is a length + * value in meters, in the range [0, _totalLength]. The returned curve parameter u is + * in range [0, 1]. */ double curveParameter(double s) const; diff --git a/include/openspace/navigation/pathnavigator.h b/include/openspace/navigation/pathnavigator.h index 97a19ba703..1cd6082035 100644 --- a/include/openspace/navigation/pathnavigator.h +++ b/include/openspace/navigation/pathnavigator.h @@ -81,24 +81,25 @@ public: const std::vector& relevantNodes(); /** - * Find a node close to the given node. Closeness is determined by a factor times - * the bounding sphere of the object - * \return pointer to the SGN if one was found, nullptr otherwise - */ + * Find a node close to the given node. Closeness is determined by a factor times + * the bounding sphere of the object. + * + * \return Pointer to the SGN if one was found, nullptr otherwise + */ static SceneGraphNode* findNodeNearTarget(const SceneGraphNode* node); /** - * \return The Lua library that contains all Lua functions available to affect the - * path navigation - */ + * \return The Lua library that contains all Lua functions available to affect the + * path navigation + */ static scripting::LuaLibrary luaLibrary(); private: void handlePathEnd(); /** - * Populate list of nodes that are relevant for collision checks, etc - */ + * Populate list of nodes that are relevant for collision checks, etc. + */ void findRelevantNodes(); void removeRollRotation(CameraPose& pose, double deltaTime); diff --git a/include/openspace/navigation/waypoint.h b/include/openspace/navigation/waypoint.h index c884adad20..57dca42b10 100644 --- a/include/openspace/navigation/waypoint.h +++ b/include/openspace/navigation/waypoint.h @@ -59,7 +59,7 @@ private: /** * Compute a waypoint from the current camera position. * - * \return the computed WayPoint + * \return The computed WayPoint */ Waypoint waypointFromCamera(); @@ -76,14 +76,14 @@ struct NodeCameraStateSpec { * where the camera will be facing the given node. If there is a 'Sun' node in the scene, * it will possibly be used to compute a position on the lit side of the object. * - * \param spec details about the node and state to create the waypoint from. Minimal - * information is the identifier of the node, but a position or height - * above the bounding sphere may also be given. - * \param startPoint an optional previous waypoint. If not specified, the current camera + * \param spec Details about the node and state to create the waypoint from. Minimal + * information is the identifier of the node, but a position or height above + * the bounding sphere may also be given. + * \param startPoint An optional previous waypoint. If not specified, the current camera * position will be used. - * \param useLinear if true, the new waypoint will be computed along a straight line + * \param useLinear If `true`, the new waypoint will be computed along a straight line * from the start waypoint to the scene graph node or position. - * \return the computed WayPoint + * \return The computed WayPoint */ Waypoint computeWaypointFromNodeInfo(const NodeCameraStateSpec& spec, std::optional startPoint = std::nullopt, bool useLinear = false); diff --git a/include/openspace/network/messagestructures.h b/include/openspace/network/messagestructures.h index 909e7284bd..2e6999523e 100644 --- a/include/openspace/network/messagestructures.h +++ b/include/openspace/network/messagestructures.h @@ -66,7 +66,7 @@ struct CameraKeyframe { double _timestamp = 0.0; - void serialize(std::vector &buffer) const { + void serialize(std::vector& buffer) const { // Add position buffer.insert( buffer.end(), diff --git a/include/openspace/network/messagestructureshelper.h b/include/openspace/network/messagestructureshelper.h index 3c0c2678d2..3133c87923 100644 --- a/include/openspace/network/messagestructureshelper.h +++ b/include/openspace/network/messagestructureshelper.h @@ -30,25 +30,27 @@ namespace openspace::datamessagestructures { /** - * Method that creates a CameraKeyframe object and populates - * it with the current properties of the camera from the navigation handler. - * \returns CameraKeyframe with current state from NavigationHandler + * Method that creates a CameraKeyframe object and populates it with the current + * properties of the camera from the navigation handler. + * + * \return CameraKeyframe with current state from NavigationHandler */ CameraKeyframe generateCameraKeyframe(); /** - * Method that creates a TimeKeyframe object and populates - * it with the current time values from the application time manager. - * \returns TimeKeyframe The time keyframe + * Method that creates a TimeKeyframe object and populates it with the current time values + * from the application time manager. + * + * \return TimeKeyframe The time keyframe */ TimeKeyframe generateTimeKeyframe(); /** - * Method that creates a ScriptMessage object from a given script - * string, and populates the ScriptMessage with the script and timestamp - * of the current application time. + * Method that creates a ScriptMessage object from a given script string, and populates + * the ScriptMessage with the script and timestamp of the current application time. + * * \param script The script to execute in std::string form - * \returns ScriptMessage The ScriptMessage data structure with script + * \return ScriptMessage The ScriptMessage data structure with script */ ScriptMessage generateScriptMessage(std::string script); diff --git a/include/openspace/network/parallelpeer.h b/include/openspace/network/parallelpeer.h index 9a0d3ab599..2e852d2808 100644 --- a/include/openspace/network/parallelpeer.h +++ b/include/openspace/network/parallelpeer.h @@ -66,9 +66,9 @@ public: double latencyStandardDeviation() const; /** - * Returns the Lua library that contains all Lua functions available to affect the - * remote OS parallel connection. - */ + * Returns the Lua library that contains all Lua functions available to affect the + * remote OS parallel connection. + */ static scripting::LuaLibrary luaLibrary(); ParallelConnection::Status status(); int nConnections(); diff --git a/include/openspace/properties/numericalproperty.h b/include/openspace/properties/numericalproperty.h index 2ae25ae160..dc7cc814c1 100644 --- a/include/openspace/properties/numericalproperty.h +++ b/include/openspace/properties/numericalproperty.h @@ -73,9 +73,10 @@ protected: std::string generateAdditionalJsonDescription() const override; /** - * convert a lua formatted value to a JSON formatted value - * @param luaValue - * @return a json formatted string representation of the given lua value + * convert a lua formatted value to a JSON formatted value. + * + * \param luaValue + * \return A JSON formatted string representation of the given Lua value */ std::string luaToJson(std::string luaValue) const; diff --git a/include/openspace/properties/optionproperty.h b/include/openspace/properties/optionproperty.h index 2bb2366324..f115c05608 100644 --- a/include/openspace/properties/optionproperty.h +++ b/include/openspace/properties/optionproperty.h @@ -33,15 +33,15 @@ namespace openspace::properties { /** * The OptionProperty is a property that provides a number of predefined (using the - * addOption method) options consisting of a `description` and a `value`. The available + * #addOption method) options consisting of a `description` and a `value`. The available * options can be queried using the options method. Only values representing valid options - * can be used to set this property, or an error will be logged + * can be used to set this property, or an error will be logged. */ class OptionProperty : public IntProperty { public: /** - * The struct storing a single option consisting of an integer `value` and a - * `string` description. + * The struct storing a single option consisting of an integer `value` and a `string` + * description. */ struct Option { int value; @@ -57,7 +57,8 @@ public: * The constructor delegating the `identifier` and the `guiName` to its super class. * * \param info The PropertyInfo structure that contains all the required static - * information for initializing this Property. + * information for initializing this Property + * * \pre \p info.identifier must not be empty * \pre \p info.guiName must not be empty */ @@ -67,7 +68,7 @@ public: * The constructor delegating the `identifier` and the `guiName` to its super class. * * \param info The PropertyInfo structure that contains all the required static - * information for initializing this Property. + * information for initializing this Property * \param displayType Optional DisplayType for GUI (default RADIO) * * \pre \p info.identifier must not be empty @@ -123,7 +124,7 @@ public: const std::vector