From 68bbfd0b4c321ea83b91c97476ec25b51d21a756 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Fri, 3 Oct 2025 16:49:15 +0200 Subject: [PATCH 01/43] Restore previously square segments in the RenderableSphericalGrids --- modules/base/rendering/grids/renderablesphericalgrid.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/base/rendering/grids/renderablesphericalgrid.cpp b/modules/base/rendering/grids/renderablesphericalgrid.cpp index 87f22292a6..6b78278c5f 100644 --- a/modules/base/rendering/grids/renderablesphericalgrid.cpp +++ b/modules/base/rendering/grids/renderablesphericalgrid.cpp @@ -124,7 +124,7 @@ RenderableSphericalGrid::RenderableSphericalGrid(const ghoul::Dictionary& dictio , _gridProgram(nullptr) , _color(ColorInfo, glm::vec3(0.5f), glm::vec3(0.f), glm::vec3(1.f)) , _longSegments(LongSegmentsInfo, 36, 4, 200) - , _latSegments(LatSegmentsInfo, 36, 4, 200) + , _latSegments(LatSegmentsInfo, 18, 4, 200) , _lineWidth(LineWidthInfo, 0.5f, 1.f, 20.f) { const Parameters p = codegen::bake(dictionary); From 25f021f00960b35b8824b31c33263ba9721bb3e6 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Sat, 4 Oct 2025 10:13:25 +0200 Subject: [PATCH 02/43] Change more prefix to postfix operators --- .../ext/launcher/src/profile/assettreemodel.cpp | 3 ++- apps/OpenSpace/ext/sgct | 2 +- ext/ghoul | 2 +- include/openspace/util/timeline.inl | 6 ++++-- modules/base/rendering/renderablemodel.cpp | 2 +- modules/base/rendering/renderabletrailorbit.cpp | 2 +- modules/exoplanets/exoplanetsmodule_lua.inl | 2 +- .../tasks/exoplanetsdatapreparationtask.cpp | 4 ++-- .../tasks/kameleonvolumetofieldlinestask.cpp | 2 +- .../fieldlinessequence/util/fieldlinesstate.cpp | 2 +- .../util/kameleonfieldlinehelper.cpp | 2 +- modules/gaia/rendering/octreemanager.cpp | 2 +- modules/kameleon/src/kameleonwrapper.cpp | 4 ++-- .../rendering/errorhistogrammanager.cpp | 3 ++- .../rendering/renderableconstellationbounds.cpp | 2 +- modules/space/rendering/renderablefluxnodes.cpp | 2 +- .../rendering/renderableplanetprojection.cpp | 2 +- modules/sync/syncs/httpsynchronization.cpp | 2 +- modules/touch/src/touchinteraction.cpp | 5 +++-- modules/volume/envelope.cpp | 4 ++-- modules/webbrowser/src/eventhandler.cpp | 2 +- src/rendering/dashboard.cpp | 2 +- src/rendering/helper.cpp | 2 +- src/rendering/loadingscreen.cpp | 8 ++++---- src/rendering/renderengine.cpp | 4 ++-- src/util/dynamicfilesequencedownloader.cpp | 4 ++-- src/util/ellipsoid.cpp | 2 +- src/util/histogram.cpp | 4 ++-- src/util/sphere.cpp | 14 +++++++------- 29 files changed, 51 insertions(+), 46 deletions(-) diff --git a/apps/OpenSpace/ext/launcher/src/profile/assettreemodel.cpp b/apps/OpenSpace/ext/launcher/src/profile/assettreemodel.cpp index bb250d98d1..f025897a14 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/assettreemodel.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/assettreemodel.cpp @@ -85,7 +85,8 @@ namespace { const int levelChange = elem.level - level; if (levelChange == 0) { - parent->insertChildren(++nChildInsert, 1, 3); + nChildInsert++; + parent->insertChildren(nChildInsert, 1, 3); parent->child(nChildInsert)->setData( 0, QString::fromStdString(elem.line) diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index 4e1b1fdab9..98be6301fb 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit 4e1b1fdab9adadb224fbfb24e0ce7fb551560d1f +Subproject commit 98be6301fb8884f4c3906c52e67d2786593f6da6 diff --git a/ext/ghoul b/ext/ghoul index 4ff211d7aa..77eb9907af 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit 4ff211d7aad2907f957081181586ecdec7c3bc7e +Subproject commit 77eb9907af7885d7535564f1da49931271fb9965 diff --git a/include/openspace/util/timeline.inl b/include/openspace/util/timeline.inl index c4663e8dfb..41fcd558a5 100644 --- a/include/openspace/util/timeline.inl +++ b/include/openspace/util/timeline.inl @@ -32,7 +32,8 @@ Keyframe::Keyframe(size_t i, double t, T d) template void Timeline::addKeyframe(double timestamp, T&& data) { - Keyframe keyframe(++_nextKeyframeId, timestamp, std::move(data)); + _nextKeyframeId++; + Keyframe keyframe(_nextKeyframeId, timestamp, std::move(data)); const auto iter = std::upper_bound( _keyframes.cbegin(), _keyframes.cend(), @@ -44,7 +45,8 @@ void Timeline::addKeyframe(double timestamp, T&& data) { template void Timeline::addKeyframe(double timestamp, const T& data) { - Keyframe keyframe(++_nextKeyframeId, timestamp, data); + _nextKeyframeId++; + Keyframe keyframe(_nextKeyframeId, timestamp, data); const auto iter = std::upper_bound( _keyframes.cbegin(), _keyframes.cend(), diff --git a/modules/base/rendering/renderablemodel.cpp b/modules/base/rendering/renderablemodel.cpp index bf68e9ab1a..d7a9e281e1 100644 --- a/modules/base/rendering/renderablemodel.cpp +++ b/modules/base/rendering/renderablemodel.cpp @@ -769,7 +769,7 @@ void RenderableModel::render(const RenderData& data, RendererTasks&) { _lightDirectionsViewSpaceBuffer[nLightSources] = lightSource->directionViewSpace(data); - ++nLightSources; + nLightSources++; } if (_uniformCache.performShading != -1) { diff --git a/modules/base/rendering/renderabletrailorbit.cpp b/modules/base/rendering/renderabletrailorbit.cpp index 87f7e77aff..f4cb5c151f 100644 --- a/modules/base/rendering/renderabletrailorbit.cpp +++ b/modules/base/rendering/renderabletrailorbit.cpp @@ -408,7 +408,7 @@ RenderableTrailOrbit::UpdateReport RenderableTrailOrbit::updateTrails( else { // Move the current pointer fowards one step to be used as the new // floating - ++_primaryRenderInformation.first; + _primaryRenderInformation.first++; } } diff --git a/modules/exoplanets/exoplanetsmodule_lua.inl b/modules/exoplanets/exoplanetsmodule_lua.inl index ddfd048314..587cfcfe99 100644 --- a/modules/exoplanets/exoplanetsmodule_lua.inl +++ b/modules/exoplanets/exoplanetsmodule_lua.inl @@ -130,7 +130,7 @@ std::vector hostStarsWithSufficientData() { // Read number of lines int nExoplanets = 0; while (ghoul::getline(lookupTableFile, line)) { - ++nExoplanets; + nExoplanets++; } lookupTableFile.clear(); lookupTableFile.seekg(0); diff --git a/modules/exoplanets/tasks/exoplanetsdatapreparationtask.cpp b/modules/exoplanets/tasks/exoplanetsdatapreparationtask.cpp index 89790c50f4..cd07d51cac 100644 --- a/modules/exoplanets/tasks/exoplanetsdatapreparationtask.cpp +++ b/modules/exoplanets/tasks/exoplanetsdatapreparationtask.cpp @@ -148,7 +148,7 @@ void ExoplanetsDataPreparationTask::perform( int total = 0; std::string row; while (ghoul::getline(inputDataFile, row)) { - ++total; + total++; } inputDataFile.clear(); inputDataFile.seekg(0); @@ -161,7 +161,7 @@ void ExoplanetsDataPreparationTask::perform( int exoplanetCount = 0; while (ghoul::getline(inputDataFile, row)) { - ++exoplanetCount; + exoplanetCount++; progressCallback(static_cast(exoplanetCount) / static_cast(total)); PlanetData planetData = parseDataRow( diff --git a/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.cpp b/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.cpp index e40a6aa34b..64d2d1efda 100644 --- a/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.cpp +++ b/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.cpp @@ -193,7 +193,7 @@ void KameleonVolumeToFieldlinesTask::perform( throw ghoul::MissingCaseException(); } } - ++fileNumber; + fileNumber++; } // Ideally, we would want to signal about progress earlier as well, but diff --git a/modules/fieldlinessequence/util/fieldlinesstate.cpp b/modules/fieldlinessequence/util/fieldlinesstate.cpp index 8bbd3562d2..ce7ac509b1 100644 --- a/modules/fieldlinessequence/util/fieldlinesstate.cpp +++ b/modules/fieldlinessequence/util/fieldlinesstate.cpp @@ -371,7 +371,7 @@ void FieldlinesState::saveStateToJson(const std::string& absPath) { size_t pointIndex = 0; for (size_t lineIndex = 0; lineIndex < nLines; lineIndex++) { json jData = json::array(); - for (GLsizei i = 0; i < _lineCount[lineIndex]; i++, ++pointIndex) { + for (GLsizei i = 0; i < _lineCount[lineIndex]; i++, pointIndex++) { const glm::vec3 pos = _vertexPositions[pointIndex]; json jDataElement = { pos.x, pos.y, pos.z }; diff --git a/modules/fieldlinessequence/util/kameleonfieldlinehelper.cpp b/modules/fieldlinessequence/util/kameleonfieldlinehelper.cpp index d592231b4a..1597adf846 100644 --- a/modules/fieldlinessequence/util/kameleonfieldlinehelper.cpp +++ b/modules/fieldlinessequence/util/kameleonfieldlinehelper.cpp @@ -176,7 +176,7 @@ extractSeedPointsFromFiles(std::filesystem::path path, size_t nth) outVec.push_back(std::move(point)); } } - ++linenumber; + linenumber++; } if (outVec.empty()) { diff --git a/modules/gaia/rendering/octreemanager.cpp b/modules/gaia/rendering/octreemanager.cpp index 40714528e8..eab557afaa 100644 --- a/modules/gaia/rendering/octreemanager.cpp +++ b/modules/gaia/rendering/octreemanager.cpp @@ -1022,7 +1022,7 @@ bool OctreeManager::insertInNode(OctreeNode& node, const std::vector& sta storeStarData(node, starValues); } - return insertInNode(*node.children[index], starValues, ++depth); + return insertInNode(*node.children[index], starValues, depth + 1); } void OctreeManager::sliceNodeLodCache(OctreeNode& node) { diff --git a/modules/kameleon/src/kameleonwrapper.cpp b/modules/kameleon/src/kameleonwrapper.cpp index 08c0d3046f..06c8766ce9 100644 --- a/modules/kameleon/src/kameleonwrapper.cpp +++ b/modules/kameleon/src/kameleonwrapper.cpp @@ -837,7 +837,7 @@ KameleonWrapper::TraceLine KameleonWrapper::traceCartesianFieldline( pos = pos + (step / 6.f) * (k1 + 2.f * k2 + 2.f * k3 + k4); - ++numSteps; + numSteps++; if (numSteps > MaxSteps) { LDEBUG(std::format("Max number of steps taken ({})", MaxSteps)); break; @@ -951,7 +951,7 @@ KameleonWrapper::TraceLine KameleonWrapper::traceLorentzTrajectory( v0 = v0 + step / 6.f * (k1 + 2.f * k2 + 2.f * k3 + k4); - ++numSteps; + numSteps++; if (numSteps > MaxSteps) { LDEBUG(std::format("Max number of steps taken ({})", MaxSteps)); break; diff --git a/modules/multiresvolume/rendering/errorhistogrammanager.cpp b/modules/multiresvolume/rendering/errorhistogrammanager.cpp index 2017365154..9e24526862 100644 --- a/modules/multiresvolume/rendering/errorhistogrammanager.cpp +++ b/modules/multiresvolume/rendering/errorhistogrammanager.cpp @@ -73,7 +73,8 @@ bool ErrorHistogramManager::buildHistograms(int numBins) { if (!success) { return false; } - pb.print(++processedLeaves); + processedLeaves++; + pb.print(processedLeaves); } } diff --git a/modules/space/rendering/renderableconstellationbounds.cpp b/modules/space/rendering/renderableconstellationbounds.cpp index 0ddd6127ac..39e9e70989 100644 --- a/modules/space/rendering/renderableconstellationbounds.cpp +++ b/modules/space/rendering/renderableconstellationbounds.cpp @@ -340,7 +340,7 @@ bool RenderableConstellationBounds::loadVertexFile() { static_cast(rectangularValues[1]), static_cast(rectangularValues[2]) }); - ++currentLineNumber; + currentLineNumber++; } // Due to the way we read the file, the first (empty) constellation bounds will not diff --git a/modules/space/rendering/renderablefluxnodes.cpp b/modules/space/rendering/renderablefluxnodes.cpp index 39a8f76ee0..41f4786874 100644 --- a/modules/space/rendering/renderablefluxnodes.cpp +++ b/modules/space/rendering/renderablefluxnodes.cpp @@ -624,7 +624,7 @@ void RenderableFluxNodes::populateStartTimes() { std::string columnName; // loops through the names/columns in first line/header while (s >> columnName) { - ++nColumns; + nColumns++; } while (ghoul::getline(tfs, line)) { // for each line of data std::istringstream iss(line); diff --git a/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp b/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp index 36129791a5..77b288fa28 100644 --- a/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp +++ b/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp @@ -478,7 +478,7 @@ void RenderablePlanetProjection::render(const RenderData& data, RendererTasks&) const std::shared_ptr t = _projectionComponent.loadProjectionTexture(img.path); imageProjectGPU(*t, projMatrix); - ++nProjections; + nProjections++; } catch (const SpiceManager::SpiceException& e) { LERRORC(e.component, e.what()); diff --git a/modules/sync/syncs/httpsynchronization.cpp b/modules/sync/syncs/httpsynchronization.cpp index 054f937466..14490592a1 100644 --- a/modules/sync/syncs/httpsynchronization.cpp +++ b/modules/sync/syncs/httpsynchronization.cpp @@ -362,7 +362,7 @@ HttpSynchronization::trySyncFromUrl(std::string url) { break; } else { - ++downloadTry; + downloadTry++; std::this_thread::sleep_for(std::chrono::seconds(1)); } } diff --git a/modules/touch/src/touchinteraction.cpp b/modules/touch/src/touchinteraction.cpp index 1d000607cf..9b41d364ea 100644 --- a/modules/touch/src/touchinteraction.cpp +++ b/modules/touch/src/touchinteraction.cpp @@ -1081,8 +1081,9 @@ void TouchInteraction::step(double dt, bool directTouch) { global::navigationHandler->orbitalNavigator().updateOnCameraInteraction(); #ifdef TOUCH_DEBUG_PROPERTIES - //Show velocity status every N frames - if (++stepVelUpdate >= 60) { + // Show velocity status every N frames + stepVelUpdate++; + if (stepVelUpdate >= 60) { stepVelUpdate = 0; LINFO(std::format( "DistToFocusNode {} stepZoomVelUpdate {}", diff --git a/modules/volume/envelope.cpp b/modules/volume/envelope.cpp index 8126f51490..247f59f68b 100644 --- a/modules/volume/envelope.cpp +++ b/modules/volume/envelope.cpp @@ -85,7 +85,7 @@ bool Envelope::isValueInEnvelope(float pos) const { bool Envelope::isEnvelopeValid() const { for (auto currentIter = _points.begin(), nextIter = currentIter + 1; nextIter != _points.end(); - ++currentIter, ++nextIter) + currentIter++, nextIter++) { if (currentIter->position.first > nextIter->position.first) { return false; @@ -104,7 +104,7 @@ glm::vec4 Envelope::valueAtPosition(float pos) const { if (afterIter == _points.end()) { return glm::vec4(0.f, 0.f, 0.f ,0.f); } - ++afterIter; + afterIter++; } if (afterIter->position.first == pos) { return glm::vec4(afterIter->color, afterIter->position.second); diff --git a/modules/webbrowser/src/eventhandler.cpp b/modules/webbrowser/src/eventhandler.cpp index 106e931f24..b92e7934c8 100644 --- a/modules/webbrowser/src/eventhandler.cpp +++ b/modules/webbrowser/src/eventhandler.cpp @@ -365,7 +365,7 @@ bool EventHandler::mouseButtonCallback(MouseButton button, MouseAction action, } else { if (isDoubleClick(state)) { - ++clickCount; + clickCount++; } else { state.lastClickTime = std::chrono::high_resolution_clock::now(); diff --git a/src/rendering/dashboard.cpp b/src/rendering/dashboard.cpp index b75bca2218..2b8afbcad8 100644 --- a/src/rendering/dashboard.cpp +++ b/src/rendering/dashboard.cpp @@ -98,7 +98,7 @@ void Dashboard::addDashboardItem(std::unique_ptr item) { else { item->setIdentifier(originalIdentifier + std::to_string(suffix)); item->setGuiName(originalIdentifier + " " + std::to_string(suffix)); - ++suffix; + suffix++; } } diff --git a/src/rendering/helper.cpp b/src/rendering/helper.cpp index 7c11759b27..08c723f8dd 100644 --- a/src/rendering/helper.cpp +++ b/src/rendering/helper.cpp @@ -880,7 +880,7 @@ void LightSourceRenderData::updateBasedOnLightSources(const RenderData& renderDa directionsViewSpaceBuffer[nEnabledLightSources] = lightSource->directionViewSpace(renderData); - ++nEnabledLightSources; + nEnabledLightSources++; } nLightSources = nEnabledLightSources; } diff --git a/src/rendering/loadingscreen.cpp b/src/rendering/loadingscreen.cpp index 68ea097572..3e5429c487 100644 --- a/src/rendering/loadingscreen.cpp +++ b/src/rendering/loadingscreen.cpp @@ -609,10 +609,10 @@ void LoadingScreen::renderLogMessages() const { if (charactersSinceNewLine > MessageLength) { result << '\n'; charactersSinceNewLine = static_cast(word.size()); - ++nRows; + nRows++; } result << word << ' '; - ++charactersSinceNewLine; + charactersSinceNewLine++; } } @@ -625,7 +625,7 @@ void LoadingScreen::renderLogMessages() const { it.message.size() < MessageLength ? it.message : result.str(), ghoul::toColor(it.level) ); - ++nRows; + nRows++; } const glm::vec2 dpiScaling = global::windowDelegate->dpiScaling(); @@ -650,7 +650,7 @@ void LoadingScreen::renderLogMessages() const { text, ghoul::toColor(level) ); - ++row; + row++; } } diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index cc947c6138..2cc65418a6 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -914,7 +914,7 @@ float RenderEngine::combinedBlackoutFactor() const { void RenderEngine::postDraw() { ZoneScoped; - ++_frameNumber; + _frameNumber++; } Scene* RenderEngine::scene() { @@ -1417,7 +1417,7 @@ void RenderEngine::renderScreenLog() { message, white ); - ++nRows; + nRows++; } } diff --git a/src/util/dynamicfilesequencedownloader.cpp b/src/util/dynamicfilesequencedownloader.cpp index 357728ce7c..ef28914783 100644 --- a/src/util/dynamicfilesequencedownloader.cpp +++ b/src/util/dynamicfilesequencedownloader.cpp @@ -338,7 +338,7 @@ void DynamicFileSequenceDownloader::requestAvailableFiles(std::string httpDataRe fileElement.state = File::State::Available; } _availableData.push_back(std::move(fileElement)); - ++index; + index++; } const double cadence = calculateCadence(); @@ -446,7 +446,7 @@ void DynamicFileSequenceDownloader::checkForFinishedDownloads() { } // The file is not finished downloading, move on to next else { - ++currentIt; + currentIt++; } // Since in the if statement one is removed and else statement it got incremented, diff --git a/src/util/ellipsoid.cpp b/src/util/ellipsoid.cpp index f1a973fc33..fa0cd9676c 100644 --- a/src/util/ellipsoid.cpp +++ b/src/util/ellipsoid.cpp @@ -83,7 +83,7 @@ glm::dvec3 Ellipsoid::geodeticSurfaceProjection(const glm::dvec3& p) const { s = glm::dot(p2 / (_cached.radiiSquared * d2), glm::dvec3(1.0)) - 1.0; dSdA = -2.0 * glm::dot(p2 / (_cached.radiiToTheFourth * d3), glm::dvec3(1.0)); - ++nIterations; + nIterations++; } while (std::abs(s) > Epsilon && nIterations < MaxIterations); diff --git a/src/util/histogram.cpp b/src/util/histogram.cpp index 3628934076..ec21445525 100644 --- a/src/util/histogram.cpp +++ b/src/util/histogram.cpp @@ -316,7 +316,7 @@ float Histogram::highestBinValue(bool equalized, int overBins) { } value += _data[i]; - value /= static_cast(++num); + value /= static_cast(num + 1); if (value > highestValue) { highestBin = i; @@ -329,7 +329,7 @@ float Histogram::highestBinValue(bool equalized, int overBins) { const float low = _minValue + static_cast(highestBin) / _numBins * (_maxValue - _minValue); const float high = low + (_maxValue - _minValue) / static_cast(_numBins); - return (high+low) / 2.f; + return (high + low) / 2.f; } else { return highestBin / static_cast(_numBins); diff --git a/src/util/sphere.cpp b/src/util/sphere.cpp index 457bf9b7d6..94b5c588a4 100644 --- a/src/util/sphere.cpp +++ b/src/util/sphere.cpp @@ -85,7 +85,7 @@ Sphere::Sphere(glm::vec3 radius, int segments) _varray[nr].tex[0] = t1; _varray[nr].tex[1] = t2; - ++nr; + nr++; } } @@ -95,18 +95,18 @@ Sphere::Sphere(glm::vec3 radius, int segments) for (int j = 0; j < segments; j++) { const int t = segments + 1; _iarray[nr] = t * (i - 1) + j + 0; //1 - ++nr; + nr++; _iarray[nr] = t * (i + 0) + j + 0; //2 - ++nr; + nr++; _iarray[nr] = t * (i + 0) + j + 1; //3 - ++nr; + nr++; _iarray[nr] = t * (i - 1) + j + 0; //4 - ++nr; + nr++; _iarray[nr] = t * (i + 0) + j + 1; //5 - ++nr; + nr++; _iarray[nr] = t * (i - 1) + j + 1; //6 - ++nr; + nr++; } } } From 612d5f738ecbfd8a2701107c40a1485ece7a0a0e Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 6 Oct 2025 09:53:34 +0200 Subject: [PATCH 03/43] Fix crash when deinitializing ScreenSpaceRenderableRenderable --- src/rendering/screenspacerenderableframebuffer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/screenspacerenderableframebuffer.cpp b/src/rendering/screenspacerenderableframebuffer.cpp index fb530835a8..b08248f6b4 100644 --- a/src/rendering/screenspacerenderableframebuffer.cpp +++ b/src/rendering/screenspacerenderableframebuffer.cpp @@ -91,7 +91,7 @@ void ScreenSpaceRenderableFramebuffer::deinitializeGL() { ghoul::opengl::FramebufferObject::deactivate(); removeAllRenderFunctions(); - ScreenSpaceRenderableFramebuffer::deinitializeGL(); + ScreenSpaceRenderable::deinitializeGL(); } void ScreenSpaceRenderableFramebuffer::render(const RenderData& renderData) { From 860189d3d816c31cf32acc3c8d507fd147ea1f3f Mon Sep 17 00:00:00 2001 From: benpm Date: Wed, 8 Oct 2025 13:35:06 -0600 Subject: [PATCH 04/43] bump ghoul ver to prepare for merge in feature/shadows; specifically, it fixes linux build issues and adds the draco compresion lib to the assimp dependency, allowing the loading .glb compressed models --- ext/ghoul | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/ghoul b/ext/ghoul index 77eb9907af..04688d7568 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit 77eb9907af7885d7535564f1da49931271fb9965 +Subproject commit 04688d75685afec8a9a4f32362785a4828b70d90 From b6610a6c13953346edad765f6f3f07dbee1d0c68 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 9 Oct 2025 20:01:20 +0200 Subject: [PATCH 05/43] Restore Pluto barycentric trail --- .../dwarf_planets/pluto/system.asset | 1 + .../pluto/trail_barycentric.asset | 48 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 data/assets/scene/solarsystem/dwarf_planets/pluto/trail_barycentric.asset diff --git a/data/assets/scene/solarsystem/dwarf_planets/pluto/system.asset b/data/assets/scene/solarsystem/dwarf_planets/pluto/system.asset index 19dfbfe927..8f31e21733 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/system.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/system.asset @@ -1,4 +1,5 @@ asset.require("./trail") +asset.require("./trail_barycentric") asset.require("./pluto") asset.require("./charon/charon") asset.require("./charon/charon_trail") diff --git a/data/assets/scene/solarsystem/dwarf_planets/pluto/trail_barycentric.asset b/data/assets/scene/solarsystem/dwarf_planets/pluto/trail_barycentric.asset new file mode 100644 index 0000000000..9fdc396bd0 --- /dev/null +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/trail_barycentric.asset @@ -0,0 +1,48 @@ +local transforms = asset.require("./transforms") +local coreKernels = asset.require("spice/core") + + + +local PlutoTrailBarycentric = { + Identifier = "PlutoBarycentricTrail", + Parent = transforms.PlutoBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailOrbit", + Translation = { + Type = "SpiceTranslation", + Target = coreKernels.ID.Pluto, + Observer = coreKernels.ID.PlutoBarycenter + }, + Color = { 0.00, 0.62, 1.00 }, + Period = 6.38723, + Resolution = 1000 + }, + Tag = { "planetTrail_dwarf" }, + GUI = { + Name = "Pluto Barycentric Trail", + Path = "/Solar System/Dwarf Planets/Pluto", + Focusable = false, + Description = "Orbit of Pluto around its Barycenter" + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(PlutoTrailBarycentric) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(PlutoTrailBarycentric) +end) + +asset.export(PlutoTrailBarycentric) + + + +asset.meta = { + Name = "Pluto Barycentric Trail", + Description = "Trail of Pluto as observed by its Barycenter", + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} From 11900a51553e1068ace7aa3303209c202ce900ea Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Fri, 10 Oct 2025 09:15:31 +0200 Subject: [PATCH 06/43] Add scale factors to night sky saturn --- data/assets/nightsky/planets.asset | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/assets/nightsky/planets.asset b/data/assets/nightsky/planets.asset index ebca415882..d9e22e3a15 100644 --- a/data/assets/nightsky/planets.asset +++ b/data/assets/nightsky/planets.asset @@ -164,6 +164,8 @@ local Saturn = { File = textures .. "glare.png" }, SizeSettings = { + ScaleFactor = 10, + ScaleExponent = 15, MaxSize = 0.332, EnableMaxSizeControl = true }, From 48fe4f143d0e07c85b9de9df45518962d578d3bb Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Fri, 10 Oct 2025 15:28:37 +0200 Subject: [PATCH 07/43] Update titles ti distinguish between ScreenSpaceText examples --- .../screenspacerenderable/screenspacetext/text_font.asset | 2 +- .../screenspacerenderable/screenspacetext/text_fontsize.asset | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/assets/examples/screenspacerenderable/screenspacetext/text_font.asset b/data/assets/examples/screenspacerenderable/screenspacetext/text_font.asset index 63cc28e035..96fd48dbd6 100644 --- a/data/assets/examples/screenspacerenderable/screenspacetext/text_font.asset +++ b/data/assets/examples/screenspacerenderable/screenspacetext/text_font.asset @@ -1,4 +1,4 @@ --- Basic +-- Changing Font -- This example creates a screen space renderable that displays a static text with a -- non-standard font. This is using one of the fonts that is loaded by default in the -- openspace.cfg file. diff --git a/data/assets/examples/screenspacerenderable/screenspacetext/text_fontsize.asset b/data/assets/examples/screenspacerenderable/screenspacetext/text_fontsize.asset index 662801c96f..21f32a73f3 100644 --- a/data/assets/examples/screenspacerenderable/screenspacetext/text_fontsize.asset +++ b/data/assets/examples/screenspacerenderable/screenspacetext/text_fontsize.asset @@ -1,4 +1,4 @@ --- Basic +-- Font Size -- This example creates a screen space renderable that displays a static text with a -- larger font. The FontSize parameter is increased to improve the fidelity of the text -- being rendered. The Scale parameter will make the text show up larger on the screen. From 57f2705157465ef8c2c8f7e10bacc93c549f9594 Mon Sep 17 00:00:00 2001 From: Adam Rohdin Date: Tue, 14 Oct 2025 16:46:52 +0200 Subject: [PATCH 08/43] feature/multithreaded-asteroids (#3799) - Added multithreading and a better system for updating which segments to render for each orbit - Less work is being done while time is paused - Added multithreading for loading of data - Added support for "Camera View Direction" in addition to existing "Camera Position Normal" --- .../rendering/renderableorbitalkepler.cpp | 514 ++++++++++++------ .../space/rendering/renderableorbitalkepler.h | 54 +- modules/space/shaders/keplerpoints_gs.glsl | 33 +- modules/space/shaders/keplerpoints_vs.glsl | 11 +- modules/space/shaders/keplertrails_fs.glsl | 2 +- modules/space/shaders/keplertrails_vs.glsl | 11 +- .../space/translation/keplertranslation.cpp | 96 +++- modules/space/translation/keplertranslation.h | 30 +- 8 files changed, 509 insertions(+), 242 deletions(-) diff --git a/modules/space/rendering/renderableorbitalkepler.cpp b/modules/space/rendering/renderableorbitalkepler.cpp index 1e5ad024d1..31a7bf9578 100644 --- a/modules/space/rendering/renderableorbitalkepler.cpp +++ b/modules/space/rendering/renderableorbitalkepler.cpp @@ -40,18 +40,24 @@ #include #include #include +#include #include #include #include namespace { // The possible values for the _renderingModes property - enum RenderingMode { + enum class RenderMode { RenderingModeTrail = 0, RenderingModePoint, RenderingModePointTrail }; + enum class PointRenderingMode { + ViewDirection = 0, + PositionNormal + }; + constexpr openspace::properties::Property::PropertyInfo PathInfo = { "Path", "Path", @@ -59,6 +65,17 @@ namespace { openspace::properties::Property::Visibility::AdvancedUser }; + constexpr openspace::properties::Property::PropertyInfo PointRenderingModeInfo = { + "PointRenderingMode", + "Point Rendering Mode", + "Controls how the points will be oriented. \"Camera View Direction\" rotates the " + "points so that they are orthogonal to the viewing direction of the camera " + "(useful for planar displays), and \"Camera Position Normal\" rotates the points " + "towards the position of the camera (useful for spherical displays, like dome " + "theaters).", + openspace::properties::Property::Visibility::AdvancedUser + }; + constexpr openspace::properties::Property::PropertyInfo SegmentQualityInfo = { "SegmentQuality", "Segment quality", @@ -193,6 +210,13 @@ namespace { // The file format that is contained in the file. Format format; + enum class [[codegen::map(PointRenderingMode)]] PointRenderingMode { + ViewDirection [[codegen::key("Camera View Direction")]], + PositionNormal [[codegen::key("Camera Position Normal")]] + }; + // [[codegen::verbatim(PointRenderingModeInfo.description)]] + std::optional pointRenderingMode; + // [[codegen::verbatim(SegmentQualityInfo.description)]] int segmentQuality; @@ -261,22 +285,24 @@ RenderableOrbitalKepler::Appearance::Appearance() , enableMaxSize(EnableMaxSizeInfo, true) , maxSize(MaxSizeInfo, 5.f, 0.f, 45.f) , renderingModes(RenderingModeInfo) + , pointRenderOption(PointRenderingModeInfo) , trailFade(TrailFadeInfo, 20.f, 0.f, 30.f) , enableOutline(EnableOutlineInfo, true) , outlineColor(OutlineColorInfo, glm::vec3(0.f), glm::vec3(0.f), glm::vec3(1.f)) , outlineWidth(OutlineWidthInfo, 0.2f, 0.f, 1.f) { renderingModes.addOptions({ - { RenderingModeTrail, "Trails" }, - { RenderingModePoint, "Points" }, - { RenderingModePointTrail , "Points and Trails" } + { static_cast(RenderMode::RenderingModeTrail), "Trails" }, + { static_cast(RenderMode::RenderingModePoint), "Points"}, + { static_cast(RenderMode::RenderingModePointTrail) , "Points and Trails" } }); + renderingModes.onChange([this]() { isRenderTypeDirty = true; }); addProperty(renderingModes); - color.setViewOption(properties::Property::ViewOptions::Color); addProperty(color); addProperty(trailWidth); addProperty(trailFade); + addProperty(pointRenderOption); addProperty(pointSizeExponent); addProperty(enableMaxSize); addProperty(maxSize); @@ -288,6 +314,7 @@ RenderableOrbitalKepler::Appearance::Appearance() RenderableOrbitalKepler::RenderableOrbitalKepler(const ghoul::Dictionary& dict) : Renderable(dict) + , _nThreads(std::max(1u, std::thread::hardware_concurrency() / 2u)) , _segmentQuality(SegmentQualityInfo, 2, 1, 10) , _startRenderIdx(StartRenderIdxInfo, 0, 0, 1) , _sizeRender(RenderSizeInfo, 1, 1, 2) @@ -299,11 +326,12 @@ RenderableOrbitalKepler::RenderableOrbitalKepler(const ghoul::Dictionary& dict) addProperty(Fadeable::_opacity); _segmentQuality = static_cast(p.segmentQuality); - _segmentQuality.onChange([this]() { updateBuffers(); }); + _segmentQuality.onChange([this]() { _updateDataBuffersAtNextRender = true; }); addProperty(_segmentQuality); _appearance.color = p.color; _appearance.trailFade = p.trailFade.value_or(_appearance.trailFade); + _appearance.trailFade.onChange([this]() { _forceUpdate = true; }); _appearance.trailWidth = p.trailWidth.value_or(_appearance.trailWidth); _appearance.enableMaxSize = p.enableMaxSize.value_or(_appearance.enableMaxSize); _appearance.maxSize = p.maxSize.value_or(_appearance.maxSize); @@ -313,21 +341,49 @@ RenderableOrbitalKepler::RenderableOrbitalKepler(const ghoul::Dictionary& dict) _appearance.pointSizeExponent = p.pointSizeExponent.value_or(_appearance.pointSizeExponent); - if (p.renderingMode.has_value()) { - switch (*p.renderingMode) { - case Parameters::RenderingMode::Trail: - _appearance.renderingModes = RenderingModeTrail; + _appearance.pointRenderOption.addOption( + static_cast(PointRenderingMode::ViewDirection), + "Camera View Direction" + ); + _appearance.pointRenderOption.addOption( + static_cast(PointRenderingMode::PositionNormal), + "Camera Position Normal" + ); + if (p.pointRenderingMode.has_value()) { + switch (*p.pointRenderingMode) { + case Parameters::PointRenderingMode::ViewDirection: + _appearance.pointRenderOption = + static_cast(PointRenderingMode::ViewDirection); break; - case Parameters::RenderingMode::Point: - _appearance.renderingModes = RenderingModePoint; - break; - case Parameters::RenderingMode::PointsTrails: - _appearance.renderingModes = RenderingModePointTrail; + case Parameters::PointRenderingMode::PositionNormal: + _appearance.pointRenderOption = + static_cast(PointRenderingMode::PositionNormal); break; } } else { - _appearance.renderingModes = RenderingModeTrail; + _appearance.pointRenderOption = + static_cast(PointRenderingMode::ViewDirection); + } + + if (p.renderingMode.has_value()) { + switch (*p.renderingMode) { + case Parameters::RenderingMode::Trail: + _appearance.renderingModes = + static_cast(RenderMode::RenderingModeTrail); + break; + case Parameters::RenderingMode::Point: + _appearance.renderingModes = + static_cast(RenderMode::RenderingModePoint); + break; + case Parameters::RenderingMode::PointsTrails: + _appearance.renderingModes = + static_cast(RenderMode::RenderingModePointTrail); + break; + } + } + else { + _appearance.renderingModes = static_cast(RenderMode::RenderingModeTrail); } addPropertySubOwner(_appearance); @@ -336,8 +392,8 @@ RenderableOrbitalKepler::RenderableOrbitalKepler(const ghoul::Dictionary& dict) _startRenderIdx = p.startRenderIdx.value_or(0); _startRenderIdx.onChange([this]() { if (_contiguousMode) { - if ((_numObjects - _startRenderIdx) < _sizeRender) { - _sizeRender = static_cast(_numObjects - _startRenderIdx); + if ((_nOrbits - _startRenderIdx) < _sizeRender) { + _sizeRender = static_cast(_nOrbits - _startRenderIdx); } _updateDataBuffersAtNextRender = true; } @@ -347,8 +403,8 @@ RenderableOrbitalKepler::RenderableOrbitalKepler(const ghoul::Dictionary& dict) _sizeRender = p.renderSize.value_or(0u); _sizeRender.onChange([this]() { if (_contiguousMode) { - if (_sizeRender > (_numObjects - _startRenderIdx)) { - _startRenderIdx = static_cast(_numObjects - _sizeRender); + if (_sizeRender > (_nOrbits - _startRenderIdx)) { + _startRenderIdx = static_cast(_nOrbits - _sizeRender); } } _updateDataBuffersAtNextRender = true; @@ -360,7 +416,7 @@ RenderableOrbitalKepler::RenderableOrbitalKepler(const ghoul::Dictionary& dict) addProperty(_contiguousMode); _path = p.path.string(); - _path.onChange([this]() { updateBuffers(); }); + _path.onChange([this]() { _updateDataBuffersAtNextRender = true; }); addProperty(_path); } @@ -398,7 +454,7 @@ void RenderableOrbitalKepler::initializeGL() { ghoul::opengl::updateUniformLocations(*_trailProgram, _uniformTrailCache); ghoul::opengl::updateUniformLocations(*_pointProgram, _uniformPointCache); - updateBuffers(); + _updateDataBuffersAtNextRender = true; } void RenderableOrbitalKepler::deinitializeGL() { @@ -427,11 +483,32 @@ bool RenderableOrbitalKepler::isReady() const { return _pointProgram != nullptr && _trailProgram != nullptr; } -void RenderableOrbitalKepler::update(const UpdateData&) { +void RenderableOrbitalKepler::update(const UpdateData& data) { if (_updateDataBuffersAtNextRender) { - _updateDataBuffersAtNextRender = false; updateBuffers(); + _forceUpdate = true; } + + if (_appearance.isRenderTypeDirty) { + _forceUpdate = true; + } + + bool isPaused = data.time.j2000Seconds() == data.previousFrameTime.j2000Seconds(); + if (!isPaused || _forceUpdate) { + std::for_each( + std::execution::par_unseq, + _threadIds.begin(), + _threadIds.end(), + [&](int threadId) { + threadedSegmentCalculations(threadId, data); + } + ); + } + + _lineDrawCount = static_cast(_segmentsPerOrbit.size() * 2); + _updateDataBuffersAtNextRender = false; + _appearance.isRenderTypeDirty = false; + _forceUpdate = false; } void RenderableOrbitalKepler::render(const RenderData& data, RendererTasks&) { @@ -439,18 +516,21 @@ void RenderableOrbitalKepler::render(const RenderData& data, RendererTasks&) { return; } - const int selection = _appearance.renderingModes; - const bool renderPoints = ( - selection == RenderingModePoint || - selection == RenderingModePointTrail - ); - const bool renderTrails = ( - selection == RenderingModeTrail || - selection == RenderingModePointTrail - ); - - if (renderPoints) { - calculateSegmentsForPoints(data); + if (_renderPoints) { + glm::vec3 cameraViewDirectionWorld = -data.camera.viewDirectionWorldSpace(); + glm::vec3 cameraUpDirectionWorld = data.camera.lookUpVectorWorldSpace(); + glm::vec3 orthoRight = glm::normalize( + glm::cross(cameraUpDirectionWorld, cameraViewDirectionWorld) + ); + if (orthoRight == glm::vec3(0.f)) { + glm::vec3 otherVector = glm::vec3( + cameraUpDirectionWorld.y, + cameraUpDirectionWorld.x, + cameraUpDirectionWorld.z + ); + orthoRight = glm::normalize(glm::cross(otherVector, cameraViewDirectionWorld)); + } + glm::vec3 orthoUp = glm::normalize(glm::cross(cameraViewDirectionWorld, orthoRight)); _pointProgram->activate(); _pointProgram->setUniform( @@ -465,6 +545,18 @@ void RenderableOrbitalKepler::render(const RenderData& data, RendererTasks&) { _uniformPointCache.projectionTransform, data.camera.projectionMatrix() ); + _pointProgram->setUniform( + _uniformPointCache.renderOption, + _appearance.pointRenderOption + ); + _pointProgram->setUniform( + _uniformPointCache.cameraViewDirectionUp, + orthoUp + ); + _pointProgram->setUniform( + _uniformPointCache.cameraViewDirectionRight, + orthoRight + ); _pointProgram->setUniform( _uniformPointCache.cameraPositionWorld, data.camera.positionVec3() @@ -513,9 +605,7 @@ void RenderableOrbitalKepler::render(const RenderData& data, RendererTasks&) { _pointProgram->deactivate(); } - if (renderTrails) { - calculateSegmentsForTrails(data); - + if (_renderTrails) { _trailProgram->activate(); _trailProgram->setUniform(_uniformTrailCache.opacity, opacity()); _trailProgram->setUniform(_uniformTrailCache.color, _appearance.color); @@ -562,32 +652,31 @@ void RenderableOrbitalKepler::render(const RenderData& data, RendererTasks&) { void RenderableOrbitalKepler::updateBuffers() { _parameters = kepler::readFile(_path.value(), _format); + _nOrbits = static_cast(_parameters.size()); - _numObjects = _parameters.size(); - - if (_startRenderIdx >= _numObjects) { + if (_startRenderIdx >= _nOrbits) { throw ghoul::RuntimeError(std::format( - "Start index {} out of range [0, {}]", _startRenderIdx.value(), _numObjects + "Start index {} out of range [0, {}]", _startRenderIdx.value(), _nOrbits )); } long long endElement = _startRenderIdx + _sizeRender - 1; - endElement = (endElement >= _numObjects) ? _numObjects - 1 : endElement; - if (endElement < 0 || endElement >= _numObjects) { + endElement = (endElement >= _nOrbits) ? _nOrbits - 1 : endElement; + if (endElement < 0 || endElement >= _nOrbits) { throw ghoul::RuntimeError(std::format( - "End index {} out of range [0, {}]", endElement, _numObjects + "End index {} out of range [0, {}]", endElement, _nOrbits )); } - _startRenderIdx.setMaxValue(static_cast(_numObjects - 1)); - _sizeRender.setMaxValue(static_cast(_numObjects)); + _startRenderIdx.setMaxValue(static_cast(_nOrbits - 1)); + _sizeRender.setMaxValue(static_cast(_nOrbits)); if (_sizeRender == 0u) { - _sizeRender = static_cast(_numObjects); + _sizeRender = static_cast(_nOrbits); } if (_contiguousMode) { if (_startRenderIdx >= _parameters.size() || - (_startRenderIdx + _sizeRender) >= _parameters.size()) + (_startRenderIdx + _sizeRender) > _parameters.size()) { throw ghoul::RuntimeError(std::format( "Tried to load {} objects but only {} are available", @@ -613,64 +702,112 @@ void RenderableOrbitalKepler::updateBuffers() { ); } + _threadIds.clear(); + _orbitsPerThread.clear(); + _updateHelper.clear(); _startIndexPoints.clear(); _segmentSizePoints.clear(); + _vertexBufferOffset.clear(); _startIndexTrails.clear(); _segmentSizeTrails.clear(); - _segmentSizeRaw.clear(); - size_t nVerticesTotal = 0; - const int numOrbits = static_cast(_parameters.size()); - for (int i = 0; i < numOrbits; i++) { + _segmentsPerOrbit.clear(); + + _updateHelper.resize(_sizeRender); + _startIndexPoints.resize(_sizeRender); + _segmentSizePoints.resize(_sizeRender); + _vertexBufferOffset.resize(_sizeRender); + _segmentsPerOrbit.resize(_sizeRender); + + // Trail vectors needs double length as it may use two trails per orbit + _startIndexTrails.resize(_sizeRender * 2); + _segmentSizeTrails.resize(_sizeRender * 2); + + double maxSemiMajorAxis = 0.0; + size_t nVerticesTotal = 0; + for (unsigned int i = 0; i < _sizeRender; i++) { // For points rendering as they are always two vertices long - _segmentSizePoints.push_back(2); + _segmentSizePoints[i] = 2; const double scale = static_cast(_segmentQuality) * 10.0; const kepler::Parameters& p = _parameters[i]; - _segmentSizeRaw.push_back( - static_cast(scale + (scale / std::pow(1.0 - p.eccentricity, 1.2))) + _segmentsPerOrbit[i] = static_cast( + scale + (scale / std::pow(1.0 - p.eccentricity, 1.2)) ); - nVerticesTotal += _segmentSizeRaw[i]; + _vertexBufferOffset[i] = static_cast(nVerticesTotal); + nVerticesTotal += _segmentsPerOrbit[i]; + + // Find largest value for bounding sphere + if (p.semiMajorAxis > maxSemiMajorAxis) { + maxSemiMajorAxis = p.semiMajorAxis; + } } - _startIndexPoints.resize(numOrbits); - _startIndexTrails.resize(numOrbits*2); - _segmentSizeTrails.resize(numOrbits*2); + setBoundingSphere(maxSemiMajorAxis * 1000); _vertexBufferData.resize(nVerticesTotal); - size_t vertexBufIdx = 0; - for (int orbitIdx = 0; orbitIdx < numOrbits; orbitIdx++) { - const kepler::Parameters& orbit = _parameters[orbitIdx]; + std::vector orbitIdHolder; + orbitIdHolder.resize(_sizeRender); + std::iota(orbitIdHolder.begin(), orbitIdHolder.end(), 0); - ghoul::Dictionary d; - d.setValue("Type", std::string("KeplerTranslation")); - d.setValue("Eccentricity", orbit.eccentricity); - d.setValue("SemiMajorAxis", orbit.semiMajorAxis); - d.setValue("Inclination", orbit.inclination); - d.setValue("AscendingNode", orbit.ascendingNode); - d.setValue("ArgumentOfPeriapsis", orbit.argumentOfPeriapsis); - d.setValue("MeanAnomaly", orbit.meanAnomaly); - d.setValue("Period", orbit.period); - d.setValue("Epoch", orbit.epoch); - KeplerTranslation keplerTranslator = KeplerTranslation(d); + std::for_each( + std::execution::par_unseq, + orbitIdHolder.begin(), + orbitIdHolder.end(), + [&](int index) { + ZoneScoped; - const int nSegments = _segmentSizeRaw[orbitIdx]; - for (GLint j = 0 ; j < nSegments; j++) { - const double timeOffset = orbit.period * - static_cast(j) / static_cast(nSegments - 1); + const kepler::Parameters& orbit = _parameters[index]; - const glm::dvec3 position = keplerTranslator.position({ - {}, - Time(timeOffset + orbit.epoch), - Time(0.0) - }); + const KeplerCalculator calc = KeplerCalculator( + orbit.eccentricity, + orbit.semiMajorAxis, + orbit.inclination, + orbit.ascendingNode, + orbit.argumentOfPeriapsis, + orbit.meanAnomaly, + orbit.period, + orbit.epoch + ); - _vertexBufferData[vertexBufIdx + j].x = static_cast(position.x); - _vertexBufferData[vertexBufIdx + j].y = static_cast(position.y); - _vertexBufferData[vertexBufIdx + j].z = static_cast(position.z); - _vertexBufferData[vertexBufIdx + j].time = static_cast(timeOffset); - _vertexBufferData[vertexBufIdx + j].epoch = orbit.epoch; - _vertexBufferData[vertexBufIdx + j].period = orbit.period; + const int nVerts = _segmentsPerOrbit[index]; + const int offset = _vertexBufferOffset[index]; + const int nSegments = nVerts - 1; + for (GLint j = 0; j < nVerts; j++) { + const double timeOffset = orbit.period * + static_cast(j) / static_cast(nSegments); + + const glm::dvec3 position = calc.position(timeOffset + orbit.epoch); + + _vertexBufferData[offset + j].x = static_cast(position.x); + _vertexBufferData[offset + j].y = static_cast(position.y); + _vertexBufferData[offset + j].z = static_cast(position.z); + _vertexBufferData[offset + j].time = timeOffset; + _vertexBufferData[offset + j].epoch = orbit.epoch; + _vertexBufferData[offset + j].period = orbit.period; + } + + _updateHelper[index].timePerStep = orbit.period / nSegments; } - vertexBufIdx += nSegments; + ); + + // Calculate how many orbits we calculate per thread + // 1000 per thread (arbitrary) to not create threads that do little to no work + unsigned int orbitsPerThread = std::max( + 1000, + static_cast(std::ceil(static_cast(_sizeRender) / _nThreads)) + ); + + // Vector that maps thread index to number of orbits to render + int threadId = 0; + unsigned int remainingOrbits = _sizeRender; + while (remainingOrbits >= orbitsPerThread) { + _threadIds.push_back(threadId); + _orbitsPerThread.push_back(orbitsPerThread); + remainingOrbits -= orbitsPerThread; + threadId++; + } + if (remainingOrbits > 0) { + _threadIds.push_back(threadId); + _orbitsPerThread.push_back(remainingOrbits); } glBindVertexArray(_vertexArray); @@ -684,120 +821,145 @@ void RenderableOrbitalKepler::updateBuffers() { ); glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(TrailVBOLayout), nullptr); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(TrailVBOLayout), nullptr); glEnableVertexAttribArray(1); glVertexAttribLPointer( 1, - 2, + 3, GL_DOUBLE, sizeof(TrailVBOLayout), - reinterpret_cast(4 * sizeof(GL_FLOAT)) + reinterpret_cast(offsetof(TrailVBOLayout, time)) ); glBindVertexArray(0); - - double maxSemiMajorAxis = 0.0; - for (const kepler::Parameters& kp : _parameters) { - if (kp.semiMajorAxis > maxSemiMajorAxis) { - maxSemiMajorAxis = kp.semiMajorAxis; - } - } - setBoundingSphere(maxSemiMajorAxis * 1000); } -void RenderableOrbitalKepler::calculateSegmentsForPoints(const RenderData& data) { - int startVertexIndex = 0; - for (size_t i = 0; i < _segmentSizeRaw.size(); i++) { - // Check how far along the trail we are - const kepler::Parameters& orbit = _parameters[i]; - const double nRevs = (data.time.j2000Seconds() - orbit.epoch) / orbit.period; - float frac = static_cast(nRevs - std::trunc(nRevs)); - frac += (frac < 0.f) ? 1.f: 0.f; +void RenderableOrbitalKepler::threadedSegmentCalculations(int threadId, + const UpdateData& data) +{ + ZoneScoped; - // Get the closest vertex before that point - const int nSegments = _segmentSizeRaw[i] - 1; - const int offset = static_cast(std::floor(frac * nSegments)); + const int selection = _appearance.renderingModes; + _renderPoints = ( + selection == static_cast(RenderMode::RenderingModePoint) || + selection == static_cast(RenderMode::RenderingModePointTrail) + ); + _renderTrails = ( + selection == static_cast(RenderMode::RenderingModeTrail) || + selection == static_cast(RenderMode::RenderingModePointTrail) + ); - // Set start vertex ID in buffer - _startIndexPoints[i] = startVertexIndex + offset; - startVertexIndex += _segmentSizeRaw[i]; - } -} - -void RenderableOrbitalKepler::calculateSegmentsForTrails(const RenderData& data) { const float fade = std::pow( _appearance.trailFade.maxValue() - _appearance.trailFade, 2.f ); const float threshold = 1.f - std::pow(0.05f, 1.f / fade); - int nTotalTrailParts = 0; - int startVertexIndex = 0; - for (size_t i = 0; i < _segmentSizeRaw.size(); i++) { - // Check how far along the trail we are - const kepler::Parameters& orbit = _parameters[i]; - const double nRevs = (data.time.j2000Seconds() - orbit.epoch) / orbit.period; - float frac = static_cast(nRevs - std::trunc(nRevs)); - frac += (frac < 0.f) ? 1.f : 0.f; + int offset = std::accumulate( + _orbitsPerThread.begin(), + _orbitsPerThread.begin() + threadId, + 0 + ); + const int cutoff = offset + _orbitsPerThread[threadId]; - int p0Start = 0; - int p0Length = 0; - int p1Start = 0; - int p1Length = 0; + const double now = data.time.j2000Seconds(); + int startVertexIndex = _vertexBufferOffset[offset]; + for (int i = offset; i < cutoff; i++) { + UpdateInfo* helper = &_updateHelper[i]; + double upper = helper->timestamp + (helper->timePerStep); + double lower = helper->timestamp - (helper->timePerStep); + const bool shouldUpdate = (now >= upper || now <= lower); - const int nVerts = _segmentSizeRaw[i]; - const int nSegments = nVerts - 1; - const int trailLength = static_cast(std::ceil(threshold * nSegments)); - if (trailLength == nSegments) { - // Whole trail should be visible - p0Start = startVertexIndex; - p0Length = nVerts; - } - else { - const int headOffset = static_cast(std::ceil(frac * nSegments)); - const int headVertexIndex = startVertexIndex + headOffset; - const int correctTrailLength = trailLength + 2; + const int nVerts = _segmentsPerOrbit[i]; + if (shouldUpdate || _forceUpdate) { + // Check how far along the trail we are + const kepler::Parameters& orbit = _parameters[i]; + const double nRevs = (data.time.j2000Seconds() - orbit.epoch) / orbit.period; + double frac = static_cast(nRevs - std::trunc(nRevs)); + frac += (frac < 0.0) ? 1.0 : 0.0; - int correctVertexIndex = headVertexIndex - correctTrailLength + 1; + const int nSegments = nVerts - 1; + const int pointHead = static_cast(std::floor(frac * nSegments)); - // If the start of the trail should be at the end of the orbit - if (correctVertexIndex < startVertexIndex) { - correctVertexIndex += nVerts; + // We can always do this since it has no cost + _startIndexPoints[i] = startVertexIndex + pointHead; + + // There is a lot of what seems to be "magic numbers" in this section. + // They will most likely disappear when we change our method of determining + // the trail fade amount is changed. + if (_renderTrails) { + // When rendering a trail we don't know if the trail will pass over + // the starting point of the orbit or not. If the trail passes over the + // starting point of the orbit, then we can't draw the entire trail as + // line strip. Instead we need to divide the line strip into two parts, + // where p0 and p1 denotes the respctive line strips (parts). + int p0Start = -1; + int p0Length = -1; + int p1Start = -1; + int p1Length = -1; + + const int trailLength = + static_cast(std::ceil(threshold * nSegments)); + if (trailLength == nSegments) { + // Whole trail should be visible + p0Start = startVertexIndex; + p0Length = nVerts; + p1Start = 0; + p1Length = 0; + } + else { + const int trailHead = static_cast(std::ceil(frac * nSegments)); + const int headVertexIndex = startVertexIndex + trailHead + 1; + const int correctTrailLength = trailLength + 3; + + // Need to do this due to order of vertex data in the vertex buffer + int correctVertexIndex = headVertexIndex - correctTrailLength; + + // If the start of the trail should be at the end of the orbit + if (correctVertexIndex < startVertexIndex) { + correctVertexIndex += nVerts; + } + + // If the trail is length passes over the last point of the orbit + const int lastVertexIndex = startVertexIndex + nVerts; + if (correctVertexIndex + correctTrailLength > lastVertexIndex) { + p0Start = startVertexIndex; + p1Start = correctVertexIndex; + + // Special check to make sure we don't end up with segment + // sections 1 vertex length. A segment must contain at least 2 + // vertices or more. + if (lastVertexIndex - correctVertexIndex == 1) { + p1Length = 0; + p0Length = correctTrailLength - 1; + } + else { + p1Length = lastVertexIndex - correctVertexIndex; + p0Length = correctTrailLength - p1Length; + } + } + else { + // If the entire trail is within the bounds of the orbit + p0Start = correctVertexIndex; + p0Length = correctTrailLength; + p1Start = 0; + p1Length = 0; + } + } + _startIndexTrails[i * 2] = p0Start; + _segmentSizeTrails[i * 2] = p0Length; + _startIndexTrails[i * 2 + 1] = p1Start; + _segmentSizeTrails[i * 2 + 1] = p1Length; } - // If the trail is length passes over the last point of the orbit - const int lastVertexIndex = startVertexIndex + nVerts; - if (correctVertexIndex + correctTrailLength > lastVertexIndex) { - p1Start = correctVertexIndex - 1; - p1Length = lastVertexIndex - correctVertexIndex + 1; - p0Start = startVertexIndex; - p0Length = correctTrailLength - p1Length + 1; - } - else { - // If the entire trail is within the bounds of the orbit - p0Start = correctVertexIndex; - p0Length = correctTrailLength; - } - } - - int newTrailParts = 0; - if (p0Length > 1) { - _startIndexTrails[nTotalTrailParts] = p0Start; - _segmentSizeTrails[nTotalTrailParts] = p0Length; - newTrailParts += 1; - } - - if (p1Length > 1) { - _startIndexTrails[nTotalTrailParts + newTrailParts] = p1Start; - _segmentSizeTrails[nTotalTrailParts + newTrailParts] = p1Length; - newTrailParts += 1; + _updateHelper[i].timestamp = orbit.epoch + + (std::floor(frac * nSegments) * _updateHelper[i].timePerStep) + + (std::floor(nRevs) * orbit.period); } startVertexIndex += nVerts; - nTotalTrailParts += newTrailParts; } - _lineDrawCount = static_cast(nTotalTrailParts); } } // namespace openspace diff --git a/modules/space/rendering/renderableorbitalkepler.h b/modules/space/rendering/renderableorbitalkepler.h index c729f5ab81..4dd17876ce 100644 --- a/modules/space/rendering/renderableorbitalkepler.h +++ b/modules/space/rendering/renderableorbitalkepler.h @@ -68,6 +68,8 @@ private: properties::FloatProperty maxSize; /// Max angular size between vector cameraToPoint and edge of the point properties::OptionProperty renderingModes; + /// Specifies rendering orientation when rendering points + properties::OptionProperty pointRenderOption; /// Specifies a multiplicative factor that fades out the trail line properties::FloatProperty trailFade; /// Specifies if the point outline should be enabled @@ -76,59 +78,73 @@ private: properties::Vec3Property outlineColor; /// Specifies how much if the point should be covered by the outline properties::FloatProperty outlineWidth; + + bool isRenderTypeDirty = false; }; void updateBuffers(); - void calculateSegmentsForPoints(const RenderData& data); - void calculateSegmentsForTrails(const RenderData& data); + void threadedSegmentCalculations(int threadId, const UpdateData& data); + const int _nThreads = 0; + std::vector _threadIds; + std::vector _orbitsPerThread; + std::vector _vertexBufferOffset; + + bool _renderTrails = false; + bool _renderPoints = false; + bool _forceUpdate = false; bool _updateDataBuffersAtNextRender = false; - long long _numObjects = 0; + + unsigned int _nOrbits = 0; GLsizei _lineDrawCount = 0; - properties::UIntProperty _segmentQuality; - properties::UIntProperty _startRenderIdx; - properties::UIntProperty _sizeRender; - std::vector _segmentSizeRaw; + std::vector _segmentsPerOrbit; std::vector _startIndexPoints; std::vector _segmentSizePoints; std::vector _startIndexTrails; std::vector _segmentSizeTrails; std::vector _parameters; + /// Extra data for more efficient updating of vectors + struct UpdateInfo { + double timestamp = std::numeric_limits::min(); + double timePerStep = 0.0; + }; + std::vector _updateHelper; + /// The layout of the VBOs struct TrailVBOLayout { float x = 0.f; float y = 0.f; float z = 0.f; - float time = 0.f; + double time = 0.0; double epoch = 0.0; double period = 0.0; }; - /// The backend storage for the vertex buffer object containing all points std::vector _vertexBufferData; - GLuint _vertexArray = 0; - GLuint _vertexBuffer = 0; - ghoul::opengl::ProgramObject* _trailProgram = nullptr; ghoul::opengl::ProgramObject* _pointProgram = nullptr; + properties::UIntProperty _segmentQuality; + properties::UIntProperty _startRenderIdx; + properties::UIntProperty _sizeRender; properties::StringProperty _path; properties::BoolProperty _contiguousMode; kepler::Format _format; RenderableOrbitalKepler::Appearance _appearance; + GLuint _vertexArray = 0; + GLuint _vertexBuffer = 0; + // Line cache UniformCache(modelViewTransform, projectionTransform, trailFadeExponent, - colorFadeCutoffValue, inGameTime, color, opacity) - _uniformTrailCache; + colorFadeCutoffValue, inGameTime, color, opacity) _uniformTrailCache; // Point cache - UniformCache(modelTransform, viewTransform, projectionTransform, - cameraPositionWorld, cameraUpWorld, inGameTime, color, - pointSizeExponent, enableMaxSize, maxSize, enableOutline, - outlineColor, outlineWeight, opacity) - _uniformPointCache; + UniformCache(modelTransform, viewTransform, projectionTransform, renderOption, + cameraViewDirectionUp, cameraViewDirectionRight, cameraPositionWorld, + cameraUpWorld, inGameTime, color, pointSizeExponent, enableMaxSize, maxSize, + enableOutline, outlineColor, outlineWeight, opacity) _uniformPointCache; }; } // namespace openspace diff --git a/modules/space/shaders/keplerpoints_gs.glsl b/modules/space/shaders/keplerpoints_gs.glsl index e78f746c5d..e9ba006f2c 100644 --- a/modules/space/shaders/keplerpoints_gs.glsl +++ b/modules/space/shaders/keplerpoints_gs.glsl @@ -33,17 +33,27 @@ flat in float vertexRevolutionFraction[]; uniform dmat4 modelTransform; uniform dmat4 viewTransform; uniform mat4 projectionTransform; -uniform dvec3 cameraPositionWorld; -uniform vec3 cameraUpWorld; uniform float pointSizeExponent; uniform bool enableMaxSize; uniform float maxSize; +uniform int renderOption; + +// Camera View Direction +uniform vec3 cameraViewDirectionUp; +uniform vec3 cameraViewDirectionRight; + +// Camera Normal +uniform dvec3 cameraPositionWorld; +uniform vec3 cameraUpWorld; layout(triangle_strip, max_vertices = 4) out; out float projectionViewDepth; out vec4 viewSpace; out vec2 texCoord; +const int RenderOptionCameraViewDirection = 0; +const int RenderOptionCameraPositionNormal = 1; + void main() { // cFrac is how far along the trail orbit the head of the trail is. // v0Frac and v1Frac are how far the two vertices that creates the current line strip @@ -65,12 +75,21 @@ void main() { // Calculate current vertex position to world space dvec4 vertPosWorldSpace = modelTransform * pos; - - // Calculate new axis for plane vec3 camPosToVertPos = vec3(cameraPositionWorld - vertPosWorldSpace.xyz); - vec3 normal = normalize(camPosToVertPos); - vec3 right = normalize(cross(cameraUpWorld, normal)); - vec3 up = normalize(cross(normal, right)); + + vec3 up; + vec3 right; + // Calculate new axis for plane + if (renderOption == RenderOptionCameraViewDirection) { + up = cameraViewDirectionUp; + right = cameraViewDirectionRight; + } + else { + // Camera Position Normal + vec3 normal = normalize(camPosToVertPos); + right = normalize(cross(cameraUpWorld, normal)); + up = normalize(cross(normal, right)); + } // Calculate size of points float initialSize = pow(10.0, pointSizeExponent); diff --git a/modules/space/shaders/keplerpoints_vs.glsl b/modules/space/shaders/keplerpoints_vs.glsl index 9b79e8fee3..76e54e43cf 100644 --- a/modules/space/shaders/keplerpoints_vs.glsl +++ b/modules/space/shaders/keplerpoints_vs.glsl @@ -24,8 +24,8 @@ #version __CONTEXT__ -layout (location = 0) in vec4 vertexData; // 1: x, 2: y, 3: z, 4: timeOffset, -layout (location = 1) in dvec2 orbitData; // 1: epoch, 2: period +layout (location = 0) in vec3 vertexData; // 1: x, 2: y, 3: z +layout (location = 1) in dvec3 orbitData; // 1: timeOffset, 2: epoch, 3: period uniform double inGameTime; @@ -33,8 +33,9 @@ flat out float currentRevolutionFraction; flat out float vertexRevolutionFraction; void main() { - double epoch = orbitData.x; - double period = orbitData.y; + double timeOffset = orbitData.x; + double epoch = orbitData.y; + double period = orbitData.z; // calculate nr of periods, get fractional part to know where the vertex closest to the // debris part is right now @@ -45,7 +46,7 @@ void main() { } // Same procedure for the current vertex - vertexRevolutionFraction = float(vertexData.w / period); + vertexRevolutionFraction = float(timeOffset / period); gl_Position = vec4(vertexData.xyz, 1.0); } diff --git a/modules/space/shaders/keplertrails_fs.glsl b/modules/space/shaders/keplertrails_fs.glsl index 1563af91db..dec9c9ba5d 100644 --- a/modules/space/shaders/keplertrails_fs.glsl +++ b/modules/space/shaders/keplertrails_fs.glsl @@ -51,7 +51,7 @@ Fragment getFragment() { vertexDistance += 1.0; } - float invert = pow((1.0 - vertexDistance), trailFadeExponent); + float invert = pow(1.0 - vertexDistance, trailFadeExponent); float fade = clamp(invert, 0.0, 1.0); // Currently even fully transparent lines can occlude other lines, thus we discard these diff --git a/modules/space/shaders/keplertrails_vs.glsl b/modules/space/shaders/keplertrails_vs.glsl index dbcdccb176..52fcf4ffa6 100644 --- a/modules/space/shaders/keplertrails_vs.glsl +++ b/modules/space/shaders/keplertrails_vs.glsl @@ -26,8 +26,8 @@ #include "PowerScaling/powerScalingMath.hglsl" -layout (location = 0) in vec4 vertexData; // 1: x, 2: y, 3: z, 4: timeOffset, -layout (location = 1) in dvec2 orbitData; // 1: epoch, 2: period +layout (location = 0) in vec3 vertexData; // 1: x, 2: y, 3: z +layout (location = 1) in dvec3 orbitData; // 1: timeOffset, 2: epoch, 3: period out vec4 viewSpacePosition; out float viewSpaceDepth; @@ -48,8 +48,9 @@ void main() { // offsetPeriods is calculated to know how much to fade that specific fragment. // If orbit_data is doubles, cast to float first - double epoch = orbitData.x; - double period = orbitData.y; + double timeOffset = orbitData.x; + double epoch = orbitData.y; + double period = orbitData.z; // Calculate nr of periods, get fractional part to know where the vertex closest to the // debris part is right now @@ -61,7 +62,7 @@ void main() { } // Same procedure for the current vertex - offsetPeriods = vertexData.w / float(period); + offsetPeriods = float(timeOffset / period); viewSpacePosition = vec4(modelViewTransform * dvec4(vertexData.xyz, 1)); vec4 vs_position = z_normalization(projectionTransform * viewSpacePosition); diff --git a/modules/space/translation/keplertranslation.cpp b/modules/space/translation/keplertranslation.cpp index 2e3ddeb0b9..ae4d4288ab 100644 --- a/modules/space/translation/keplertranslation.cpp +++ b/modules/space/translation/keplertranslation.cpp @@ -217,38 +217,38 @@ KeplerTranslation::KeplerTranslation(const ghoul::Dictionary& dictionary) ); } -double KeplerTranslation::eccentricAnomaly(double meanAnomaly) const { +double KeplerTranslation::eccentricAnomaly(double meanAnomaly, double eccentricity) { // Compute the eccentric anomaly (the location of the spacecraft taking the // eccentricity of the orbit into account) using different solves for the regimes in // which they are most efficient - if (_eccentricity == 0.0) { + if (eccentricity == 0.0) { // In a circular orbit, the eccentric anomaly = mean anomaly return meanAnomaly; } - else if (_eccentricity < 0.2) { - auto solver = [this, &meanAnomaly](double x) -> double { + else if (eccentricity < 0.2) { + auto solver = [&](double x) -> double { // For low eccentricity, using a first order solver sufficient - return meanAnomaly + _eccentricity * std::sin(x); + return meanAnomaly + eccentricity * std::sin(x); }; return solveIteration(solver, meanAnomaly, 0.0, 5); } - else if (_eccentricity < 0.9) { - auto solver = [this, &meanAnomaly](double x) -> double { - const double e = _eccentricity; + else if (eccentricity < 0.9) { + auto solver = [&](double x) -> double { + const double e = eccentricity; return x + (meanAnomaly + e * std::sin(x) - x) / (1.0 - e * std::cos(x)); }; return solveIteration(solver, meanAnomaly, 0.0, 6); } - else if (_eccentricity < 1.0) { + else if (eccentricity < 1.0) { auto sign = [](double val) -> double { return val > 0.0 ? 1.0 : ((val < 0.0) ? -1.0 : 0.0); }; - const double e = meanAnomaly + 0.85 * _eccentricity * sign(std::sin(meanAnomaly)); + const double e = meanAnomaly + 0.85 * eccentricity * sign(std::sin(meanAnomaly)); - auto solver = [this, &meanAnomaly, &sign](double x) -> double { - const double s = _eccentricity * std::sin(x); - const double c = _eccentricity * std::cos(x); + auto solver = [&](double x) -> double { + const double s = eccentricity * std::sin(x); + const double c = eccentricity * std::cos(x); const double f = x - s - meanAnomaly; const double f1 = 1 - c; const double f2 = s; @@ -266,14 +266,19 @@ double KeplerTranslation::eccentricAnomaly(double meanAnomaly) const { glm::dvec3 KeplerTranslation::position(const UpdateData& data) const { if (_orbitPlaneDirty) { - computeOrbitPlane(); + _orbitPlaneRotation = computeOrbitPlane( + _ascendingNode, + _inclination, + _argumentOfPeriapsis + ); + notifyObservers(); _orbitPlaneDirty = false; } const double t = data.time.j2000Seconds() - _epoch; const double meanMotion = glm::two_pi() / _period; const double meanAnomaly = glm::radians(_meanAnomalyAtEpoch.value()) + t * meanMotion; - const double e = eccentricAnomaly(meanAnomaly); + const double e = eccentricAnomaly(meanAnomaly, _eccentricity); // Use the eccentric anomaly to compute the actual location const glm::dvec3 p = glm::dvec3( @@ -284,7 +289,9 @@ glm::dvec3 KeplerTranslation::position(const UpdateData& data) const { return _orbitPlaneRotation * p * 1000.0; } -void KeplerTranslation::computeOrbitPlane() const { +glm::dmat3 KeplerTranslation::computeOrbitPlane(double ascendingNode, double inclination, + double argumentOfPeriapsis) +{ // We assume the following coordinate system: // z = axis of rotation // x = pointing towards the first point of Aries @@ -300,16 +307,13 @@ void KeplerTranslation::computeOrbitPlane() const { const glm::dvec3 inclinationAxisRot = glm::dvec3(1.f, 0.f, 0.f); const glm::dvec3 argPeriapsisAxisRot = glm::dvec3(0.f, 0.f, 1.f); - const double asc = glm::radians(_ascendingNode.value()); - const double inc = glm::radians(_inclination.value()); - const double per = glm::radians(_argumentOfPeriapsis.value()); + const double asc = glm::radians(ascendingNode); + const double inc = glm::radians(inclination); + const double per = glm::radians(argumentOfPeriapsis); - _orbitPlaneRotation = glm::rotate(asc, ascendingNodeAxisRot) * - glm::rotate(inc, inclinationAxisRot) * - glm::rotate(per, argPeriapsisAxisRot); - - notifyObservers(); - _orbitPlaneDirty = false; + return glm::rotate(asc, ascendingNodeAxisRot) * + glm::rotate(inc, inclinationAxisRot) * + glm::rotate(per, argPeriapsisAxisRot); } void KeplerTranslation::setKeplerElements(double eccentricity, double semiMajorAxis, @@ -378,7 +382,47 @@ void KeplerTranslation::setKeplerElements(double eccentricity, double semiMajorA _period = orbitalPeriod; _epoch = epoch; - computeOrbitPlane(); + _orbitPlaneRotation = computeOrbitPlane( + _ascendingNode, + _inclination, + _argumentOfPeriapsis + ); + notifyObservers(); + _orbitPlaneDirty = false; +} + +KeplerCalculator::KeplerCalculator(double eccentricity, double semiMajorAxis, + double inclination, double ascendingNode, + double argumentOfPeriapsis, double meanAnomalyAtEpoch, + double orbitalPeriod, double epoch) + : _eccentricity(eccentricity) + , _semiMajorAxis(semiMajorAxis) + , _inclination(inclination) + , _ascendingNode(ascendingNode) + , _argumentOfPeriapsis(argumentOfPeriapsis) + , _meanAnomalyAtEpoch(meanAnomalyAtEpoch) + , _orbitalPeriod(orbitalPeriod) + , _epoch(epoch) + , _orbitPlaneRotation(KeplerTranslation::computeOrbitPlane( + ascendingNode, + inclination, + argumentOfPeriapsis + )) +{} + +glm::dvec3 KeplerCalculator::position(double time) const { + const double t = time - _epoch; + const double meanMotion = glm::two_pi() / _orbitalPeriod; + const double meanAnomaly = glm::radians(_meanAnomalyAtEpoch) + t * meanMotion; + const double e = KeplerTranslation::eccentricAnomaly(meanAnomaly, _eccentricity); + + // Use the eccentric anomaly to compute the actual location + const glm::dvec3 p = glm::dvec3( + _semiMajorAxis * (std::cos(e) - _eccentricity), + _semiMajorAxis * std::sin(e) * std::sqrt(1.0 - _eccentricity * _eccentricity), + 0.0 + ); + return _orbitPlaneRotation * p * 1000.0; } } // namespace openspace diff --git a/modules/space/translation/keplertranslation.h b/modules/space/translation/keplertranslation.h index 213d99e288..0c1177b97b 100644 --- a/modules/space/translation/keplertranslation.h +++ b/modules/space/translation/keplertranslation.h @@ -118,9 +118,9 @@ public: /** * Recombutes the rotation matrix used in the update method. */ - void computeOrbitPlane() const; + static glm::dmat3 computeOrbitPlane(double ascendingNode, double inclination, + double argumentOfPeriapsis); -private: /** * This method computes the eccentric anomaly (location of the space craft taking the * eccentricity into acount) based on the mean anomaly (location of the space craft @@ -128,10 +128,13 @@ private: * * \param meanAnomaly The mean anomaly for which the eccentric anomaly shall be * computed + * \param eccentricity The eccentricity for which the eccentric anomaly shall be + * computed * \return The eccentric anomaly for the provided \p meanAnomaly */ - double eccentricAnomaly(double meanAnomaly) const; + static double eccentricAnomaly(double meanAnomaly, double eccentricity); +private: /// The eccentricity of the orbit in [0, 1) properties::DoubleProperty _eccentricity; /// The semi-major axis in km @@ -159,6 +162,27 @@ private: glm::dvec3 _position = glm::dvec3(0.0); }; +class KeplerCalculator { +public: + KeplerCalculator(double eccentricity, double semiMajorAxis, + double inclination, double ascendingNode, double argumentOfPeriapsis, + double meanAnomalyAtEpoch, double orbitalPeriod, double epoch); + + glm::dvec3 position(double time) const; + +private: + const double _eccentricity; + const double _semiMajorAxis; + const double _inclination; + const double _ascendingNode; + const double _argumentOfPeriapsis; + const double _meanAnomalyAtEpoch; + const double _orbitalPeriod; + const double _epoch; + + const glm::dmat3 _orbitPlaneRotation; +}; + } // namespace openspace #endif // __OPENSPACE_MODULE_SPACE___KEPLERTRANSLATION___H__ From 8d382d5a852d6160f4e16b041bd9206f2e495906 Mon Sep 17 00:00:00 2001 From: Mathis Brossier Date: Mon, 27 Oct 2025 14:20:29 +0100 Subject: [PATCH 09/43] Make TUIO port configurable (#3813) --- modules/touch/include/tuioear.h | 2 +- modules/touch/src/tuioear.cpp | 4 ++-- modules/touch/touchmodule.cpp | 24 ++++++++++++++++++++++-- modules/touch/touchmodule.h | 2 ++ 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/modules/touch/include/tuioear.h b/modules/touch/include/tuioear.h index a2db75f503..16d8750bf6 100644 --- a/modules/touch/include/tuioear.h +++ b/modules/touch/include/tuioear.h @@ -52,7 +52,7 @@ namespace openspace { class TuioEar : public TUIO::TuioListener { public: - TuioEar(); + explicit TuioEar(int port = 3333); ~TuioEar(); /** diff --git a/modules/touch/src/tuioear.cpp b/modules/touch/src/tuioear.cpp index 9173ff0295..150b2eaddc 100644 --- a/modules/touch/src/tuioear.cpp +++ b/modules/touch/src/tuioear.cpp @@ -96,8 +96,8 @@ std::vector TuioEar::takeRemovals() { } // Standard UDP IP connection to port 3333 -TuioEar::TuioEar() - : _tuioClient(3333) +TuioEar::TuioEar(int port) + : _tuioClient(port) { _tuioClient.addTuioListener(this); _tuioClient.connect(); diff --git a/modules/touch/touchmodule.cpp b/modules/touch/touchmodule.cpp index bb6e6b46b0..c94666ccea 100644 --- a/modules/touch/touchmodule.cpp +++ b/modules/touch/touchmodule.cpp @@ -40,6 +40,13 @@ using namespace TUIO; namespace { constexpr std::string_view _loggerCat = "TouchModule"; + constexpr openspace::properties::Property::PropertyInfo TuioPortInfo = { + "TuioPort", + "TUIO Port", + "TUIO UDP port, by default 3333. The port cannot be changed after startup.", + openspace::properties::Property::Visibility::AdvancedUser + }; + constexpr openspace::properties::Property::PropertyInfo EnableTouchInfo = { "EnableTouchInteraction", "Enable touch interaction", @@ -66,18 +73,28 @@ namespace { "relatively spherical objects.", openspace::properties::Property::Visibility::AdvancedUser }; + + struct [[codegen::Dictionary(TouchModule)]] Parameters { + // [[codegen::verbatim(TuioPortInfo.description)]] + std::optional tuioPort [[codegen::inrange(1, 65535)]]; + }; + + #include "touchmodule_codegen.cpp" } // namespace namespace openspace { TouchModule::TouchModule() : OpenSpaceModule("Touch") + , _tuioPort(TuioPortInfo, 3333, 1, 65535) , _touchIsEnabled(EnableTouchInfo, true) , _hasActiveTouchEvent(EventsInfo, false) , _defaultDirectTouchRenderableTypes(DefaultDirectTouchRenderableTypesInfo) { addPropertySubOwner(_touch); addPropertySubOwner(_markers); + _tuioPort.setReadOnly(true); + addProperty(_tuioPort); addProperty(_touchIsEnabled); _touchIsEnabled.onChange([this]() { _touch.resetAfterInput(); @@ -116,8 +133,11 @@ bool TouchModule::isDefaultDirectTouchType(std::string_view renderableType) cons _sortedDefaultRenderableTypes.end(); } -void TouchModule::internalInitialize(const ghoul::Dictionary&) { - _ear.reset(new TuioEar()); +void TouchModule::internalInitialize(const ghoul::Dictionary& dict) { + const Parameters p = codegen::bake(dict); + + _tuioPort = p.tuioPort.value_or(_tuioPort); + _ear = std::make_unique(_tuioPort); global::callback::initializeGL->push_back([this]() { LDEBUG("Initializing TouchMarker OpenGL"); diff --git a/modules/touch/touchmodule.h b/modules/touch/touchmodule.h index 6b922920d8..4c76f80f5a 100644 --- a/modules/touch/touchmodule.h +++ b/modules/touch/touchmodule.h @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -77,6 +78,7 @@ private: std::vector _deferredRemovals; std::vector _lastTouchInputs; + properties::IntProperty _tuioPort; properties::BoolProperty _touchIsEnabled; properties::BoolProperty _hasActiveTouchEvent; properties::StringListProperty _defaultDirectTouchRenderableTypes; From f7cb1b4edbfec30f097ea0f03cc3b7d5c987cbfc Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Mon, 27 Oct 2025 16:16:28 +0100 Subject: [PATCH 10/43] Use bounding sphere instead of interaction for debug axes default size Interaction sphere is often zero by default => the axes will not be visible. The bounding sphere better matches the visible size of the object --- modules/debugging/scripts/axes.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/debugging/scripts/axes.lua b/modules/debugging/scripts/axes.lua index 93ba88fbb6..6cbdf2594b 100644 --- a/modules/debugging/scripts/axes.lua +++ b/modules/debugging/scripts/axes.lua @@ -21,14 +21,14 @@ openspace.debugging.documentation = { current focus node is used instead. \\param scale An optional parameter that specifies the size of the coordinate axes, in meters. If not specified, the size is set to 2.5 times the - interaction sphere of the selected node. + bounding sphere of the selected node. ]] } } openspace.debugging.createCoordinateAxes = function (nodeIdentifier, scale) local node = nodeIdentifier or openspace.navigation.getNavigationState().Anchor - local sphere = openspace.propertyValue("Scene." .. node .. ".EvaluatedInteractionSphere") + local sphere = openspace.propertyValue("Scene." .. node .. ".EvaluatedBoundingSphere") if sphere == -1 then sphere = 1 end From 28367dcfbe2a7a80c0fe9384addf1e66e406591c Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 17 Nov 2025 14:48:25 +0100 Subject: [PATCH 11/43] Correctly calculate the max chunk level when no overview is available (#3771) --- modules/globebrowsing/src/rawtiledatareader.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/modules/globebrowsing/src/rawtiledatareader.cpp b/modules/globebrowsing/src/rawtiledatareader.cpp index fee3dfea1c..11f1abc6dd 100644 --- a/modules/globebrowsing/src/rawtiledatareader.cpp +++ b/modules/globebrowsing/src/rawtiledatareader.cpp @@ -413,7 +413,18 @@ void RawTileDataReader::initialize() { _padfTransform = geoTransform(_rasterXSize, _rasterYSize); } - _maxChunkLevel = _dataset->GetRasterBand(1)->GetOverviewCount(); + + + const int nOverviews = _dataset->GetRasterBand(1)->GetOverviewCount(); + if (nOverviews > 0) { + _maxChunkLevel = nOverviews; + } + else { + const int sizeLevel0 = _dataset->GetRasterBand(1)->GetXSize(); + const double diff = log2(sizeLevel0) - log2(_initData.dimensions.x); + const double intdiff = diff >= 0 ? ceil(diff) : floor(diff); + _maxChunkLevel = intdiff; + } } void RawTileDataReader::reset() { From 0950c7bc2fe83bc720906e0feb5e41e8bf783841 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 19 Nov 2025 16:56:03 +0100 Subject: [PATCH 12/43] Update LatSegments number to match the previous buggy behavior --- data/assets/scene/digitaluniverse/grids.asset | 2 +- .../assets/scene/solarsystem/heliosphere/todayssun/grid.asset | 4 ++-- ext/ghoul | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/assets/scene/digitaluniverse/grids.asset b/data/assets/scene/digitaluniverse/grids.asset index 78db5edd2d..8af69c27e8 100644 --- a/data/assets/scene/digitaluniverse/grids.asset +++ b/data/assets/scene/digitaluniverse/grids.asset @@ -104,7 +104,7 @@ local EquatorialSphere = { Opacity = 1.0, Color = { 0.3, 0.3, 0.15 }, LineWidth = 2.0, - LatSegments = 36, + LatSegments = 17, LongSegments = 24, }, Tag = { "du_grid" }, diff --git a/data/assets/scene/solarsystem/heliosphere/todayssun/grid.asset b/data/assets/scene/solarsystem/heliosphere/todayssun/grid.asset index b083d82a6b..91d2326793 100644 --- a/data/assets/scene/solarsystem/heliosphere/todayssun/grid.asset +++ b/data/assets/scene/solarsystem/heliosphere/todayssun/grid.asset @@ -33,7 +33,7 @@ local CarringtonPrimeMeridian = { Color = { 1.0, 0.0, 0.0 }, LineWidth = 2.0, LongSegments = 2, - LatSegments = 64 + LatSegments = 31 }, GUI = { Name = "Carrington Prime Meridian", @@ -63,7 +63,7 @@ local WSA_GridSlice = { Color = { 0.8, 0.8, 0.8 }, LineWidth = 2.0, LongSegments = 2, - LatSegments = 64 + LatSegments = 31 }, GUI = { Name = "Solar Longitude Facing the Earth", diff --git a/ext/ghoul b/ext/ghoul index 04688d7568..b274675f3d 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit 04688d75685afec8a9a4f32362785a4828b70d90 +Subproject commit b274675f3de2cffeef995def4247e5d0fbf50693 From ca29378d5448301cc8c9fa9f1576910fa8f37b3c Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 20 Nov 2025 16:56:54 +0100 Subject: [PATCH 13/43] Update assets to adapt to the bugfix in the RenderableSphericalGrid --- data/assets/nightsky/altaz.asset | 5 ++++- data/assets/scene/digitaluniverse/grids.asset | 6 ++++-- .../scene/solarsystem/heliosphere/todayssun/grid.asset | 7 +++---- modules/base/rendering/grids/renderablesphericalgrid.cpp | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/data/assets/nightsky/altaz.asset b/data/assets/nightsky/altaz.asset index 494ca1aeeb..1f171e0dd2 100644 --- a/data/assets/nightsky/altaz.asset +++ b/data/assets/nightsky/altaz.asset @@ -58,7 +58,10 @@ local AltAzGrid = { Opacity = 0.8, Color = { 0.2, 0.4, 0.2 }, LineWidth = 2.0, - RenderBinMode = "PostDeferredTransparent" + RenderBinMode = "PostDeferredTransparent", + LatSegments = 19, + LongSegments = 36 + }, Tag = { "nightsky_marking" }, GUI = { diff --git a/data/assets/scene/digitaluniverse/grids.asset b/data/assets/scene/digitaluniverse/grids.asset index 8af69c27e8..8d1c23fe2f 100644 --- a/data/assets/scene/digitaluniverse/grids.asset +++ b/data/assets/scene/digitaluniverse/grids.asset @@ -104,7 +104,7 @@ local EquatorialSphere = { Opacity = 1.0, Color = { 0.3, 0.3, 0.15 }, LineWidth = 2.0, - LatSegments = 17, + LatSegments = 19, LongSegments = 24, }, Tag = { "du_grid" }, @@ -164,7 +164,9 @@ local EclipticSphere = { Enabled = false, Opacity = 1.0, Color = { 0.3, 0.15, 0.15 }, - LineWidth = 2.0 + LineWidth = 2.0, + LatSegments = 19, + LongSegments = 24 }, Tag = { "du_grid" }, GUI = { diff --git a/data/assets/scene/solarsystem/heliosphere/todayssun/grid.asset b/data/assets/scene/solarsystem/heliosphere/todayssun/grid.asset index 91d2326793..804d9bcc4d 100644 --- a/data/assets/scene/solarsystem/heliosphere/todayssun/grid.asset +++ b/data/assets/scene/solarsystem/heliosphere/todayssun/grid.asset @@ -33,7 +33,7 @@ local CarringtonPrimeMeridian = { Color = { 1.0, 0.0, 0.0 }, LineWidth = 2.0, LongSegments = 2, - LatSegments = 31 + LatSegments = 19 }, GUI = { Name = "Carrington Prime Meridian", @@ -63,7 +63,7 @@ local WSA_GridSlice = { Color = { 0.8, 0.8, 0.8 }, LineWidth = 2.0, LongSegments = 2, - LatSegments = 31 + LatSegments = 19 }, GUI = { Name = "Solar Longitude Facing the Earth", @@ -86,8 +86,7 @@ local WSA_Grid10Degrees = { Type = "RenderableSphericalGrid", Size = gridSizeRadius, Color = { 0.035, 0.675, 0.255 }, - LineWidth = 1.0, - Segments = 36 + LineWidth = 1.0 }, GUI = { Name = "Grid on Sun", diff --git a/modules/base/rendering/grids/renderablesphericalgrid.cpp b/modules/base/rendering/grids/renderablesphericalgrid.cpp index 6b78278c5f..668979ab36 100644 --- a/modules/base/rendering/grids/renderablesphericalgrid.cpp +++ b/modules/base/rendering/grids/renderablesphericalgrid.cpp @@ -124,7 +124,7 @@ RenderableSphericalGrid::RenderableSphericalGrid(const ghoul::Dictionary& dictio , _gridProgram(nullptr) , _color(ColorInfo, glm::vec3(0.5f), glm::vec3(0.f), glm::vec3(1.f)) , _longSegments(LongSegmentsInfo, 36, 4, 200) - , _latSegments(LatSegmentsInfo, 18, 4, 200) + , _latSegments(LatSegmentsInfo, 19, 4, 200) , _lineWidth(LineWidthInfo, 0.5f, 1.f, 20.f) { const Parameters p = codegen::bake(dictionary); From 221cfbcb8553358401caa326a70e62c5afa84667 Mon Sep 17 00:00:00 2001 From: Micah Acinapura Date: Thu, 20 Nov 2025 11:38:08 -0500 Subject: [PATCH 14/43] =?UTF-8?q?Changed=20create=20sun=20trail=20action?= =?UTF-8?q?=20to=20fix=20time=20date=20inconsistancy.=20Fixes=E2=80=A6=20(?= =?UTF-8?q?#3848)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Changed create sun trail action to fix time date inconsistency. Fixes #3817 - Added warning for already existing trails --- .../actions/nightsky/createsuntrails.asset | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/data/assets/actions/nightsky/createsuntrails.asset b/data/assets/actions/nightsky/createsuntrails.asset index 8c4a70e389..5cc7e4c861 100644 --- a/data/assets/actions/nightsky/createsuntrails.asset +++ b/data/assets/actions/nightsky/createsuntrails.asset @@ -15,13 +15,12 @@ local AddSunTrail = { date = openspace.time.UTC() end - local datePlus = openspace.time.advancedTime(date, '1d') - - date = string.sub(date, 1, string.find(date, "T") - 1) - datePlus = string.sub(datePlus, 1, string.find(datePlus, "T") - 1) + dateSub = string.sub(date, 1, string.find(date, "T") - 1) + date = dateSub .. "T00:00:00Z" + local datePlus = dateSub .. "T23:59:59Z" local SunTrailEarth = { - Identifier = "SunTrailEarth" .. date, + Identifier = "SunTrailEarth" .. dateSub, Parent = "Earth", Renderable = { Type = "RenderableTrailTrajectory", @@ -40,12 +39,16 @@ local AddSunTrail = { }, Tag = { "sun_trail" }, GUI = { - Name = "Sun Trail " .. date, + Name = "Sun Trail " .. dateSub, Path = "/Night Sky/Sun Trails", } } - - openspace.addSceneGraphNode(SunTrailEarth) + + if not openspace.hasSceneGraphNode(SunTrailEarth.Identifier) then + openspace.addSceneGraphNode(SunTrailEarth) + else + openspace.printWarning("Sun trail for date " .. dateSub .. " already exists.") + end ]], Documentation = [[ Adds a trail for the sun, if an argument is provided, that date will be used instead of now From fc9d02091c66dc7d742b67c4e3d5cba5520b58bd Mon Sep 17 00:00:00 2001 From: Micah Acinapura Date: Mon, 24 Nov 2025 09:14:32 -0500 Subject: [PATCH 15/43] Made paleo_map.asset layers not enabled by default since there are so many of them (#3853) --- .../solarsystem/planets/earth/noaa-sos/land/paleo_map.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 24074a5ab5..395122df8c 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 @@ -127,7 +127,7 @@ for i,v in ipairs(layers_names) do local layer = { Identifier = Identifier .. "-" .. v, Name = Name .. " " .. v, - Enabled = asset.enabled, + Enabled = false, ZIndex = 100, FilePath = imagesDestination .. "/" .. v .. ".jpg", Description = Description From dcc71897842f20391db5b06f168d3ec615659eed Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 26 Nov 2025 14:21:21 +0100 Subject: [PATCH 16/43] Harmonize Sweden and Utah WMS server to use common DNS names --- .../solarsystem/dwarf_planets/ceres/layers/colorlayers/lamo.wms | 2 +- .../planets/earth/layers/colorlayers/bmng_sweden.wms | 2 +- .../solarsystem/planets/earth/layers/colorlayers/bmng_utah.wms | 2 +- .../planets/earth/layers/watermasks/gebco_sweden.wms | 2 +- .../solarsystem/planets/earth/layers/watermasks/gebco_utah.wms | 2 +- .../planets/earth/moon/layers/colorlayers/clemuvvis_sweden.wms | 2 +- .../planets/earth/moon/layers/colorlayers/clemuvvis_utah.wms | 2 +- .../planets/earth/moon/layers/colorlayers/kaguya_sweden.wms | 2 +- .../planets/earth/moon/layers/colorlayers/kaguya_utah.wms | 2 +- .../earth/moon/layers/colorlayers/lo_mr_mosaic_sweden.wms | 2 +- .../earth/moon/layers/colorlayers/lola_clr_shade_sweden.wms | 2 +- .../earth/moon/layers/colorlayers/lola_clr_shade_utah.wms | 2 +- .../planets/earth/moon/layers/colorlayers/lola_shade_sweden.wms | 2 +- .../planets/earth/moon/layers/colorlayers/lola_shade_utah.wms | 2 +- .../earth/moon/layers/colorlayers/uvvishybrid_sweden.wms | 2 +- .../planets/earth/moon/layers/colorlayers/uvvishybrid_utah.wms | 2 +- .../planets/earth/moon/layers/colorlayers/wac_sweden.wms | 2 +- .../planets/earth/moon/layers/colorlayers/wac_utah.wms | 2 +- .../planets/earth/moon/layers/colorlayers/wac_v1_sweden.wms | 2 +- .../planets/earth/moon/layers/colorlayers/wac_v1_utah.wms | 2 +- .../planets/earth/moon/layers/heightlayers/loladem_sweden.wms | 2 +- .../planets/earth/moon/layers/heightlayers/loladem_utah.wms | 2 +- .../europa/layers/colorlayers/voyager_global_mosaic_sweden.wms | 2 +- .../planets/mars/layers/colorlayers/ctx_mosaic_sweden.wms | 2 +- .../planets/mars/layers/colorlayers/ctx_mosaic_utah.wms | 2 +- .../planets/mars/layers/colorlayers/moc_wa_color_sweden.wms | 2 +- .../planets/mars/layers/colorlayers/moc_wa_color_utah.wms | 2 +- .../planets/mars/layers/colorlayers/mola_hrsc_sweden.wms | 2 +- .../planets/mars/layers/colorlayers/mola_hrsc_utah.wms | 2 +- .../mars/layers/colorlayers/mola_pseudo_color_sweden.wms | 2 +- .../planets/mars/layers/colorlayers/mola_pseudo_color_utah.wms | 2 +- .../planets/mars/layers/colorlayers/themis_ir_day_sweden.wms | 2 +- .../planets/mars/layers/colorlayers/themis_ir_day_utah.wms | 2 +- .../planets/mars/layers/colorlayers/themis_ir_night_sweden.wms | 2 +- .../planets/mars/layers/colorlayers/themis_ir_night_utah.wms | 2 +- .../planets/mars/layers/colorlayers/viking_mdim_sweden.wms | 2 +- .../planets/mars/layers/colorlayers/viking_mdim_utah.wms | 2 +- .../planets/mars/layers/heightlayers/mola_sweden.wms | 2 +- .../solarsystem/planets/mars/layers/heightlayers/mola_utah.wms | 2 +- .../planets/mercury/layers/colorlayers/messenger_bdr_sweden.wms | 2 +- .../planets/mercury/layers/colorlayers/messenger_bdr_utah.wms | 2 +- .../planets/mercury/layers/colorlayers/messenger_hie_sweden.wms | 2 +- .../planets/mercury/layers/colorlayers/messenger_hie_utah.wms | 2 +- .../planets/mercury/layers/colorlayers/messenger_hiw_sweden.wms | 2 +- .../planets/mercury/layers/colorlayers/messenger_hiw_utah.wms | 2 +- .../planets/mercury/layers/colorlayers/messenger_loi_sweden.wms | 2 +- .../planets/mercury/layers/colorlayers/messenger_loi_utah.wms | 2 +- .../mercury/layers/colorlayers/messenger_mdis_sweden.wms | 2 +- .../planets/mercury/layers/colorlayers/messenger_mdis_utah.wms | 2 +- .../planets/mercury/layers/colorlayers/messenger_mdr_utah.wms | 2 +- .../mercury/layers/colorlayers/messenger_mosaic2_sweden.wms | 2 +- .../mercury/layers/colorlayers/messenger_mosaic2_utah.wms | 2 +- .../mercury/layers/colorlayers/messenger_mosaic_sweden.wms | 2 +- .../mercury/layers/colorlayers/messenger_mosaic_utah.wms | 2 +- .../planets/mercury/layers/colorlayers/messenger_mp3_utah.wms | 2 +- .../mercury/layers/colorlayers/messenger_shade_sweden.wms | 2 +- .../planets/mercury/layers/colorlayers/messenger_shade_utah.wms | 2 +- .../planets/mercury/layers/heightlayers/messenger_dem_utah.wms | 2 +- .../layers/colorlayers/global_mosaic_100m_hpf_sweden.wms | 2 +- .../layers/colorlayers/cassini_iss_global_mosaic_4km_sweden.wms | 2 +- .../colorlayers/cassini_sar_hisar_global_mosaic_351m_sweden.wms | 2 +- .../planets/venus/layers/colorlayers/magellan_mosaic_utah.wms | 2 +- .../planets/venus/layers/heightlayers/magellan_utah.wms | 2 +- 63 files changed, 63 insertions(+), 63 deletions(-) diff --git a/data/assets/scene/solarsystem/dwarf_planets/ceres/layers/colorlayers/lamo.wms b/data/assets/scene/solarsystem/dwarf_planets/ceres/layers/colorlayers/lamo.wms index b8b86df7b2..ace1215b9b 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/ceres/layers/colorlayers/lamo.wms +++ b/data/assets/scene/solarsystem/dwarf_planets/ceres/layers/colorlayers/lamo.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Ceres/LAMO/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Ceres/LAMO/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_sweden.wms b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_sweden.wms index e118500f8b..a5823c3ff9 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_sweden.wms +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Earth/Bmng/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Earth/Bmng/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_utah.wms b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_utah.wms index 8ff71a4e45..6381f2d2d3 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_utah.wms +++ b/data/assets/scene/solarsystem/planets/earth/layers/colorlayers/bmng_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Earth/Bmng/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Earth/Bmng/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_sweden.wms b/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_sweden.wms index eb202dbd2d..9c7c5626b4 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_sweden.wms +++ b/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Earth/Gebco/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Earth/Gebco/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_utah.wms b/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_utah.wms index ebc8ffec21..c70438769c 100644 --- a/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_utah.wms +++ b/data/assets/scene/solarsystem/planets/earth/layers/watermasks/gebco_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Earth/Gebco/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Earth/Gebco/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_sweden.wms b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_sweden.wms index 7df84ff7cb..11b667f944 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_sweden.wms +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Moon/Clem_Uvvis/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Moon/Clem_Uvvis/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_utah.wms b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_utah.wms index 12b1323e9d..f2ce0302f6 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_utah.wms +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/clemuvvis_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Moon/ClemUvvis/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Moon/ClemUvvis/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_sweden.wms b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_sweden.wms index f9c4b8ebcc..a951c0fe99 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_sweden.wms +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Moon/Kaguya/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Moon/Kaguya/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_utah.wms b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_utah.wms index db57eac121..2469012509 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_utah.wms +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/kaguya_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Moon/Kaguya/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Moon/Kaguya/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lo_mr_mosaic_sweden.wms b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lo_mr_mosaic_sweden.wms index 3bdb1dbae0..b9e9e2fce1 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lo_mr_mosaic_sweden.wms +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lo_mr_mosaic_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Moon/LO_MR_Mosaic_Global_59m/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Moon/LO_MR_Mosaic_Global_59m/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_sweden.wms b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_sweden.wms index fe510f9b0b..6bd5205595 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_sweden.wms +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Moon/Lola_Clr_Shade/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Moon/Lola_Clr_Shade/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_utah.wms b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_utah.wms index 7e1b349f89..e6460f398f 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_utah.wms +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_clr_shade_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Moon/LolaClrShade/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Moon/LolaClrShade/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_sweden.wms b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_sweden.wms index 7dd5f9f173..c005b30c7e 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_sweden.wms +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Moon/Lola_Shade/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Moon/Lola_Shade/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_utah.wms b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_utah.wms index 059346576d..97f09faed6 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_utah.wms +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/lola_shade_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Moon/LolaShade/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Moon/LolaShade/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_sweden.wms b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_sweden.wms index 46203c927e..2a37338a4c 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_sweden.wms +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Moon/Uvvis_Hybrid/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Moon/Uvvis_Hybrid/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_utah.wms b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_utah.wms index 2ef7206982..c0ff434b2a 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_utah.wms +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/uvvishybrid_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Moon/UvvisHybrid/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Moon/UvvisHybrid/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_sweden.wms b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_sweden.wms index 610e26a6de..54a91cbef8 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_sweden.wms +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Moon/WAC3/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Moon/WAC3/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_utah.wms b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_utah.wms index 2a071a7041..9b7183c729 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_utah.wms +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Moon/Wac3/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Moon/Wac3/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_sweden.wms b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_sweden.wms index 20a8109b55..a3b3e51f70 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_sweden.wms +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Moon/WAC/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Moon/WAC/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_utah.wms b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_utah.wms index 2a33d4d941..1365a8ea3e 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_utah.wms +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/colorlayers/wac_v1_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Moon/Wac/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Moon/Wac/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_sweden.wms b/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_sweden.wms index 4bd6ed5421..80513f0248 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_sweden.wms +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Moon/Lola_DEM/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Moon/Lola_DEM/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_utah.wms b/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_utah.wms index 3a16a6b122..b6087fb678 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_utah.wms +++ b/data/assets/scene/solarsystem/planets/earth/moon/layers/heightlayers/loladem_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Moon/LolaDem/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Moon/LolaDem/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/voyager_global_mosaic_sweden.wms b/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/voyager_global_mosaic_sweden.wms index f36a03bb5c..525a5b1ace 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/voyager_global_mosaic_sweden.wms +++ b/data/assets/scene/solarsystem/planets/jupiter/europa/layers/colorlayers/voyager_global_mosaic_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Europa/Voyager_GalileoSSI_global_mosaic_500m/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Europa/Voyager_GalileoSSI_global_mosaic_500m/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_sweden.wms b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_sweden.wms index 5d4c6b0622..0a57a83f6f 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_sweden.wms +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Mars/CTX/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Mars/CTX/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_utah.wms b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_utah.wms index eb57ecb39f..520ff7e365 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_utah.wms +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/ctx_mosaic_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mars/CTX/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mars/CTX/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_sweden.wms b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_sweden.wms index 4ea03c3a24..19b094af37 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_sweden.wms +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Mars/Color/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Mars/Color/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_utah.wms b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_utah.wms index 294a2bcbef..1770bdce29 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_utah.wms +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/moc_wa_color_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mars/mainColV007/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mars/mainColV007/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_sweden.wms b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_sweden.wms index 434f9b8be7..d73aac7ef0 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_sweden.wms +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Mars/Mola_HRSC/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Mars/Mola_HRSC/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_utah.wms b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_utah.wms index bc86d93875..e802401c47 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_utah.wms +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_hrsc_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mars/MolaHRSC/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mars/MolaHRSC/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_sweden.wms b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_sweden.wms index cdfd9ae5eb..87657b6dc5 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_sweden.wms +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Mars/Mola_PseudoColor/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Mars/Mola_PseudoColor/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_utah.wms b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_utah.wms index f1134104b9..9b9c50cbbd 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_utah.wms +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/mola_pseudo_color_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mars/MolaPseudoColor/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mars/MolaPseudoColor/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_sweden.wms b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_sweden.wms index 08951c67f1..3347400ee4 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_sweden.wms +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_sweden.wms @@ -1,6 +1,6 @@ - http:/wms.itn.liu.se/Mars/Themis_IR_Day/tile/${z}/${y}/${x} + http:/liu-se.wms.openspaceproject.com/Mars/Themis_IR_Day/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_utah.wms b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_utah.wms index 2f0d09b9ad..72f0ed6180 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_utah.wms +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_day_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mars/ThemisIRDay/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mars/ThemisIRDay/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_sweden.wms b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_sweden.wms index 4ec51d1669..f4a1e1562d 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_sweden.wms +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Mars/Themis_IR_Night/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Mars/Themis_IR_Night/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_utah.wms b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_utah.wms index e481d4870f..39ede6a8bc 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_utah.wms +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/themis_ir_night_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mars/ThemisIRNight/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mars/ThemisIRNight/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_sweden.wms b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_sweden.wms index 6fb65da473..c64f157d8b 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_sweden.wms +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Mars/MDIM/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Mars/MDIM/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_utah.wms b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_utah.wms index 15f42f20e7..ac9abdeaf7 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_utah.wms +++ b/data/assets/scene/solarsystem/planets/mars/layers/colorlayers/viking_mdim_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mars/Mdim/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mars/Mdim/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_sweden.wms b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_sweden.wms index e0589a73bc..401687eda4 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_sweden.wms +++ b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Mars/Mola_Elevation/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Mars/Mola_Elevation/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_utah.wms b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_utah.wms index 67b8266b52..533560e35c 100644 --- a/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_utah.wms +++ b/data/assets/scene/solarsystem/planets/mars/layers/heightlayers/mola_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mars/MolaElevation/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mars/MolaElevation/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_sweden.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_sweden.wms index 44311dff11..9247c0b054 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_sweden.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Mercury/Messenger_BDR/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Mercury/Messenger_BDR/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_utah.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_utah.wms index 3096861ca9..51c5491a60 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_utah.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_bdr_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mercury/MessengerBDR/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mercury/MessengerBDR/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_sweden.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_sweden.wms index bd14ff7a10..a4138ebb36 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_sweden.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Mercury/Messenger_HIE/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Mercury/Messenger_HIE/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_utah.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_utah.wms index 46d22c3f36..c2076feaff 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_utah.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hie_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mercury/MessengerHIE/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mercury/MessengerHIE/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_sweden.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_sweden.wms index 85c933d31b..b33447ad3d 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_sweden.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Mercury/Messenger_HIW/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Mercury/Messenger_HIW/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_utah.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_utah.wms index 0e60cf0b16..40c867df31 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_utah.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_hiw_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mercury/MessengerHIW/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mercury/MessengerHIW/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_sweden.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_sweden.wms index 79056a5c31..866776550f 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_sweden.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Mercury/Messenger_LOI/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Mercury/Messenger_LOI/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_utah.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_utah.wms index c0feac0a09..3627b4d22b 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_utah.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_loi_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mercury/MessengerLOI/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mercury/MessengerLOI/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_sweden.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_sweden.wms index 04a83aa840..2a429460ec 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_sweden.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Mercury/Messenger_MDIS/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Mercury/Messenger_MDIS/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_utah.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_utah.wms index 5c12895257..f1a664307f 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_utah.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdis_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mercury/MessengerMdis/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mercury/MessengerMdis/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdr_utah.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdr_utah.wms index 51e83b289f..360fe3f429 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdr_utah.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mdr_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mercury/MessengerMDR/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mercury/MessengerMDR/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_sweden.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_sweden.wms index 7fdf74c39e..41ba86cf73 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_sweden.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Mercury/Messenger_Mosaic_2/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Mercury/Messenger_Mosaic_2/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_utah.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_utah.wms index 2a5770877a..558a47b7d5 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_utah.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic2_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mercury/MessengerMosaic2/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mercury/MessengerMosaic2/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_sweden.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_sweden.wms index 938574d8f0..d37f9ecb2c 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_sweden.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Mercury/Messenger_Mosaic/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Mercury/Messenger_Mosaic/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_utah.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_utah.wms index e32b969efe..cbee055d7d 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_utah.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mosaic_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mercury/MessengerMosaic/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mercury/MessengerMosaic/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mp3_utah.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mp3_utah.wms index d1d572ee8a..33b7b081f3 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mp3_utah.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_mp3_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mercury/MessengerMP3/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mercury/MessengerMP3/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_sweden.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_sweden.wms index 0213e0922e..bd28ec61dc 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_sweden.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Mercury/Messenger_Shade/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Mercury/Messenger_Shade/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_utah.wms b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_utah.wms index dfbceb4255..45a11296e0 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_utah.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/colorlayers/messenger_shade_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mercury/MessengerSHADE/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mercury/MessengerSHADE/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/mercury/layers/heightlayers/messenger_dem_utah.wms b/data/assets/scene/solarsystem/planets/mercury/layers/heightlayers/messenger_dem_utah.wms index f97d363efd..c0c7e9f695 100644 --- a/data/assets/scene/solarsystem/planets/mercury/layers/heightlayers/messenger_dem_utah.wms +++ b/data/assets/scene/solarsystem/planets/mercury/layers/heightlayers/messenger_dem_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Mercury/MessengerDEM/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Mercury/MessengerDEM/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/global_mosaic_100m_hpf_sweden.wms b/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/global_mosaic_100m_hpf_sweden.wms index 18d6caaac2..b0760e36dc 100644 --- a/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/global_mosaic_100m_hpf_sweden.wms +++ b/data/assets/scene/solarsystem/planets/saturn/enceladus/layers/colorlayers/global_mosaic_100m_hpf_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Enceladus/Cassini_ISS_Global_Mosaic_100m_HPF/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Enceladus/Cassini_ISS_Global_Mosaic_100m_HPF/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_iss_global_mosaic_4km_sweden.wms b/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_iss_global_mosaic_4km_sweden.wms index 029305c3f7..5e2ef4ea10 100644 --- a/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_iss_global_mosaic_4km_sweden.wms +++ b/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_iss_global_mosaic_4km_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Titan/ISS_P19658_Mosaic_Global_4km/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Titan/ISS_P19658_Mosaic_Global_4km/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_sar_hisar_global_mosaic_351m_sweden.wms b/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_sar_hisar_global_mosaic_351m_sweden.wms index 2eddf8c8a3..d49369b471 100644 --- a/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_sar_hisar_global_mosaic_351m_sweden.wms +++ b/data/assets/scene/solarsystem/planets/saturn/titan/layers/colorlayers/cassini_sar_hisar_global_mosaic_351m_sweden.wms @@ -1,6 +1,6 @@ - http://wms.itn.liu.se/Titan/HiSAR_Global_Mosaic_351m/tile/${z}/${y}/${x} + http://liu-se.wms.openspaceproject.com/Titan/HiSAR_Global_Mosaic_351m/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/magellan_mosaic_utah.wms b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/magellan_mosaic_utah.wms index 084e231ea4..359c64cb5a 100644 --- a/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/magellan_mosaic_utah.wms +++ b/data/assets/scene/solarsystem/planets/venus/layers/colorlayers/magellan_mosaic_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Venus/MagellanMosaic/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Venus/MagellanMosaic/tile/${z}/${y}/${x} -180.0 diff --git a/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_utah.wms b/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_utah.wms index c8072a6e30..9376bf5f93 100644 --- a/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_utah.wms +++ b/data/assets/scene/solarsystem/planets/venus/layers/heightlayers/magellan_utah.wms @@ -1,6 +1,6 @@ - http://openspace.sci.utah.edu/Venus/MagellanDEM/tile/${z}/${y}/${x} + http://sci-us.wms.openspaceproject.com/Venus/MagellanDEM/tile/${z}/${y}/${x} -180.0 From 4267c181c53f0e4717e4ed11ef71446866ca0b47 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Mon, 1 Dec 2025 11:07:07 +0100 Subject: [PATCH 17/43] Video examples cleanup and documentation (#3835) * Add correctly formatted examples for video player classes * Add documentation for video player classes * Remove old (and replaced) video examples * Update video playback description based on code review and UI update * Remove possibly confusing mention of servers in example assets * Oops, missed one * Remove another mention of the video player, as the UI will change --- .../renderablevideoplane/videoplane.asset | 37 ++++++++++++++ .../renderablevideosphere/videosphere.asset | 34 +++++++++++++ .../screenspacevideo/video.asset | 30 +++++++++++ .../videotileprovider/video.asset | 32 ++++++++++++ .../video_mappedtotime.asset | 41 +++++++++++++++ data/assets/examples/video/examplevideo.mp4 | Bin 287618 -> 0 bytes data/assets/examples/video/videoglobe.asset | 35 ------------- data/assets/examples/video/videoplane.asset | 48 ------------------ .../examples/video/videoscreenspace.asset | 30 ----------- data/assets/examples/video/videosphere.asset | 38 -------------- .../examples/video/videostretchedtotime.asset | 39 -------------- modules/base/rendering/renderableplane.cpp | 14 ++--- .../rendering/renderableplaneimagelocal.cpp | 2 +- .../rendering/renderableplaneimageonline.cpp | 2 +- modules/video/src/renderablevideoplane.cpp | 21 ++++++-- modules/video/src/renderablevideosphere.cpp | 21 ++++++-- modules/video/src/screenspacevideo.cpp | 22 ++++++-- modules/video/src/videoplayer.cpp | 9 ++-- modules/video/src/videotileprovider.cpp | 22 ++++++-- 19 files changed, 263 insertions(+), 214 deletions(-) create mode 100644 data/assets/examples/renderable/renderablevideoplane/videoplane.asset create mode 100644 data/assets/examples/renderable/renderablevideosphere/videosphere.asset create mode 100644 data/assets/examples/screenspacerenderable/screenspacevideo/video.asset create mode 100644 data/assets/examples/tileprovider/videotileprovider/video.asset create mode 100644 data/assets/examples/tileprovider/videotileprovider/video_mappedtotime.asset delete mode 100644 data/assets/examples/video/examplevideo.mp4 delete mode 100644 data/assets/examples/video/videoglobe.asset delete mode 100644 data/assets/examples/video/videoplane.asset delete mode 100644 data/assets/examples/video/videoscreenspace.asset delete mode 100644 data/assets/examples/video/videosphere.asset delete mode 100644 data/assets/examples/video/videostretchedtotime.asset diff --git a/data/assets/examples/renderable/renderablevideoplane/videoplane.asset b/data/assets/examples/renderable/renderablevideoplane/videoplane.asset new file mode 100644 index 0000000000..e30e4e2736 --- /dev/null +++ b/data/assets/examples/renderable/renderablevideoplane/videoplane.asset @@ -0,0 +1,37 @@ +-- Basic +-- Creates a video plane located in 3D space that plays a video file. The dimensions of +-- the plane are automatically set to match the aspect ratio of the video. + +-- The video file is here downloaded from a URL. This code returns the path to a folder +-- where the file is stored after download +local data = asset.resource({ + Name = "Example Video", + Type = "UrlSynchronization", + Identifier = "example_video", + Url = "https://liu-se.cdn.openspaceproject.com/files/examples/video/chlorophyll_model_2048.mp4" +}) + +-- For a local file, use "asset.resource("path/to/local/video.mp4")" here instead +local video = data .. "chlorophyll_model_2048.mp4" + +local Node = { + Identifier = "RenderableVideoPlane_Example", + Renderable = { + Type = "RenderableVideoPlane", + MirrorBackside = true, -- Make the plane render the video on both sides + Video = video + }, + GUI = { + Name = "RenderableVideoPlane - Basic", + Path = "/Examples" + } +} + +asset.onInitialize(function() + openspace.addSceneGraphNode(Node) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(Node) +end) + diff --git a/data/assets/examples/renderable/renderablevideosphere/videosphere.asset b/data/assets/examples/renderable/renderablevideosphere/videosphere.asset new file mode 100644 index 0000000000..6cf4e81b07 --- /dev/null +++ b/data/assets/examples/renderable/renderablevideosphere/videosphere.asset @@ -0,0 +1,34 @@ +-- Basic +-- Creates a 3D sphere with a video texture mapped onto its surface. + +-- The video file is here downloaded from a URL. This code returns the path to a folder +-- where the file is stored after download +local data = asset.resource({ + Name = "Example Video", + Type = "UrlSynchronization", + Identifier = "example_video", + Url = "https://liu-se.cdn.openspaceproject.com/files/examples/video/chlorophyll_model_2048.mp4" +}) + +-- For a local file, use "asset.resource("path/to/local/video.mp4")" here instead +local video = data .. "chlorophyll_model_2048.mp4" + +local Node = { + Identifier = "RenderableVideoSphere_Example", + Renderable = { + Type = "RenderableVideoSphere", + Video = video + }, + GUI = { + Name = "RenderableVideoSphere - Basic", + Path = "/Examples" + } +} + +asset.onInitialize(function() + openspace.addSceneGraphNode(Node) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(Node) +end) diff --git a/data/assets/examples/screenspacerenderable/screenspacevideo/video.asset b/data/assets/examples/screenspacerenderable/screenspacevideo/video.asset new file mode 100644 index 0000000000..c9b6aac3d4 --- /dev/null +++ b/data/assets/examples/screenspacerenderable/screenspacevideo/video.asset @@ -0,0 +1,30 @@ +-- Basic +-- Creates a screenspace video plane that plays a video file. The dimensions of the plane +-- are automatically set to match the aspect ratio of the video. + +-- The video file is here downloaded from a URL. This code returns the path to a folder +-- where the file is stored after download +local data = asset.resource({ + Name = "Example Video", + Type = "UrlSynchronization", + Identifier = "example_video", + Url = "https://liu-se.cdn.openspaceproject.com/files/examples/video/chlorophyll_model_2048.mp4" +}) + +-- For a local file, use "asset.resource("path/to/local/video.mp4")" here instead +local video = data .. "chlorophyll_model_2048.mp4" + +local Item = { + Name = "ScreenSpaceVideo Example", + Type = "ScreenSpaceVideo", + Identifier = "ScreenSpaceVideo_Example", + Video = video +} + +asset.onInitialize(function() + openspace.addScreenSpaceRenderable(Item) +end) + +asset.onDeinitialize(function() + openspace.removeScreenSpaceRenderable(Item) +end) diff --git a/data/assets/examples/tileprovider/videotileprovider/video.asset b/data/assets/examples/tileprovider/videotileprovider/video.asset new file mode 100644 index 0000000000..ed4a201fa0 --- /dev/null +++ b/data/assets/examples/tileprovider/videotileprovider/video.asset @@ -0,0 +1,32 @@ +-- Basic +-- Adds a video as a layer on a globe, in this case Earth. + +local earth = asset.require("scene/solarsystem/planets/earth/earth") + +-- The video file is here downloaded from a URL. This code returns the path to a folder +-- where the file is stored after download +local data = asset.resource({ + Name = "Example Video", + Type = "UrlSynchronization", + Identifier = "example_video", + Url = "https://liu-se.cdn.openspaceproject.com/files/examples/video/chlorophyll_model_2048.mp4" +}) + +-- For a local file, use "asset.resource("path/to/local/video.mp4")" here instead +local video = data .. "chlorophyll_model_2048.mp4" + +local Layer = { + Name = "VideoLayer Example", + Type = "VideoTileProvider", + Identifier = "VideoLayer_Example", + Enabled = true, + Video = video +} + +asset.onInitialize(function() + openspace.globebrowsing.addLayer(earth.Earth.Identifier, "ColorLayers", Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteLayer(earth.Earth.Identifier, "ColorLayers", Layer) +end) diff --git a/data/assets/examples/tileprovider/videotileprovider/video_mappedtotime.asset b/data/assets/examples/tileprovider/videotileprovider/video_mappedtotime.asset new file mode 100644 index 0000000000..d1c8a3c25d --- /dev/null +++ b/data/assets/examples/tileprovider/videotileprovider/video_mappedtotime.asset @@ -0,0 +1,41 @@ +-- Mapped to Time +-- Adds a video as a layer on a globe (Earth) where the video playback is mapped to the +-- simulation time. In this case, the video will play from 20:00 to 21:00 on January 29, +-- 2023 in the simulation. + +local earth = asset.require("scene/solarsystem/planets/earth/earth") + +-- The video file is here downloaded from a URL. This code returns the path to a folder +-- where the file is stored after download +local data = asset.resource({ + Name = "Example Video", + Type = "UrlSynchronization", + Identifier = "example_video", + Url = "https://liu-se.cdn.openspaceproject.com/files/examples/video/chlorophyll_model_2048.mp4" +}) + +-- For a local file, use "asset.resource("path/to/local/video.mp4")" here instead +local video = data .. "chlorophyll_model_2048.mp4" + +local Layer = { + Name = "VideoLayer Example Mapped to Time", + Type = "VideoTileProvider", + Identifier = "VideoLayer_Example_MappedToTime", + Enabled = true, + Video = video, + StartTime = "2023 01 29 20:00:00", + EndTime = "2023 01 29 21:00:00", + PlaybackMode = "MapToSimulationTime", + Description = [[ + Video mapped to the simulation time in OpenSpace. The video will play from 20:00 to + 21:00 on January 29, 2023. + ]] +} + +asset.onInitialize(function() + openspace.globebrowsing.addLayer(earth.Earth.Identifier, "ColorLayers", Layer) +end) + +asset.onDeinitialize(function() + openspace.globebrowsing.deleteLayer(earth.Earth.Identifier, "ColorLayers", Layer) +end) diff --git a/data/assets/examples/video/examplevideo.mp4 b/data/assets/examples/video/examplevideo.mp4 deleted file mode 100644 index ed70354cbee9ed6189459bacd83c90121ffd3ee4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287618 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

6tvVRyPj*Fqct zAeoOW86LqG2GW9uyg&0VT{RQY8>>lDQ-M{gEtTB~#Hp@_T?I*lNjhrXRKH24!nYj> zLuV`NJg|=Fi)l$h5C)SG%`XXZiW72)38m^#pxJs6-9mi=mi&QyGYhsEg-o1#hM?u0 z%n4ILrU}yNdDimV`Pjr%%O&4z$H6~0{!Y$)KD15?smkCQ^!cmL9zwzd#bB6={)2r8 zIje8wcHJKGJeJ^6zM6HH7N8B}ipQwgkma;Q7TjQ$w1d-+IcJNy7E&QO+I{9CQiSYf)i8AC0c^~h&Lyrn@P`T?WI6sqZV|m zRk7hOsx+cK-U&tjB5J9-s!_>Gc?tJN^LHaKDa=)!3){Dxa9oTlqwPz#CatFxDy~@J z#M=2xHj#>49hj(h?rHs7f3z+dV5d}jMW4mO#Me#iU+ziG5zK8iSZIg>)j-tH$~WQ{ zgBJXxP7fA;SI*OvLZhjvbVIduKNNO*%C-}%uO`9_6n%h-j1p!mgEVcs%3Zbla6*`o zTHAr|oMine-uk?mmx#}pp2b#sgoP^v{GB~6H;OQUGp53EvtwdDU+N9gKLz8xOHjE2 zlu~ZNjd%Vw@ZoZhj+fe8wbN7QTG_o=(6?C)3nPwBig4XS*(*|PrB}5s&2SltM8Xst z^(qrF`quz;v>pqeoL_DGEfEu_CTq&%56hZKq(I|)0f-ZTcaY7YW)^{zIp{u*1j&(9 zp{z)S+wD;J9wr{#T0_unLG0U(9QQ7Q0nV>A=8?kq!8G*^!RXeQ8%#4Y~Fle zrJ^fFtV{@+zh|#k`O;kb=XMM@v~8Ew;%}49Vy9<0C4Vf0G4Zw`mtzEJ6QLrLEXm1i z0;MIGB8ea))la2F0sblN0I2Zi(ELxxeFB#6U(N1;lm8#Y{+|f8MzIJTbSvb)0^J~^ z(7~*EjB?lP2^}Fp&uWa4!AkgejD-I@1fl#^mIlg^{`ZF9f2vRZYaj5hbg%!j3~Vj{ zfJG-A`<**=9RN(pE6hIwm31#9mzh3e5J@(rq>@@4j!p5mL7cOVg5-Au{m}fy{RS{9F<*g5$rH<OrEqsKEmv_^ z4v*eBsD{!bi_*yTjcv~O{CpV6@~&3FKxo%(Cf>k$dF@0z+I!vha>=k-PP!vC1A;81srKQhQp!58Lc8p3f>CpfB8S`8gD&f8!Y{!R`iDpAhN_ z3&rW9p5p*3h3i%_@jJ?J7?Q?c=7A+&J@oGou%DArw4>4${nO6GDU;@=s0>1zx)FzR zK#$@H8soXrec-;Ob`~By9N*`-1o`*IPd-=cCMijR979BNJ{oaXWH)H)K6snDU}rXM zxN7$`hO;C!MY$c}`VlYkFIT^dm=lqDTohNPa%!Li$kj_t1J5lj4k%sWmDN^RZD4~h zo_<_F)~~bk+Sd+?lc>5BK^QngkSTCndh2q-s~IhrpcY3KT@L((C=Ruw>EkzvhHp4CmohSD^X=>3v{>wB$P~PV@yKYe$hWxkzX}gj z@9V$zDfLQg*$_^n2zPuU`BS{^4c^yYHCb#R3f3$uaFuG1W&iDk7yzeW7=Bqld41f3$G<-avED3G822z@CC>hm z1b#R6WpQ@DM;=3S_&MzY&BnNC{U+FN@BrIC7pZdwtGXLQ;YP1ukV47(nvJ~)jU-naf}muMoq6XD?!vn!=2@ zKlxHE=Tk6+&t4(E50o&8$V3ezzCRY6j*!a7(8+i29&xKnH;)C-W^|?S!d7lBf!>uv{4zE(~?xeO(j|gMszFov9|KiEh zBYCVljQh@TvXBu1Q>zpY<8#(O2pSKQaaf3 zy|IYZmm1q%adtd+=qeSaP>i^+8-mq*`0q+THN|XsoJZvk)E?JRt&j^ zm-AiJtn67B0Eh6LqA9J-N%=%ED>d?qWG4Nsd9$?-+1L}!$HOVeBHjM;u|VE`*O>3P z3LyNb{h{v@V{lHCFO?z{CmUug0 zp?%neMI~jG(x{MQ3T;d}*aJz?xQ!Ndf}Jo=A$`FP#Y(t$Z*^}k(j9ZHM5ZzfomG-v z%RHl-{c3>P2@!Fiz{b$m=djePYk2#)7<1u^Tks}a^Qa+%ghLWQ!?k|3&N}x=w5qi= zAu`P_%PEWCTr_}%N4`3c;&Hl{T^*d}wV%0>*k|s%$or4JKBFLxxRTU5(r4% z*PznyP`1TD-YV5$GBE8sk===G>DKAh>nsY}h!CX-_-)tL5tp#k5{biHVjr`3cVHEy z;D4axCYnq9Y)!##eQ@csQB2~s;f{91))q8XIY*Q?{LnYVp5(i>J`KBC-c4{1q@LO8 zyQ$4MVRuew;hI+bCq^0UX)>EXY>zpIK`#Q*zBZf|`6aK$vB%0Gy{k9j%gjH5-vzGs zRwy?hItnZ3@HDpdW_jiE|DJ%)-DC>-Em& z@PAr;e|sh*#O{O*o5q$njczHZJhI#&0`sSkl4^Bh>S?nJ!f^_81Nc}e#^#E`i zdu^Yf&4nb+)W;Mq&h&pKwR-IQex~&^UpLO9>UKhz+wR`*p7ld3ZdE$omfp2)xr&#_ zl;39PgI6A~yx?}U%vxH8a>8h$%!ipX^XGlN9KWZBp>T<*+q(tS67f8V`Iiz@yhpeu zz=aSTsUk;7F#1etEDl0mlt`2+zW-G(y8BTP0r#_+%ry8fnLm`ZQF~=H3DsQe=6^m_2CEN%=>15j#^DYXen3AH zAj5t33=3YzqIP?={I&Emf4Y!ZKdgxPQ3)m(e#LOeR&7lx(3IrCIypX}-|ZE?R{y2{0fHtjCX;?Nqq=L0GWi+o z9dD!fyv(WMHf=-FIe|EE7$(Ly*P~!LIYm{lgUAAMg@~?y1={Mn^m)h<=E}uOLa5JCz&%O1CAfVfh#r!l+qy6^OM-YRlfQ-(jUhs(Jvl3(v29n&T5DIYO zb!ozcJ9MqR-zD--wxd}-4f5qm`k}xE6qoFuKKq8FpU+3iOA_Wv7P?81Os(opqqE|i z8NawgfH>r#Sx;5gQSFjKDh4J|FpQxHtVh~+;XjDP7bgubm&BH0S>0^~IdKpF4s({K zJl!NlN7ZY3jKkb$ry%8E#v3B`CV)*bRRe8(yS|{V!S);Ke5J8HPC=oycZ{t7APLWT zR;+`2paT1@9GO>OeA@Zg1 zMdk!2GAZm@_(~2@9nQKC=iuTuOJhWEL!%v4si(E;LO8cQdfQ?Jf;B~i@_s;qpz=?S zS0xHu4m9`maTO3N;zo6PU&~&7B|fxABXPFGM%02XcXlAE4+xl38SH zTMrk`8=(3XiXA*vn}FVOP<{gIaUh-i_y>(l3T&6(#CBEvSm$zu3FllI9%tnsT^I=u z9mz$^1+y)iisU!RFEn%)lMUryqAk&|q5#QFP@i-6iwhUbR|wWC(x07)ZkcLRl~-|- zE{OsUCSw&X2Z1}IL9vB@tCE@^7QFKQsE=yqnF>d{k)4*j+4BYCEFlN%r5Hzi&Ze9n z>IcIYGcH{hOEufYsi2lw@zx@LpWo}lfXOjTjFhEc0rwLij?4Uw>luf@Mloa}&pbrh z7K4GI^t~o6&D5S}<@hwl$#wzSb7O*LwGhtAmLo{K0%km6L2l(=&_a<|EX-FxS}>RaB9WrhTBRdK}GdT$)XgZebs*CgNh)l}1+M#K8EinM(jlSJ}Fc zfBoBKtU>!eD>>+`4q8VGA}PC$5`JL-l>s8>_5%=*tL93r1(JEX10Rv*?+Fz#NjVQk zXH}su$l~lRIdzlpOC74*C>hszM6FTdu(P?4dEs|wxSz$%WMF<#oSCQDdb|I}0%~QG z`^s+@TN)K?g2ak4%yb|*@L7FNJ!Z9@Sm^=j3kFQ+tKYpadh2`0r!4Q3oexJQv_o%lN zYDXhBat=a<4`y?IZj3P0^qxp{_i3n>DD=%o0PbUY9V$M%0T~J)estHwL)C1$x3X;^ zBcFuj$VWKGE^cz4qK{VF#^fG;y5i5%~w=@VR_n{JcUwu7s z3kfPePxm0=MY(k@^vBg7!ZO?!tljKQ(P^Z2GeKfmAb53zMVrr6Ao{&h)=h}h2tZF` zQ+wju+f{vrf^pPwq3oelH%UjP$uqKxo+Vuz(4F3tZPbT6O141)z9Y+s1LwyJ-A;*| zd8}>q_A)2+x975e+B=0t)4trBbT!+{P6b~#24sldg-^>E6?A(F?|IXqp6wlkFhFE@ zFE43IK7LD);LSNFY{=8Vb&ix#>%y~I;Vp{d02--uT7bU99)+2#2BX` zUlc#rZ+&bN7MU}dEGUU3zkHLMEPqb(fAU?0_yFLg|IK;;pa0x#2ao^+_;Aj#x4-Qu zA-sNF0{}^=5n+ZjF@s8Yv1MUNaEH}{HSaUSG!e_}?c|JT+& z9=82r2Y=Ck%6VZcwWoUuUWhU8Wfa*S7HvQ+gyPIu!vXGuOl@}VT5k~O-A83lZk~^| zQqlpljV$WP3;?K(%sN=Mn1rBv^9S2eN)@d|Pe^)2BKO-en4Nfyc$mp0>_Fsu&H}!s z9694k+e3-v8rY{5SH4)_j31b|_qZOvUvriCX=uh4PB*@*HPkX9d9FU5cy0f?(+*m7 zRO)XO$teu@l|NDxJHg;d#Ubo_Qz*A=$MuWQM9cabU% zeId*8K!lpU`64?z^3rf0@#Mx}r~_O{6UE9okj#PZL)(ux5~*MwMZ7+C_w*eIhs~#H zQ0&w>Udu=&{DMt2ucQjY84twtX0QAdFF%{k^-&(ATE~4K?7VIna4QEeZ}LqCG}&VG zZRXtXKN$q*Epw+$-7xJ_goWpbH(8LUsWebuZQxMfiM=vl(RunX;zZdV+d`wAKEG91 zV2wwi>rwx$SkK9kfI4QNO`A~2mg)hmRN%0#GAh}gn(qPBykCr>rn>0Ie7@m%MK@!? zJ&zb8JhgX|HN2BbU74_e1)Ucm`h#r{{3o_LIqQKCCUKV2Q*Q@cJ>T#-2tKQ_Xkrd$ zdriEl2BV^&FPq|hu?L$f$>4RLLqtDG&1zwA0#RUfte&E8prWllCc-u~YLsxNTbv1H z=gxT3zBk^9_!}kZ%0@ z8_QP=8kq!RIxGn*MFE+-xpi5EfR6GxT;s0qZoyqY>&nlKcvFm{sSry8GRQY42iMr{ zk{*dq`54mpP#BD25l7r%Yb}>h*0Xm|Uk^tS74|x4a|@>4V7U9tY$Z-^q{@BE_<|ql zC0yKbeUqSW??%#&Lw=_D1T zF^!$(>%c@qj3^Q)x(Kd9SX|6=L=EzzyEKq_{U!I%^i59X*)qO<^~@P%oYjUY5!Htf zkZS5*!9;7%PG(AwJv(HCvBp8ZW-6GV=L-ul;km#SBv;jBNkjgD4okp~>N&S~yMS=rX=M4n|eB#I_!8sLfCa@EiwN~>t!FR8`p=`{z4 z=VZk070(}3C@rwy^MG*#Ja##r%x5MzSFx0iRI0Yeu9R0)^|gys`1QM*pANy&BL%QE zQ&K83=3?h+p>bv{_b$6IqoOT!VZS*1@NqNN&M;G$F8Ia?--HuTJFGHoQ~RjVtW{qS z+4IMxZ7>}AVphhRO$XD~rRLmgrbV380POh+BQU*lcBeLQqKp2919Q&I4^r_KzXzj* zMy+kvKY@!ag_q^R$mEIF0T{@tQ5qDB<|D1j=|oayG5+=ks{zxlU)LDuq`ST>E{XtS zq(FQR323!HXlsmLx{We~?xP@InY-#=YooYPp4sh-*91!;bX;BQgvBe40&-@NaWCKX z?Y_uezdN(Nrz~S9NWn0^%XC+HY?);i)GR9l?W^Lr#yms)VOsRe4)met>c0?bPU9nu zvt*iUGVUOgUs22tDkX(|jC(Xd`PWSm3dZSt?WZTT6gkMLg&dU#Pk=b%ZP(<&u~c*=%f_~8Z2t*F&r zd;HuAc1aVwdkVHeR!;Is<@n-PAtUG3zpAPX_bOWfWkD31cP^0y`e^dBjq|!6 z<-0sAf;Kq$Z~Cs#jNH_duw09|5aWwcp)J@M$>TqDlof?2sn94@dlDfbEFktDLuMHU z^L^%c0?}>&fy6Y>%D}_;cjwZz7nab&-4WFm6OxYbDunXT5=S#RH8+R_6GC?$h_ral za$p`#%ub0W+I5iQwnO9SoPy|;=^k8mTJiOB;GsG2mHG(lTT+w)m4iA-(#>dQqh15f zB#>`S_X4)BhCIs5=@5l%i{sAtMh7`w{p3mYF5rR3s^|wU%s3W`!d$|T+3Ne&`q7r2 zm$*4}nB3i3h6T(c6RHCkKab8dv7Hzn{(Oq|H@l|E4JIiS#mN$nlyZI2W!9*#oGw*enG~YC zMxSpQC7>cRzAWBJI;!I((n*>&nTTP&PNRa;nDRsK{Wd0~?AIrf3h?bo zdjefjddf7-BAji;oqG5Cz9_OuyWiej%I$y9Wz~PdW5U4R-LaKbUB^e=#HE|d8_6JJ z=Gh3;my~t2GqKKy&D34=wuNymA}2CSjz$&(qsR1+`&X`SuNa?qg+KY5naCn>QXWJt zlE9l;G5{}4SBM6>0)YsFo@%$XwZ}H^VWe7WuH zFDng!QK*gqCdNigGmzO;F`Tt};~PBes3Roi=}>|N z(N0oiGqPJA>?_>Gf^Y#XL+rm~PL2=XgncO|X{vG8Sn(7EQ7-d|My!de2%Ex3 zMLsNfn<+_HdYp89Sh!#Uquu{25JOzpiHR%-Ca>@wP7d4Oj?<}qd!Z$i2Lr+-)2(yn z20}FBfJl|xa(%ZR)$x~gSQGJO)j2<%CC^@)Id^0;bfmS349`m1u1ueL$@iq}@=qKy3%)WQ9RhD4X*> z5HT2qylGJ}6IW|WR>}sr7kep>c_!`PeiFi2V%MkOZ&DfdjFtNC-kY&tHocOxgp^yB zb-Vj%=E7dqHd3!*%eq=L4CB*w0hrG0p{c0Qp;lq^ zU81)6V6?tV?2}DM()a@Hz?XF^Sr|q4>xrB}QcsgGQ`XPTB5px#j6QeK0-bQ>x+~ox zi+K)G4>UtUIpJ5kmr~&nbj*$g9(#uPgKY?9tDjsxcn==AwPEO0lgu}sr)%UMt(494 zxR@()o8LR&?n@UjdlSW(i_Oh8H9nh*Wk^2Yo;Dr0zdo1S{N$A%uFzm-jjN62;rTQ> zK5C$RgMGQt1%y@OU|@2$N(a`&JX8vagUX*)7~x(tTt)D}5Q(sJ>}Ii^qeC|G9-=i8 zP>II(9jCvoB3BX~S6)0S_Q8`J>kkQta2Mhs__-|zS-CPti!Va>z-b#K0DIvzfs3UF z50L0VxzpvhRX3K$?!?9`{5wlEDWCxtnShA_@G0b=q3=c$F)bAlQ>^5>H>yBaO>L9- z1LzD!7HaZ(?auiRIBInmnkc&6CqLXGse1y*+1y#T=X!`r3!@#9dKKWaHPOa{!m5kw z`zlrKA(5Bl^g`xt=jByDo|>*)iEI)gSIl2cvfb`)=RYTAIxNUSG}H?;zL;i4IIpr6 z6fpY8Yf1fj=vVt;Jle*{Mdr!&35Phkwyvj->HicljZZrf7LRM1XxtKI-BF=mGR&Ok zd{B8a?TM0=fkk5i(MFgA5&jK;-g>Tf9E*KWseR}Bt4-nt=?6>7mz&lHeB^dSS`mxW?o`G^_XXi1WP-vAEqiduqrRsNG)!7Hngt zDMv|=60tvG8Dp6{Wk8}9#gEXr?c_4zp*Ivyz~%Za8r&nqV3z%vkj&nI(RYQiS^B$s ze`yY;)aHw^Ru?KxR1;lH)a^k$Wr38e+Fe)X6b&D0`#QES>VshIyQ9VQ?C;(E*27 zU2LF6$2iSRk!!NE#t95-Fo!jphRrd8@QsVn7S}cI_RS~N<=LRaD+?D|I#kfa(E}+# zq0umN{rqMiW+9GTNTm(CBV@${w_30spxtP((rV%$sJ4R1BH~_ePw=8WJR>KI6@DCwMc}dBU-&Pl+6)%_vt{r)e06VB6*A zYehb?Sf9?$>yYJ6V#U_jDg%-eHyUbUF~~1A+ZaMYUva8=tc_xcMTUx~3)%P(SFHRI zRl)$xGoRG-yHcU3G^OtwLFrS8C&kZ}@REt^R*OYwPk=jA zIffW?vC`uMS3lO&VQ1>SSlnh|JPj&^N=a_gL>d{=8V7gyARtgK40nqyu?EiuM1>Mu-!23`chVK zM6B4J0Y1sH#iA8wqI|Q;3Pk_@_-m0Plj@~t?Py9vKC9t)WVedZoo3r5)qBLj?z0u@ z;8}p3*StuQeFoiaKO+4y3&DM=o4)ajXdG~q#AgJ$I0p)6rcUR?(h(E1`{uMILhmaCMcp`pLRGPjYVX8uy@w<%XE z_sC^AY+{S|>nTmAQ_oH55*koZ&6iOxpyNEpa;>ECZer$@Y$(&UwxoK9?eiY)x)N*SG zAuwyNgsEUt-5|{mnH6zbv>AVs`I6yAFaTM6rAo3_AHrV~94w8;JxuehoV9f=stq#(LUdsDWX`_$4V|Rc6h-}4ake+6 z*^6t-VE0eOuO?H`5UYWPT<%ZXp&Z|W2@LiF=nQh;Fd3*1h?GzOV^Wym561|eYC#ay z(>b`)w(=V(X^F>6wpdqD+G#)VKDHGSqkteN+lV`QQY^+QwVVdplqG4ChZm49G4W0+ zw`NUkfdgL7d56kslSqzV>LV-1kZPSvRr=%2>AAmX+(&TeU1JJB5(HVSTqJ$8y=B?! z(!=4VlJxn>F@?9iIH^|!D$8!2W^B{BY({o~sNo;yD@3>$E6U&0l%?vcTP$wmFNcDc z8cyF2yU!~(p2XKn6AmTuaS@IG?kcd+l%g~vZ2tlt2bi$O;A348`&oNFE`~3f6+PwS#nf?t*mJgLf7i=! zI!R?87YVHXS(?82^=x2J(h$R?gfRy@Bg(niT%9yN!<2Ft7fLPro*aY z-1A{2>B1;rVqlFLM&jAqfnq&wyS1Y}rfgVU-gMFYJ{q=PdOf zG%sg|qMHQAhba($+f8K@vwIzB+j&}N3UIdJA+bp-(TcsKO#b+9)Nop+Y53Uc-ZMuh~*d~^0^~@>>>sm>+ z_-ERxI$?2#8}~|-$#{^A<|iZ$AOR&^EpivFZj*X5^nn8%cjs`%g;1559NpIJ4I@lV zPZkP34OqeIwr28ljkBDU!bn=9mTTPY6W(^=9%SJj%V3 zogl1sBRNegjKodlYZRYUgh(&oS7@kVIN}wX<`2moKf0W|vC(Bs$y(3aCmqB9;W;L} zs{SpR5H^~+2oi$Q4LJN|q>5OklV9+FALWFdwi5zlQjQ!nA{9vTOy>g&yQzBdXea)% zKiAlJH%~aS$AiSw=D`wfb_q5Qf zra>EAUQz7!OSnt{LuUp{Syrdhf|qFtGdM_*+@^mh#V|t!FY^#%S!j5qTDX3Am-A^q z3HekL^izcgD1nGkz6MqKdGXvhxa^3Q*)GYi1sW^!%kT97l{-5~AZU0AMJDSJC|~0pb0aM`9Oe(lUeFkTrkxQ~e-Tg)dfy*pt~dQ#Ipd)6Q6s8yZ9?-$^&u z@Rw_NQhWEA34zjY4rAbixkL+d&@%TwgbQqOskELCi%0HBxS56=ZJ%M}i3XvT!NdyI zU%gjCMZ+mylM4cwD@-x9vTwA)YBZ5kC+6_L{xE$oms$YO;s*Tlh?RlAj`NZC)l7Wr zEl!l8B3WU=<-6}36hXoS%-)I<`~;tA$Dh_n{-? zU*=gs59Y~pe+^g_zW5BA0@yp!I&-Q5>*M>E&>6f^Qw@n~QTyUCL}{&Ixs>6)Jac=C zp?-^qH~xyI0v%C&kSiEaBvd=M((1~^eN(L@9g0eZIC-k6`B-VOtRsTfyYDYorl5gA zN*24u3=TSwiO#E9Xy3*E`(_Z#$v`9dF<`cN{hA|&_xm#mOMM=MIpk(3Dp|N zAU3&wL;u6lJ)#gvjAtJV7-&6Gt{JC^ZBakSe`?q}cF!`mU0Y^YKp5fd*TYA`+S+(G zZ|;=!GwDH0>Qd&%P8^&0O93;IQP7{;bH8^w>R9H_h1Kqls%XXNh;shPQ{8rvu_plY z3~%W4}HWB1i66=8z9WYm-Jw5{nTTF!VP49)ta~Dcpm`JOa(OG zts+en9IqGMipv&$pJmdyNf{%cQ!+_6aL0?a7`w1DY&8M;rD-ldG1>hd#KklYs|Z9m zf8aK@=L!DdSR-da+Nll!)YJ92-ewbuSG3>g)PNzB(GQs8bhro$NplL2UY0IcY>gS4 zUfNNx?qfjv`=*|Nca7Pnw*yz$`|I!WV>^HM+SEYk>d(Ygq`Tp4?3sMLM1N)9I?b4SaJ)azG?kMDf_v+-m%J5stj|Og~Xz$Qo?*PxT6dc{36HdJV z)IM?C{*ykE1sjF^-R+593)G1p{=K-M%EVJg6~%ht>_U_mJ$gus<_h!ezkk_%qO3NMDaeW{A?Y`ddBpCmNsZ z$Qu1>Pz1w!PFmIKerO${2e5ZhU~QYHa}|Gb(#h@!g$wJw|9p`V*JODg+56-3^Ac+j zgw29tgXH4r9{MFI^O8oD zUm;7n1!fw|b;DFZ@{O+e#%n$Rn|V0Vvxe017e> zO*UuqR8}FGIx~$zQwyc;1piej6!mK*(}imK4wo>2t*b7dg$>vl8a>aBMat=?R_d{w z#1Y$@4=J6pWuTtm4?Ujq?PlJ3iG3Ed)<57? z+`~*;h|ebGpRcbHvwz`RbaL~)HbS1!z4QdPy5*z%yrJqdzWUW>^NdHlyvnLjuWY0V zVv$l259j z-lC3V*)h%k^tX z>J}^XY?ou@ainhe_Gq6SZgsIc_+^OVK?h^+a$M?Yu_?sl8Y7^v=F>**Eq3tntb{}h zA~zJ}@SwBdlMH{-k7*DDQN2ZCY{Ph})aKSSeYfyw!~SmV)oeDy-O$18SsMogG7KQCW+SU03@ zkDJ&7f}?hgUA$-(#pw;?*c{0=vHx20&@2k(Ynnj{c_%PzWfe!C5cbYMA? z+6K4YEe%)NQjR}6=Me&>eoShqHxe=MuK%jyxf$MH!0{&h`NF832Oc6>=+#Nu`ZLFz zFnDRbzHcE%GA^8$&PT>35-nsJ#KO_nWA@ z5O0c|62C;*hW}7a%HK6?*{E}Sa9GtR-!Q5OcqZT70~rAYrfJg~+o|b&NH8kJ!V#xe zO5Do^b1B+C0Ldvf`zh*0$m>hj#%g*qaeo0Zc)!+;(VGp1mQCQm1EY+(>ai}{1-;RV z8L0OW*BSN$R5pCA9t0i_iJLczo!ydS>g*rKQ*62Rv3m$^ zEw^0)H+_z7uvmCYdI!iQ55uw`oJ{2FDti6r`>^c^SEmeNd5p| zh9JVy6i-nvALB{woOxlNltZjo(51@>?0Z`i1Zb7k5NWwuq*U{*DTZ(dJZ8Lk|L(Xn zPBA_@<{I`gBG28NQFkK2YDDz@i0qvrGO@;Qrl%iz&5R*%Ju zwN`5zDsN#-;-SPpLC0qBFU{doNdhfp-jf095hk0z%?HJ}(qUnqh-(IP*yBw)G!_md z2N#aKVZgj8A7Wtqwp^wDg5am8%dd;YX^m~Pw8w+l{Jk+4Pw^q4+fg$ zfcU7juQ0*Xkavfm*bLLUo-^;b<6&A~Mr}ttZ&xfvz#wZH$jG}1YTPj_x@jh6NdP8t zd2pR<3q>idNlHQtyFf`_2m(5(>VJv?V0xO*Nluz5@#?Ovqn+Td%R__gG-w(T*?PpL z$Y7XAVA0?@a}YTN5xPI~fbw@_sSKZ*x%`g+4DXZ_m}0F8An-nqKeR!7s{Qt?*N`TS z>s8~F#9k2pDo99RZ#YCPl+p6a$$qHO2d6mA7mGBJ8n6Pu%V?(s|9hG@N9Gtb8rt<} zeXwq3A`K|%GhsB6Vff2tr%RvQN5SDAvqU6MxC>RiIb19)X-f5*bHs1GC(v|BvQa2! z6?`YPi6G2bzG)NN=Hb4vs&hq|nHS^5<2%6Vl<&0nW(V=eEXF?d994I}M(8rqXeT4N zfyN5v?g-37Ew7Og22C8es30mMlRmq>PST&=^`@&`GL<~rB{N}}ub*u`0PpIw;SFAp zSr%{hf^I@;M|$Emkl*?yk0uxR(*4TjS1JxpuzoUhux$Nw+I_`m(+&E<+s2$m}c>F>GyYH+tJ2T-shJO0b zl8`JED&iwsME?eiynKdp6q#h^5IL%qND^SuAVvdE!qD`U8<22l`SBlirYg;&+3L9e z6G#RevqazW|qb6!vVecmRur+~snt5FSHO+Fu>5r@>6~^G623n@BdE0JhNZ3?kW8}wDv<*&q(4h0xSkubF z$>6}(kmxrpGZ*qkcl*5=D^$OKu>JgB&yzF>GE0}iYQ>_e#QMBop=B7A!I{ISKd*O} z20)WN>=sUPCzG0P)GhU3;hJ4*9>co60!UO`XbT!&E|j{4d_yRBw5DQj<_lJm_Eaeo zO7gClA=78EYbw2V|ACPQFrT4pJVmlHGvJHoF+L4eNyH_)-$x+66LN_K*thDlyo9J| z_$1{ne0mta=mS3dTy1bYV2jG3N!NoV*hnJ1XM^Rke3lsunU_q#(k#1U+Z#lE=Ms(( zP%mU5sC|v^64vHf4I+d==n|DF_g3mKFcVnh6Xm+nwJ6QK5FEEcl1t<{J1iyXAttqnj3LwzHnS+AZ*?An zX*g97Jq9gQ%H2+(I46py7qzLK5N?O|B0x#|G0*};9A*Q>ta!y+%AvEBUm2I0DK<8u z{>bAHY4$oY3uI5#xw{(*0ct**7_>wIa@mPO>hC9BM|4YX2kkk$q2eTkqc@fLvBR0@ zA72Ln1igztI>T8xtp9lp(RwYaYuBSto|9PRC1_SWxH_5z?hWxDKMz!gkDPT0O?5(UFjOYloD1(I%q{gCn?Yd>9I4 z>1ik;h7#6XUM6pUrQw?ICKIOW5#sr^;5Bp*zOKp@D=~CMDLAJocuba3^ zJ9>5rV3UDcy*KCasbM`1u!|J=g7&ZaR0~d>hETm3Js*b}M0?dI={U>%dytUSOJvDQ z__i3RmOrFCu;{kERqGuMtjsG-g)6(7hC06;xk9b@VLn-oLMahg-dU6l+%5}%_W^9T zZsix?Qst@KJe*Qqt4Ae6RcoX=z`Uv`k#5!|scC=X>1$maIx-fZYXB7dvu@4Pj7ElX zHwm_jQEdydiS3KRkVj4Ph&fQT9^N=LLgUy;#I9iDlx`nn8dw-Kf7wM`*)YUF!Se0# zUeOuzj!etGn1W!?WpQ{CbT$j`;`wLV?yCyp75luqYn0xa*;ppI?wd${DyMwBFFgx} z2wZcHjk5nm@7zEhDD)K@snTN%yki0G{=q<-3!oWzY{>JuRn*|^LXx^oz#TTZqB$%> z{`CzGPx;csgmFmnzDrPqYJ%YQ>DpsY!?{x3IUa2wEfDpx+#IXQqpLqG$wg*#HPO@c zpsi-^yp#z>2>Q#?3*~s@VZHqzABF}Gk?nS6x8}L`fo&@I20g-k538;sJ-iJ=BTbRT zx*i^F&$#ar-TNrp{<_Bdz9Dy4~s-UkTZ*%}X_f8q^PBrrgOOU8%Ew zDf#s#{9DW}2|f(oVvv0P2DI4^zkCeF;ZEXjTwusNf`RBJXjE;>tJba8d#v3;z_FR;g8z2+sg3ja( z-O%i-V`r#}^H*!oWY_q|ldr2}1TC%1r?b@TPI8fS z=Ejdup2Ust@RE>wSx9QP2&4f{9ODpqv6u1{50F5lOb4d?rhWm;413EU{q5gVdHET@ zM62v+jW3b&W)abDL3bP1Fs;V&k);hqfEhuo$4`L3ia=Az=s0KY{rV(b@ZmqEB1%T4 z(hGS-7Ttu9x^)WTQ@!sBrw&ctphlVc*7iuSC3g-L;YFlUrE8w$k;WT_;gn7IELg|2 zBPqNWyMXRNv{lVWZ;b)9v#S>Dzm9U=jEg-)1i_nb0t(s4Jz4@=w4RgqWDUf>#)y8hfw&qM zYCN&iaq@Qw!v9(6>to!%ZSL%Z64H+N2ZEa#i3m-8gA$_YI>eAA7W038w~VCq00Fb6 zFSz6*C#lS^oZxCcBDdCST0oBLEF-@TNL zHM}2wVAH5+Gv++SbWJjrDRW}!SF!?oaJ>1eY&6^J%5d!l15rD$e9mdp#NPX4VXOlOIFFhzDMJOSw&kAbM9ij5)cc5YL5v^O+9`pcf4j!QU zzH>n9m-)E4lL$CSs2P^4Y3B%3MzMmMm?CwTJ#Zb4COj&)03I)ls#D&wluJv~jsq!xBt;Ki040=#%Ze&NH+UE3 zn{MuSH78XZPv2NCoU**e5e6q4g6rm*5IIJ37n%_$re(^=)lYGM@X@Q>^!s`*< zyxuKarq-vm=wE){`Wl`gKGve;q+zPDVli8x|-4fVx> zT1%cFSS&0AdoP2)>r{nqu#gA?^9KI+KDi}5Q-mC&`ZmL@p? zBxFxVf6!$p(whb=YkP_yLi^s|sB}^X)4S$rUz6MT{POzw7R8qnCpRYX(2MHPBP92z>vp*wh04AqHIB5gSRRQJhV2sthkajoEc$9Yk#6%nq{-fGjXw%kS+ef6KW)ZU8>B||_<8YEN$G=l+yFT~l^OBVh%?qUkP$Z3wqMX#MqbGu8P)&Ks>*Yrgc)Xmb%)$MjDyBPG1**-w*wAKOQR)87~}Ns{f&SXG=4L2tT>#BM@AjYZ2=`=5 z^3FfDmV_{_KCS?Wa!ejdkV0@kn&cVBeEm}{2>$|>uqSy;goaUaYtUGFS<_>&qA8PN z>fr)yz74bTOcOeZ(X77e@Q@3N_2OQO#oV)>au$o_j>uow!P&e3z7=0{!(17E$&C1` z^SWa+3w9du;CRGZkl&T=Tt1-TxNnXCyz3m@I*shHd!bakS-Uxi(u_-P&pR9?8+BoG zK8`3>HOrtEf(6)}VG>Oi1@K1FU-Imi38B!;DY*f;u#Oi&nGSN4o#WJs5WMYoV!Ms! zw@f<$W%(feB4Hun=S*3JT0f+yunRh}2FpeRl&gyW^fsLY3BK^=D^=DsdRb7YWaOqB zF}S!N!qA^?%$=a@K8t?B>*9Q# zM|0PBdE)6gX`hSMb&V7`9&R5dK{o+tg__6yR)F%sh&%m1jEVKOoQie&3sN7A8nJP< z@MHx=wOWw+zBTvh_3D3=uC)3L`40QkD&AvPu%wDL>ZoYZ!YrwfwjITY3-I(ys$eEb z0qBV}BS%{?7~=?zGEbb|71f8+79)H;yo|H2d-x>k@ymkA#lXSdF2d8bfJ~vL-Ff9M=JZ-%~wGh?Z_W*j15g8YhNl z5=@LF@Ugs{Mn{==DhqWePP8d}iXd4gk3(3d>(wsxdXf9U8n`h6K=|}dwY}+4j09Gz z#CDKNStlj_FN>H$RcVcp_+YR5-eTHJldYX>Ah0$Rv%G~0O?+U*b08@fkXo^)P zgs5=l+;6-SnlP)-0}v^iXn^y7?89#{TIjLXdUCNPrl2SZ|Z_@dRtJmF2g?hq9PIv3%8Nx9(3G+-BrKEDdE2f!a zo8P2#b7nQB2&5W7%HwfOAC?NJ3kd|h@2L#elqA&fE)tGWb6J^r3^S1}zcVMpBv#FZ zV#G+_(ba)Sud9Lh)O{&lIPz2kMVHH^e^fAw=7Of4vz^yy9q$!XS=Ev#h1}s=~F02zmdV87cAgkSswAA{4 zXqWOp(3p518XRTPKI>}Zk_RHX6ky+xiKlQGz-zXRRSLE`X}~~7*J?D)U8NXvs0N+; zUVpN#g!uu4i2PE7Tu`G~G$EU&$M7~H@fm#xYY6;k zOM@gVa-0GG5|GwFI|Vu#;9@D@_8@t@iuD)V3k2`V;{O|#;c7I0OS}DnMSecn+JSyM zS!}@t0Bn{tf{B3czpp`D7P_+-0#xBZ^jH5#fxQxD4fy}wsBz6i;n3;rimb6w0ay6d3ec{^cdJX*$1_QO<%{hSy+f~EA?U0$ zZEL=!z9)wCrzzB~q9G7MVmi<8di3lX?yZ+i+ zeiZ!^R7kMDT6=Y#Syw2X=>JXEcn7l1{xv|_kCv{{6ITTVq`$)`2~NpXarIwGA}!>` zP$CQflDZ8aH0xdGOBwo^*U7ob#?5g4E%s&Fy(##Ia*9vybypP;nLmDl;gzCSWP;*~ z^2p&fK;;1LRSkP07Qi4ES_5l59j?9S7KS&nuY?8$02c*zM?qEN!)Jm;|9ZjBd_Dh* z;LhM}Uj$X-ngILMdh8im#d$6l#;o5dOQ75jalulR*5B$)X=j!Tw?|)p^VC*gS%8?a zd;gDJZo$Wj-ovRGQfc&C#$7_7sN7wH_F#G**9R-+Eo zoBXqzF*{M6G7XVOcA8CW! zV@8>wckJWeN=~HHrAOHX$fX6z9NCBns27qWY0|3Z}LRqA?!U9Bi zrq}$P<+k<4sDRF)(C}2DD}*kg!Pb7i zXz;BygR|Rh&F$dL-f~_ph}5tf{0|67MQ#HOKh#jEQY8)#bNLiHFRl5NA`^$!e8NC? z)d%Gjv8d|WH*v$CwHd?L-R3*xym}PNmMDVUSTrc($i1B-?K}92btzo6F2jLm8>1uR zFR1bI2OfU0^P|TK?ctkz6k5(EH$$}wxE%Q>RUOEpR2)xgB@L$JX?yJI!3=mqn&Z{_ zYUo)}S$0*SY|A5O(yO{HjnIEC>Gvs0bk>Ia9OB^D%mVkf4~apJg9wCdw`V&ClaWH- zhDpr5bJ(^CxE3D@*P39a&L8+`cIqkxNupwn^UyB|u3dKNIrbxSI(zzS4Z;!2q{F+J z3(HW$Cs&$lRN41)1!Zz>=BVQ+)GAx8X_%?OBu5LWK}En`5`fX}82jE=Lt5|);?u!N z&qpIBSa*d9`Qv2&*c|~PspbNwwcfsAwN@6Da8-3J9S|0OxZGuzU2iN|wqI?_$&zbg z=neMaiR7{T23 z3nv*BLe2}NV}-GK?%BffKfbeByxgIBQ1Cze*~Z%6FVEl@P8P}gfh7dCrPcNSCHQ?_ z+k&&;M@H>5ah<&atFqV-ysdJiqigD1xim$=mZKv>!p+wwkrxDg

(<+JTUxujzA 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 diff --git a/data/assets/examples/video/videoglobe.asset b/data/assets/examples/video/videoglobe.asset deleted file mode 100644 index 312fd6fac9..0000000000 --- a/data/assets/examples/video/videoglobe.asset +++ /dev/null @@ -1,35 +0,0 @@ --- 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") - - - -local Layer = { - Name = "Globe Video Loop Example", - Identifier = "GlobeVideoLoopExample", - Enabled = true, - Type = "VideoTileProvider", - Video = asset.resource("examplevideo.mp4"), -} - - -asset.onInitialize(function() - openspace.globebrowsing.addLayer(earth.Earth.Identifier, "ColorLayers", Layer) -end) - -asset.onDeinitialize(function() - openspace.globebrowsing.deleteLayer(earth.Earth.Identifier, "ColorLayers", Layer) -end) - -asset.export("layer", Layer) - - - -asset.meta = { - Name = "Video Player on Globe Example", - 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 deleted file mode 100644 index 34f136bbd1..0000000000 --- a/data/assets/examples/video/videoplane.asset +++ /dev/null @@ -1,48 +0,0 @@ --- 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") - - - -local Plane = { - Identifier = "VideoPlaneExample", - Parent = transforms.EarthCenter.Identifier, - Transform = { - Translation = { - Type = "StaticTranslation", - Position = { 0.0, -11E7, 0.0 } - } - }, - Renderable = { - Type = "RenderableVideoPlane", - MirrorBackside = true, - Size = 3E7, - Video = asset.resource("examplevideo.mp4"), - }, - GUI = { - Name = "Video Plane Example", - Path = "/Other/Planes" - } -} - - -asset.onInitialize(function() - openspace.addSceneGraphNode(Plane) -end) - -asset.onDeinitialize(function() - openspace.removeSceneGraphNode(Plane) -end) - -asset.export(Plane) - - - -asset.meta = { - Name = "Video Plane Example", - 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 deleted file mode 100644 index 6fc11ec55c..0000000000 --- a/data/assets/examples/video/videoscreenspace.asset +++ /dev/null @@ -1,30 +0,0 @@ --- To learn how you can include your own video, see the wiki --- http://wiki.openspaceproject.com/docs/builders/assets/resources.html - -local ScreenSpace = { - Identifier = "ScreenSpaceVideoExample", - Type = "ScreenSpaceVideo", - Name = "Screen Space Video Example", - Video = asset.resource("examplevideo.mp4") -} - - -asset.onInitialize(function() - openspace.addScreenSpaceRenderable(ScreenSpace) -end) - -asset.onDeinitialize(function() - openspace.removeScreenSpaceRenderable(ScreenSpace) -end) - -asset.export(ScreenSpace) - - - -asset.meta = { - Name = "ScreenSpace Video Example", - 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 deleted file mode 100644 index 2e658633d8..0000000000 --- a/data/assets/examples/video/videosphere.asset +++ /dev/null @@ -1,38 +0,0 @@ --- To learn how you can include your own video, see the wiki --- http://wiki.openspaceproject.com/docs/builders/assets/resources.html - -local Sphere = { - Identifier = "ExampleVideoOnSphere", - Renderable = { - Type = "RenderableVideoSphere", - Size = 100.0, - Segments = 80, - Video = asset.resource("examplevideo.mp4"), - Orientation = "Both" - }, - GUI = { - Name = "Video Sphere Example", - Path = "/Other/Spheres" - } -} - - -asset.onInitialize(function() - openspace.addSceneGraphNode(Sphere) -end) - -asset.onDeinitialize(function() - openspace.removeSceneGraphNode(Sphere) -end) - -asset.export(Sphere) - - - -asset.meta = { - Name = "Video Player on Sphere Example", - 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/examples/video/videostretchedtotime.asset b/data/assets/examples/video/videostretchedtotime.asset deleted file mode 100644 index 0d7a792466..0000000000 --- a/data/assets/examples/video/videostretchedtotime.asset +++ /dev/null @@ -1,39 +0,0 @@ --- 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") - - - -local Layer = { - Name = "Stretched Video Example", - Identifier = "StretchedVideoExample", - Type = "VideoTileProvider", - Video = asset.resource("examplevideo.mp4"), - StartTime = "2023 01 29 20:00:00", - EndTime = "2023 01 29 21:00:00", - PlaybackMode = "MapToSimulationTime", - Enabled = asset.enabled, - Description = [[Video mapped to the simulation time in OpenSpace]] -} - - -asset.onInitialize(function() - openspace.globebrowsing.addLayer(earth.Earth.Identifier, "ColorLayers", Layer) -end) - -asset.onDeinitialize(function() - openspace.globebrowsing.deleteLayer(earth.Earth.Identifier, "ColorLayers", Layer) -end) - -asset.export(Layer) - - - -asset.meta = { - Name = "Stretched Video Example", - Description = "This is a video mapped to the simulation time in OpenSpace.", - Author = "OpenSpace Team", - URL = "https://openspaceproject.com", - License = "MIT" -} diff --git a/modules/base/rendering/renderableplane.cpp b/modules/base/rendering/renderableplane.cpp index c3e5afe326..0b7731e4a8 100644 --- a/modules/base/rendering/renderableplane.cpp +++ b/modules/base/rendering/renderableplane.cpp @@ -169,7 +169,7 @@ namespace { std::optional mirrorBackside; // [[codegen::verbatim(SizeInfo.description)]] - std::variant size; + std::optional> size; // [[codegen::verbatim(AutoScaleInfo.description)]] std::optional autoScale; @@ -257,11 +257,13 @@ RenderablePlane::RenderablePlane(const ghoul::Dictionary& dictionary) }); addProperty(Fadeable::_opacity); - if (std::holds_alternative(p.size)) { - _size = glm::vec2(std::get(p.size)); - } - else { - _size = std::get(p.size); + if (p.size.has_value()) { + if (std::holds_alternative(*p.size)) { + _size = glm::vec2(std::get(*p.size)); + } + else { + _size = std::get(*p.size); + } } _size.setExponent(15.f); _size.onChange([this]() { _planeIsDirty = true; }); diff --git a/modules/base/rendering/renderableplaneimagelocal.cpp b/modules/base/rendering/renderableplaneimagelocal.cpp index e888be7d61..02a95c8ba9 100644 --- a/modules/base/rendering/renderableplaneimagelocal.cpp +++ b/modules/base/rendering/renderableplaneimagelocal.cpp @@ -45,7 +45,7 @@ namespace { openspace::properties::Property::Visibility::User }; - // A RenderablePlaneImageLocal creates a textured 3D plane, where the texture is + // A `RenderablePlaneImageLocal` creates a textured 3D plane, where the texture is // provided by a local file on disk. struct [[codegen::Dictionary(RenderablePlaneImageLocal)]] Parameters { // [[codegen::verbatim(TextureInfo.description)]] diff --git a/modules/base/rendering/renderableplaneimageonline.cpp b/modules/base/rendering/renderableplaneimageonline.cpp index 3f2a3ba048..9f119d78e7 100644 --- a/modules/base/rendering/renderableplaneimageonline.cpp +++ b/modules/base/rendering/renderableplaneimageonline.cpp @@ -43,7 +43,7 @@ namespace { openspace::properties::Property::Visibility::User }; - // A RenderablePlaneImageOnline creates a textured 3D plane, where the texture image + // A `RenderablePlaneImageOnline` creates a textured 3D plane, where the texture image // is loaded from the internet though a web URL. struct [[codegen::Dictionary(RenderablePlaneImageOnline)]] Parameters { // [[codegen::verbatim(TextureInfo.description)]] diff --git a/modules/video/src/renderablevideoplane.cpp b/modules/video/src/renderablevideoplane.cpp index 43f9b73928..41253149ab 100644 --- a/modules/video/src/renderablevideoplane.cpp +++ b/modules/video/src/renderablevideoplane.cpp @@ -27,12 +27,27 @@ #include #include +namespace { + // This `Renderable` creates a textured 3D plane where the texture is a video. + // + // The video can either be played back based on a given simulation time + // (`PlaybackMode` MapToSimulationTime) or through the user interface (for + // `PlaybackMode` RealTimeLoop). It is also possible to control whether the video + // should loop or just be played once. + // + // Note that, unless playback is mapped to simulation time, the video must be started + // manually via the user interface. + struct [[codegen::Dictionary(RenderableVideoPlane)]] Parameters {}; +#include "renderablevideoplane_codegen.cpp" +} // namespace + namespace openspace { documentation::Documentation RenderableVideoPlane::Documentation() { - documentation::Documentation doc = RenderablePlane::Documentation(); - doc.name = "RenderableVideoPlane"; - doc.id = "video_renderablevideoplane"; + documentation::Documentation doc = codegen::doc( + "video_renderablevideoplane", + RenderablePlane::Documentation() + ); documentation::Documentation vp = VideoPlayer::Documentation(); doc.entries.insert(doc.entries.end(), vp.entries.begin(), vp.entries.end()); diff --git a/modules/video/src/renderablevideosphere.cpp b/modules/video/src/renderablevideosphere.cpp index e17b0fcc76..494696f5c5 100644 --- a/modules/video/src/renderablevideosphere.cpp +++ b/modules/video/src/renderablevideosphere.cpp @@ -28,12 +28,27 @@ #include #include +namespace { + // This `Renderable` creates a textured 3D sphere where the texture is a video. + // + // The video can either be played back based on a given simulation time + // (`PlaybackMode` MapToSimulationTime) or through the user interface (for + // `PlaybackMode` RealTimeLoop). It is also possible to control whether the video + // should loop or just be played once. + // + // Note that, unless playback is mapped to simulation time, the video must be started + // manually via the user interface. + struct [[codegen::Dictionary(RenderableVideoSphere)]] Parameters {}; +#include "renderablevideosphere_codegen.cpp" +} // namespace + namespace openspace { documentation::Documentation RenderableVideoSphere::Documentation() { - documentation::Documentation doc = RenderableSphere::Documentation(); - doc.name = "RenderableVideoSphere"; - doc.id = "video_renderablevideosphere"; + documentation::Documentation doc = codegen::doc( + "video_renderablevideosphere", + RenderableSphere::Documentation() + ); documentation::Documentation vp = VideoPlayer::Documentation(); doc.entries.insert(doc.entries.end(), vp.entries.begin(), vp.entries.end()); diff --git a/modules/video/src/screenspacevideo.cpp b/modules/video/src/screenspacevideo.cpp index 4d82891416..6c86638a55 100644 --- a/modules/video/src/screenspacevideo.cpp +++ b/modules/video/src/screenspacevideo.cpp @@ -35,12 +35,28 @@ #include #include +namespace { + // This `ScreenSpaceRenderable` can be used to render a video in front of the camera. + // + // The video can either be played back based on a given simulation time + // (`PlaybackMode` MapToSimulationTime) or through the user interface (for + // `PlaybackMode` RealTimeLoop). It is also possible to control whether the video + // should loop or just be played once. + // + // Note that, unless playback is mapped to simulation time, the video must be started + // manually via the user interface. + struct [[codegen::Dictionary(ScreenSpaceVideo)]] Parameters {}; +#include "screenspacevideo_codegen.cpp" +} // namespace + namespace openspace { documentation::Documentation ScreenSpaceVideo::Documentation() { - documentation::Documentation doc = VideoPlayer::Documentation(); - doc.name = "ScreenSpaceVideo"; - doc.id = "video_screenspacevideo"; + documentation::Documentation doc = codegen::doc("video_screenspacevideo"); + + documentation::Documentation vp = VideoPlayer::Documentation(); + doc.entries.insert(doc.entries.end(), vp.entries.begin(), vp.entries.end()); + return doc; } diff --git a/modules/video/src/videoplayer.cpp b/modules/video/src/videoplayer.cpp index 3c334345a8..f4c83fdc26 100644 --- a/modules/video/src/videoplayer.cpp +++ b/modules/video/src/videoplayer.cpp @@ -74,7 +74,7 @@ namespace { constexpr openspace::properties::Property::PropertyInfo AudioInfo = { "PlayAudio", "Play audio", - "Play audio." + "Decides whether to play audio when playing back the video." }; constexpr openspace::properties::Property::PropertyInfo StartTimeInfo = { @@ -133,8 +133,9 @@ namespace { RealTimeLoop }; - // The mode of how the video should be played back. - // Default is video is played back according to the set start and end times. + // The mode of how the video is played back. The Default is `RealTimeLoop`, + // which means that the video is played in realtime using the `Play` command + // in the user interface. std::optional playbackMode; }; #include "videoplayer_codegen.cpp" @@ -235,7 +236,7 @@ documentation::Documentation VideoPlayer::Documentation() { } VideoPlayer::VideoPlayer(const ghoul::Dictionary& dictionary) - : PropertyOwner({ "VideoPlayer" }) + : PropertyOwner({ "VideoPlayer", "Video Player"}) , _play(PlayInfo) , _pause(PauseInfo) , _goToStart(GoToStartInfo) diff --git a/modules/video/src/videotileprovider.cpp b/modules/video/src/videotileprovider.cpp index 4254c030ff..21e29bb654 100644 --- a/modules/video/src/videotileprovider.cpp +++ b/modules/video/src/videotileprovider.cpp @@ -38,14 +38,30 @@ namespace { constexpr std::string_view _loggerCat = "VideoTileProvider"; + + // This `TileProvider` can be used to render a video on the globe. + // + // The video can either be played back based on a given simulation time + // (`PlaybackMode` MapToSimulationTime) or through the user interface (for + // `PlaybackMode` RealTimeLoop). It is also possible to control whether the video + // should loop or just be played once. + // + // Note that, unless playback is mapped to simulation time, the video must be started + // manually via the user interface. + struct [[codegen::Dictionary(VideoTileProvider)]] Parameters {}; +#include "videotileprovider_codegen.cpp" } // namespace namespace openspace::globebrowsing { documentation::Documentation VideoTileProvider::Documentation() { - documentation::Documentation doc = VideoPlayer::Documentation(); - doc.name = "VideoTileProvider"; - doc.id = "video_videotileprovider"; + documentation::Documentation doc = codegen::doc( + "video_videotileprovider" + ); + + documentation::Documentation vp = VideoPlayer::Documentation(); + doc.entries.insert(doc.entries.end(), vp.entries.begin(), vp.entries.end()); + return doc; } From dfbc1f50904abea05b9c7c8a182125ad90e0ae35 Mon Sep 17 00:00:00 2001 From: Andreas Engberg <48772850+engbergandreas@users.noreply.github.com> Date: Mon, 1 Dec 2025 11:14:41 +0100 Subject: [PATCH 18/43] Issue/591 add assets file browsing (#3798) * create download event topic wip * Make topic connection thread safe & rate limit downloadeventtopic data to reduce traffic * add LDEBUG and LERROR on donwload start/finish/failed * Add new AssetLoadingEvent event * fix pr comments --- data/web/default_ui_panels.json | 6 ++ include/openspace/engine/globals.h | 2 + include/openspace/events/event.h | 31 +++++-- include/openspace/scene/asset.h | 8 ++ include/openspace/util/downloadeventengine.h | 72 +++++++++++++++ modules/server/CMakeLists.txt | 2 + modules/server/include/connection.h | 4 +- .../include/topics/downloadeventtopic.h | 49 ++++++++++ modules/server/src/connection.cpp | 3 + .../server/src/topics/downloadeventtopic.cpp | 90 +++++++++++++++++++ modules/sync/syncs/httpsynchronization.cpp | 56 ++++++++++-- modules/sync/syncs/urlsynchronization.cpp | 34 +++++++ src/CMakeLists.txt | 2 + src/engine/globals.cpp | 17 ++++ src/events/event.cpp | 50 +++++++++-- src/rendering/luaconsole.cpp | 12 +-- src/scene/asset.cpp | 21 +++++ src/scene/assetmanager.cpp | 24 ++--- src/scene/assetmanager_lua.inl | 15 ++++ src/util/downloadeventengine.cpp | 62 +++++++++++++ 20 files changed, 515 insertions(+), 45 deletions(-) create mode 100644 include/openspace/util/downloadeventengine.h create mode 100644 modules/server/include/topics/downloadeventtopic.h create mode 100644 modules/server/src/topics/downloadeventtopic.cpp create mode 100644 src/util/downloadeventengine.cpp diff --git a/data/web/default_ui_panels.json b/data/web/default_ui_panels.json index e964e1f23d..8721e18de1 100644 --- a/data/web/default_ui_panels.json +++ b/data/web/default_ui_panels.json @@ -102,6 +102,12 @@ "isOpen": false }, "17": { + "id": "assetsFolderPanel", + "visible": false, + "name": "Assets", + "isOpen": false + }, + "18": { "id": "devPanel", "visible": false, "name": "Dev Panel", diff --git a/include/openspace/engine/globals.h b/include/openspace/engine/globals.h index c85039cf88..380165f991 100644 --- a/include/openspace/engine/globals.h +++ b/include/openspace/engine/globals.h @@ -35,6 +35,7 @@ namespace openspace { struct Configuration; class Dashboard; class DeferredcasterManager; +class DownloadEventEngine; class DownloadManager; class EventEngine; class LuaConsole; @@ -72,6 +73,7 @@ namespace global { inline ghoul::fontrendering::FontManager* fontManager; inline Dashboard* dashboard; inline DeferredcasterManager* deferredcasterManager; +inline DownloadEventEngine* downloadEventEngine; inline DownloadManager* downloadManager; inline EventEngine* eventEngine; inline LuaConsole* luaConsole; diff --git a/include/openspace/events/event.h b/include/openspace/events/event.h index 563e4c5a44..012bb29936 100644 --- a/include/openspace/events/event.h +++ b/include/openspace/events/event.h @@ -60,7 +60,7 @@ struct Event { enum class Type : uint8_t { ParallelConnection, ProfileLoadingFinished, - AssetLoadingFinished, + AssetLoading, ApplicationShutdown, CameraFocusTransition, TimeOfInterestReached, @@ -152,17 +152,32 @@ struct EventProfileLoadingFinished : public Event { }; /** -* This event is created when the loading of all assets are finished. This is emitted -* regardless of whether it is the initial startup of a profile, or any subsequent asset -* being loaded e.g., through add or drag-and-drop. +* This event is created whenever the loading state of an assets changes. An asset can +* enter one of four states: `Loading`, `Loaded`, `Unloaded`, or `Error`. This event is +* emitted regardless of whether it is the initial startup of a profile, or any subsequent +* asset being added or revmoed e.g., through add or drag-and-drop. */ -struct EventAssetLoadingFinished : public Event { - static constexpr Type Type = Event::Type::AssetLoadingFinished; +struct EventAssetLoading : public Event { + static constexpr Type Type = Event::Type::AssetLoading; + + enum class State { + Loaded, + Loading, + Unloaded, + Error + }; /** - * Creates an instance of an AssetLoadingFinished event. + * Creates an instance of an AssetLoading event. + * + * \param assetPath_ The path to the asset + * \param state_ The new state of the asset given by 'asstPath_'; is one of `Loading`, + * `Loaded`, `Unloaded`, or `Error` */ - EventAssetLoadingFinished(); + EventAssetLoading(const std::filesystem::path& assetPath_, State newState); + + std::filesystem::path assetPath; + State state; }; /** diff --git a/include/openspace/scene/asset.h b/include/openspace/scene/asset.h index 89041e63cf..b4f34cfd48 100644 --- a/include/openspace/scene/asset.h +++ b/include/openspace/scene/asset.h @@ -207,6 +207,14 @@ public: */ bool hasInitializedParent() const; + /** + * Returns a list of the parents of this Asset that is currently in an initialized + * state, meaning any parent that is still interested in this Asset at all. + * + * \return A list of parent filepaths that are interested in this asset + */ + std::vector initializedParents() const; + /** * Deinitializes this Asset and recursively deinitializes the required assets if this * Asset was their ownly initialized parent. If the Asset was already deinitialized, diff --git a/include/openspace/util/downloadeventengine.h b/include/openspace/util/downloadeventengine.h new file mode 100644 index 0000000000..46c9406f8c --- /dev/null +++ b/include/openspace/util/downloadeventengine.h @@ -0,0 +1,72 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2025 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#ifndef __OPENSPACE_MODULE_SYNC___DOWNLOAD_EVENT_ENGINE___H__ +#define __OPENSPACE_MODULE_SYNC___DOWNLOAD_EVENT_ENGINE___H__ + +#include +#include +#include +#include +#include + +namespace openspace { + +// @TODO (anden88 2025-10-10): This class was specifically written for the multi-threaded +// url- and httpSynchronization events. In the future we should make this more general +// purposed. +class DownloadEventEngine { +public: + struct DownloadEvent { + enum class Type { + Started, + Progress, + Finished, + Failed + }; + + Type type; + std::string id; + int64_t downloadedBytes; + std::optional totalBytes; + }; + + using Callback = std::function; + + int subscribe(Callback cb); + void unsubscribe(int id); + + void publish(const DownloadEvent& event); + void publish(const std::string& id, DownloadEvent::Type type, + int64_t downloadedBytes = 0, std::optional totalBytes = std::nullopt); + +private: + std::mutex _mutex; + int _id = 0; + std::unordered_map _subscribers; +}; + +} // namespace openspace + +#endif // __OPENSPACE_MODULE_SYNC___DOWNLOAD_EVENT_ENGINE___H__ diff --git a/modules/server/CMakeLists.txt b/modules/server/CMakeLists.txt index b10475ebf8..d422eda160 100644 --- a/modules/server/CMakeLists.txt +++ b/modules/server/CMakeLists.txt @@ -38,6 +38,7 @@ set(HEADER_FILES include/topics/camerapathtopic.h include/topics/cameratopic.h include/topics/documentationtopic.h + include/topics/downloadeventtopic.h include/topics/enginemodetopic.h include/topics/errorlogtopic.h include/topics/eventtopic.h @@ -70,6 +71,7 @@ set(SOURCE_FILES src/topics/camerapathtopic.cpp src/topics/cameratopic.cpp src/topics/documentationtopic.cpp + src/topics/downloadeventtopic.cpp src/topics/enginemodetopic.cpp src/topics/errorlogtopic.cpp src/topics/eventtopic.cpp diff --git a/modules/server/include/connection.h b/modules/server/include/connection.h index 5e6e2db9c7..63abaa03d2 100644 --- a/modules/server/include/connection.h +++ b/modules/server/include/connection.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -71,11 +72,10 @@ private: std::map> _topics; std::unique_ptr _socket; std::thread _thread; + std::mutex _mutex; std::string _address; bool _isAuthorized = false; - std::map _messageQueue; - std::map _sentMessages; }; } // namespace openspace diff --git a/modules/server/include/topics/downloadeventtopic.h b/modules/server/include/topics/downloadeventtopic.h new file mode 100644 index 0000000000..8b3b65dcd0 --- /dev/null +++ b/modules/server/include/topics/downloadeventtopic.h @@ -0,0 +1,49 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2025 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#ifndef __OPENSPACE_MODULE_SERVER___DOWNLOADEVENT_TOPIC___H__ +#define __OPENSPACE_MODULE_SERVER___DOWNLOADEVENT_TOPIC___H__ + +#include + +#include + +namespace openspace { + +class DownloadEventTopic : public Topic { +public: + ~DownloadEventTopic() override; + + void handleJson(const nlohmann::json& json) override; + bool isDone() const override; + +private: + bool _isSubscribedTo = false; + int _subscriptionID = -1; + std::unordered_map _lastCallBack; +}; + +} // namespace openspace + +#endif // __OPENSPACE_MODULE_SERVER___DOWNLOADEVENT_TOPIC___H__ diff --git a/modules/server/src/connection.cpp b/modules/server/src/connection.cpp index 6dfc99363b..ff99ccf5ff 100644 --- a/modules/server/src/connection.cpp +++ b/modules/server/src/connection.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -91,6 +92,7 @@ Connection::Connection(std::unique_ptr s, std::string address _topicFactory.registerClass("camera"); _topicFactory.registerClass("cameraPath"); _topicFactory.registerClass("documentation"); + _topicFactory.registerClass("downloadEvent"); _topicFactory.registerClass("engineMode"); _topicFactory.registerClass("errorLog"); _topicFactory.registerClass("event"); @@ -214,6 +216,7 @@ void Connection::handleJson(const nlohmann::json& json) { void Connection::sendMessage(const std::string& message) { ZoneScoped; + std::lock_guard lock(_mutex); _socket->putMessage(message); } diff --git a/modules/server/src/topics/downloadeventtopic.cpp b/modules/server/src/topics/downloadeventtopic.cpp new file mode 100644 index 0000000000..6a7dac6494 --- /dev/null +++ b/modules/server/src/topics/downloadeventtopic.cpp @@ -0,0 +1,90 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2025 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#include + +#include +#include +#include +#include + +namespace { + constexpr std::string_view StartSubscription = "start_subscription"; + constexpr std::string_view StopSubscription = "stop_subscription"; + constexpr std::chrono::milliseconds CallbackUpdateInterval(250); +} // namespace + +namespace openspace { + +DownloadEventTopic::~DownloadEventTopic() { + if (_isSubscribedTo) { + global::downloadEventEngine->unsubscribe(_subscriptionID); + _isSubscribedTo = false; + } +} + +bool DownloadEventTopic::isDone() const { + return !_isSubscribedTo; +} + +void DownloadEventTopic::handleJson(const nlohmann::json& json) { + const std::string& event = json.at("event").get(); + + if (event == StartSubscription) { + _isSubscribedTo = true; + + auto callback = [this](const DownloadEventEngine::DownloadEvent& event) { + // Limit how often we send data to frontend to reduce traffic + if (event.type == DownloadEventEngine::DownloadEvent::Type::Progress) { + const auto now = std::chrono::steady_clock::now(); + auto& last = _lastCallBack[event.id]; + + if (now - last >= CallbackUpdateInterval) { + last = now; + } + else { + return; + } + } + + nlohmann::json payload; + payload["type"] = event.type; + payload["id"] = event.id; + payload["downloadedBytes"] = event.downloadedBytes; + if (event.totalBytes.has_value()) { + payload["totalBytes"] = event.totalBytes.value(); + } + + _connection->sendJson(wrappedPayload(payload)); + }; + _subscriptionID = global::downloadEventEngine->subscribe(callback); + } + + else if (event == StopSubscription) { + global::downloadEventEngine->unsubscribe(_subscriptionID); + _isSubscribedTo = false; + } +} + +} // namespace openspace diff --git a/modules/sync/syncs/httpsynchronization.cpp b/modules/sync/syncs/httpsynchronization.cpp index 14490592a1..0481b028f0 100644 --- a/modules/sync/syncs/httpsynchronization.cpp +++ b/modules/sync/syncs/httpsynchronization.cpp @@ -26,6 +26,8 @@ #include #include +#include +#include #include #include #include @@ -332,9 +334,25 @@ HttpSynchronization::trySyncFromUrl(std::string url) { _nSynchronizedBytes += sd.second.downloadedBytes; } + DownloadEventEngine::DownloadEvent event = { + .type = DownloadEventEngine::DownloadEvent::Type::Progress, + .id = line, + .downloadedBytes = downloadedBytes, + .totalBytes = totalBytes + }; + global::downloadEventEngine->publish(event); + return !_shouldCancel; }); + DownloadEventEngine::DownloadEvent event = { + .type = DownloadEventEngine::DownloadEvent::Type::Started, + .id = line, + .downloadedBytes = 0 + }; + global::downloadEventEngine->publish(event); + LDEBUG(std::format("Started downloading '{}'", dl->url())); + dl->start(); } startedAllDownloads = true; @@ -373,6 +391,12 @@ HttpSynchronization::trySyncFromUrl(std::string url) { if (!d->hasSucceeded()) { LERROR(std::format("Error downloading file from URL '{}'", d->url())); failed = true; + + global::downloadEventEngine->publish( + d->url(), + DownloadEventEngine::DownloadEvent::Type::Failed + ); + LERROR(std::format("Failed to download '{}'", d->url())); continue; } @@ -421,16 +445,38 @@ HttpSynchronization::trySyncFromUrl(std::string url) { std::filesystem::remove(source); } } - if (failed) { - for (const std::unique_ptr& d : downloads) { - // Store all files that were synced to the ossync + + for (const std::unique_ptr& d : downloads) { + if (failed) { + // At least one download failed, (some downloads may have succeeded) if (d->hasSucceeded()) { _newSyncedFiles.push_back(d->url()); + global::downloadEventEngine->publish( + d->url(), + DownloadEventEngine::DownloadEvent::Type::Finished + ); + LDEBUG(std::format("Finished downloading '{}'", d->url())); + } + else { + global::downloadEventEngine->publish( + d->url(), + DownloadEventEngine::DownloadEvent::Type::Failed + ); + LERROR(std::format("Failed to download '{}'", d->url())); } } - return SynchronizationState::FileDownloadFail; + else { + // All downloads are successful + global::downloadEventEngine->publish( + d->url(), + DownloadEventEngine::DownloadEvent::Type::Finished + ); + LDEBUG(std::format("Finished downloading '{}'", d->url())); + } + } - return SynchronizationState::Success; + + return failed ? SynchronizationState::FileDownloadFail : SynchronizationState::Success; } } // namespace openspace diff --git a/modules/sync/syncs/urlsynchronization.cpp b/modules/sync/syncs/urlsynchronization.cpp index 885f9b29d6..32d9dd81a8 100644 --- a/modules/sync/syncs/urlsynchronization.cpp +++ b/modules/sync/syncs/urlsynchronization.cpp @@ -26,6 +26,8 @@ #include #include +#include +#include #include #include #include @@ -354,9 +356,25 @@ bool UrlSynchronization::trySyncUrls() { _nSynchronizedBytes += sd.second.downloadedBytes; } + DownloadEventEngine::DownloadEvent event = { + .type = DownloadEventEngine::DownloadEvent::Type::Progress, + .id = url, + .downloadedBytes = downloadedBytes, + .totalBytes = totalBytes + }; + global::downloadEventEngine->publish(event); + return !_shouldCancel; }); + DownloadEventEngine::DownloadEvent event = { + .type = DownloadEventEngine::DownloadEvent::Type::Started, + .id = url, + .downloadedBytes = 0 + }; + global::downloadEventEngine->publish(event); + LDEBUG(std::format("Started downloading '{}'", dl->url())); + dl->start(); } @@ -368,6 +386,11 @@ bool UrlSynchronization::trySyncUrls() { if (!d->hasSucceeded()) { failed = true; LERROR(std::format("Error downloading file from URL: {}", d->url())); + global::downloadEventEngine->publish( + d->url(), + DownloadEventEngine::DownloadEvent::Type::Failed + ); + LERROR(std::format("Failed to download '{}'", d->url())); continue; } @@ -394,7 +417,18 @@ bool UrlSynchronization::trySyncUrls() { ); failed = true; + global::downloadEventEngine->publish( + d->url(), + DownloadEventEngine::DownloadEvent::Type::Failed + ); + LERROR(std::format("Failed to download '{}'", d->url())); } + + global::downloadEventEngine->publish( + d->url(), + DownloadEventEngine::DownloadEvent::Type::Finished + ); + LDEBUG(std::format("Finished downloading '{}'", d->url())); } return !failed; diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3bb78ce255..0687a2d792 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -174,6 +174,7 @@ set(OPENSPACE_SOURCE util/collisionhelper.cpp util/coordinateconversion.cpp util/distanceconversion.cpp + util/downloadeventengine.cpp util/dynamicfilesequencedownloader.cpp util/ellipsoid.cpp util/factorymanager.cpp @@ -372,6 +373,7 @@ set(OPENSPACE_HEADER ${PROJECT_SOURCE_DIR}/include/openspace/util/coordinateconversion.h ${PROJECT_SOURCE_DIR}/include/openspace/util/distanceconstants.h ${PROJECT_SOURCE_DIR}/include/openspace/util/distanceconversion.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/downloadeventengine.h ${PROJECT_SOURCE_DIR}/include/openspace/util/dynamicfilesequencedownloader.h ${PROJECT_SOURCE_DIR}/include/openspace/util/ellipsoid.h ${PROJECT_SOURCE_DIR}/include/openspace/util/factorymanager.h diff --git a/src/engine/globals.cpp b/src/engine/globals.cpp index 4ad57fce5a..dca1a827a4 100644 --- a/src/engine/globals.cpp +++ b/src/engine/globals.cpp @@ -52,6 +52,7 @@ #include #include #include +#include #include #include #include @@ -75,6 +76,7 @@ namespace { #ifdef WIN32 constexpr int TotalSize = sizeof(MemoryManager) + + sizeof(DownloadEventEngine) + sizeof(EventEngine) + sizeof(ghoul::fontrendering::FontManager) + sizeof(Dashboard) + @@ -141,6 +143,14 @@ void create() { openSpaceEngine = new OpenSpaceEngine; #endif // WIN32 +#ifdef WIN32 + downloadEventEngine = new (currentPos) DownloadEventEngine; + ghoul_assert(downloadEventEngine, "No downloadEventEngine"); + currentPos += sizeof(DownloadEventEngine); +#else // ^^^^ WIN32 / !WIN32 vvv + downloadEventEngine = new DownloadEventEngine; +#endif // WIN32 + #ifdef WIN32 eventEngine = new (currentPos) EventEngine; ghoul_assert(eventEngine, "No eventEngine"); @@ -626,6 +636,13 @@ void destroy() { delete fontManager; #endif // WIN32 + LDEBUGC("Globals", "Destroying 'DownloadEventEngine'"); +#ifdef WIN32 + downloadEventEngine->~DownloadEventEngine(); +#else // ^^^ WIN32 / !WIN32 vvv + delete downloadEventEngine; +#endif // WIN32 + LDEBUGC("Globals", "Destroying 'EventEngine'"); #ifdef WIN32 eventEngine->~EventEngine(); diff --git a/src/events/event.cpp b/src/events/event.cpp index 0cf72be3a6..e897f328d7 100644 --- a/src/events/event.cpp +++ b/src/events/event.cpp @@ -62,9 +62,18 @@ void log(int i, [[maybe_unused]] const EventProfileLoadingFinished& e) { LINFO(std::format("[{}] ProfileLoadingFinished", i)); } -void log(int i, const EventAssetLoadingFinished& e) { - ghoul_assert(e.type == EventAssetLoadingFinished::Type, "Wrong type"); - LINFO(std::format("[{}] AssetLoadingFinished", i)); +void log(int i, const EventAssetLoading& e) { + ghoul_assert(e.type == EventAssetLoading::Type, "Wrong type"); + std::string_view state = [](EventAssetLoading::State s) { + switch (s) { + case EventAssetLoading::State::Loaded: return "Loaded"; + case EventAssetLoading::State::Loading: return "Loading"; + case EventAssetLoading::State::Unloaded: return "Unloaded"; + case EventAssetLoading::State::Error: return "Error"; + default: throw ghoul::MissingCaseException(); + } + }(e.state); + LINFO(std::format("[{}] AssetLoading: '{}': ({})", i, e.assetPath, state)); } void log(int i, const EventApplicationShutdown& e) { @@ -235,7 +244,7 @@ std::string_view toString(Event::Type type) { switch (type) { case Event::Type::ParallelConnection: return "ParallelConnection"; case Event::Type::ProfileLoadingFinished: return "ProfileLoadingFinished"; - case Event::Type::AssetLoadingFinished: return "AssetLoadingFinished"; + case Event::Type::AssetLoading: return "AssetLoading"; case Event::Type::ApplicationShutdown: return "ApplicationShutdown"; case Event::Type::CameraFocusTransition: return "CameraFocusTransition"; case Event::Type::TimeOfInterestReached: return "TimeOfInterestReached"; @@ -271,8 +280,8 @@ Event::Type fromString(std::string_view str) { else if (str == "ProfileLoadingFinished") { return Event::Type::ProfileLoadingFinished; } - else if (str == "AssetLoadingFinished") { - return Event::Type::AssetLoadingFinished; + else if (str == "AssetLoading") { + return Event::Type::AssetLoading; } else if (str == "ApplicationShutdown") { return Event::Type::ApplicationShutdown; @@ -366,6 +375,26 @@ ghoul::Dictionary toParameter(const Event& e) { break; } break; + case Event::Type::AssetLoading: + d.setValue( + "AssetPath", + static_cast(e).assetPath + ); + switch (static_cast(e).state) { + case EventAssetLoading::State::Loaded: + d.setValue("State", "Loaded"s); + break; + case EventAssetLoading::State::Loading: + d.setValue("State", "Loading"s); + break; + case EventAssetLoading::State::Unloaded: + d.setValue("State", "Unloaded"s); + break; + case EventAssetLoading::State::Error: + d.setValue("State", "Error"s); + break; + } + break; case Event::Type::ApplicationShutdown: switch (static_cast(e).state) { case EventApplicationShutdown::State::Started: @@ -544,8 +573,8 @@ void logAllEvents(const Event* e) { case Event::Type::ProfileLoadingFinished: log(i, *static_cast(e)); break; - case Event::Type::AssetLoadingFinished: - log(i, *static_cast(e)); + case Event::Type::AssetLoading: + log(i, *static_cast(e)); break; case Event::Type::ApplicationShutdown: log(i, *static_cast(e)); @@ -634,8 +663,11 @@ EventProfileLoadingFinished::EventProfileLoadingFinished() : Event(Type) {} -EventAssetLoadingFinished::EventAssetLoadingFinished() +EventAssetLoading::EventAssetLoading(const std::filesystem::path& assetPath_, + State newState) : Event(Type) + , assetPath(assetPath_) + , state(newState) {} EventApplicationShutdown::EventApplicationShutdown(State state_) diff --git a/src/rendering/luaconsole.cpp b/src/rendering/luaconsole.cpp index a9896d847a..aa6686822a 100644 --- a/src/rendering/luaconsole.cpp +++ b/src/rendering/luaconsole.cpp @@ -1129,20 +1129,10 @@ bool LuaConsole::gatherPathSuggestions(size_t contextStart) { ghoul::filesystem::Sorted::Yes ); - auto containsNonAscii = [](const std::filesystem::path& p) { - const std::u8string s = p.generic_u8string(); - for (auto it = s.rbegin(); it != s.rend(); it++) { - if (static_cast(*it) > 0x7F) { - return true; - } - } - return false; - }; - std::vector entries; for (const std::filesystem::path& entry : suggestions) { // Filter paths that contain non-ASCII characters - if (containsNonAscii(entry)) { + if (ghoul::containsNonAscii(entry)) { continue; } diff --git a/src/scene/asset.cpp b/src/scene/asset.cpp index c2f901d3fc..476c398461 100644 --- a/src/scene/asset.cpp +++ b/src/scene/asset.cpp @@ -25,6 +25,9 @@ #include #include +#include +#include +#include #include #include #include @@ -184,6 +187,16 @@ bool Asset::hasInitializedParent() const { ); } +std::vector Asset::initializedParents() const { + std::vector parents; + for (const Asset* parent : _parentAssets) { + if (parent->isInitialized()) { + parents.push_back(parent->path()); + } + } + return parents; +} + bool Asset::isInitialized() const { return _state == State::Initialized; } @@ -284,6 +297,10 @@ void Asset::initialize() { } LDEBUG(std::format("Initializing asset '{}'", _assetPath)); + global::eventEngine->publishEvent( + _assetPath.string(), + events::EventAssetLoading::State::Loading + ); // 1. Initialize requirements for (Asset* child : _requiredAssets) { child->initialize(); @@ -308,6 +325,10 @@ void Asset::initialize() { // 3. Update state setState(State::Initialized); + global::eventEngine->publishEvent( + _assetPath.string(), + events::EventAssetLoading::State::Loaded + ); } void Asset::deinitialize() { diff --git a/src/scene/assetmanager.cpp b/src/scene/assetmanager.cpp index 723ba68f45..d9d91bb57b 100644 --- a/src/scene/assetmanager.cpp +++ b/src/scene/assetmanager.cpp @@ -230,10 +230,6 @@ void AssetManager::runAddQueue() { void AssetManager::update() { ZoneScoped; - - // Flag to keep track of when to emit synchronization event - const bool isLoadingAssets = !_toBeInitialized.empty(); - // Delete all the assets that have been marked for deletion in the previous frame { ZoneScopedN("Deleting assets"); @@ -303,11 +299,6 @@ void AssetManager::update() { it++; } } - - // If the _toBeInitialized state has changed in this update call we emit the event - if (isLoadingAssets && _toBeInitialized.empty()) { - global::eventEngine->publishEvent(); - } } void AssetManager::add(const std::string& path) { @@ -387,6 +378,10 @@ bool AssetManager::loadAsset(Asset* asset, Asset* parent) { } catch (const ghoul::lua::LuaRuntimeException& e) { LERROR(std::format("Could not load asset '{}': {}", asset->path(), e.message)); + global::eventEngine->publishEvent( + asset->path().string(), + events::EventAssetLoading::State::Error + ); return false; } catch (const ghoul::RuntimeError& e) { @@ -466,6 +461,10 @@ void AssetManager::unloadAsset(Asset* asset) { // might be painful _toBeDeleted.push_back(std::move(*it)); _assets.erase(it); + global::eventEngine->publishEvent( + asset->path().string(), + events::EventAssetLoading::State::Unloaded + ); } } @@ -964,6 +963,10 @@ void AssetManager::callOnInitialize(Asset* asset) const { for (const int init : it->second) { lua_rawgeti(*_luaState, LUA_REGISTRYINDEX, init); if (lua_pcall(*_luaState, 0, 0, 0) != LUA_OK) { + global::eventEngine->publishEvent( + asset->path().string(), + events::EventAssetLoading::State::Error + ); throw ghoul::lua::LuaRuntimeException(std::format( "When initializing '{}': {}", asset->path(), @@ -1058,7 +1061,8 @@ scripting::LuaLibrary AssetManager::luaLibrary() { codegen::lua::RemoveAll, codegen::lua::IsLoaded, codegen::lua::AllAssets, - codegen::lua::RootAssets + codegen::lua::RootAssets, + codegen::lua::Parents } }; } diff --git a/src/scene/assetmanager_lua.inl b/src/scene/assetmanager_lua.inl index 58c2d96cdf..7c01343b7d 100644 --- a/src/scene/assetmanager_lua.inl +++ b/src/scene/assetmanager_lua.inl @@ -108,6 +108,21 @@ namespace { return res; } +/** + * Returns the path to all parents that are still interested in this Asset e.g., through + * 'asset.require()' + */ +[[codegen::luawrap]] std::vector parents(std::string assetName) { + using namespace openspace; + std::vector as = global::openSpaceEngine->assetManager().allAssets(); + for (const Asset* a : as) { + if (a->path() == assetName) { + return a->initializedParents(); + } + } + return std::vector(); +} + #include "assetmanager_lua_codegen.cpp" } // namespace diff --git a/src/util/downloadeventengine.cpp b/src/util/downloadeventengine.cpp new file mode 100644 index 0000000000..45773f292b --- /dev/null +++ b/src/util/downloadeventengine.cpp @@ -0,0 +1,62 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2025 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#include + +namespace openspace { + +int DownloadEventEngine::subscribe(Callback cb) { + std::lock_guard lock(_mutex); + int id = _id++; + _subscribers[id] = std::move(cb); + return id; +} + +void DownloadEventEngine::unsubscribe(int id) { + std::lock_guard lock(_mutex); + _subscribers.erase(id); +} + +void DownloadEventEngine::publish(const DownloadEvent& event) { + std::lock_guard lock(_mutex); + for (auto& [_, callback] : _subscribers) { + callback(event); + } +} + +void DownloadEventEngine::publish(const std::string& id, DownloadEvent::Type type, + int64_t downloadedBytes, + std::optional totalBytes) +{ + const DownloadEvent event = { + .type = type, + .id = id, + .downloadedBytes = downloadedBytes, + .totalBytes = totalBytes + }; + + publish(event); +} + +} // namespace openspace From ee0fe585358c7d3ff9e3303083ecd5ac541d55df Mon Sep 17 00:00:00 2001 From: Andreas Engberg Date: Mon, 1 Dec 2025 11:47:24 +0100 Subject: [PATCH 19/43] Update WebGui 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 035b835f92..f81611e34c 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 UI frontend -local frontendHash = "baabd171ecbe61b2758970a2cdafb43fbcd1a23b" +local frontendHash = "45fbb2cf898466250c7ad4dd332ceec5a1d15c0d" -- The name of the file to download from the server local frontendFile = "frontend.zip" From 20b1a5ccfe7acee8f286cbc01566399f1908a177 Mon Sep 17 00:00:00 2001 From: Matthias Braun <30432154+braunms@users.noreply.github.com> Date: Wed, 3 Dec 2025 18:35:58 +0100 Subject: [PATCH 20/43] Make the profile editor (launcher GUI) and thus the Qt6 dependency optional (#3857) --- apps/OpenSpace/CMakeLists.txt | 32 ++++++++++++++++++-------------- apps/OpenSpace/main.cpp | 6 ++++++ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/apps/OpenSpace/CMakeLists.txt b/apps/OpenSpace/CMakeLists.txt index d6f99b9c5e..03100a7f16 100644 --- a/apps/OpenSpace/CMakeLists.txt +++ b/apps/OpenSpace/CMakeLists.txt @@ -143,23 +143,27 @@ add_custom_command(TARGET OpenSpace POST_BUILD end_header("Dependency: SGCT") -begin_header("Dependency: Profile Editor") -add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/ext/launcher) -target_link_libraries(OpenSpace PRIVATE openspace-ui-launcher) -end_header("Dependency: Profile Editor") +# Profile Editor / Launcher GUI +option(OPENSPACE_APPLICATION_OPENSPACE-LAUNCHER "Build Launcher GUI" ON) +if (OPENSPACE_APPLICATION_OPENSPACE-LAUNCHER) + begin_header("Dependency: Profile Editor") + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/ext/launcher) + target_link_libraries(OpenSpace PRIVATE openspace-ui-launcher) + target_compile_definitions(OpenSpace PRIVATE OPENSPACE_HAS_LAUNCHER) + end_header("Dependency: Profile Editor") -if (WIN32) - # Find the windeployqt application - get_target_property(_qmake_executable Qt6::qmake IMPORTED_LOCATION) - get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY) - add_custom_command( - TARGET OpenSpace POST_BUILD - COMMAND "${WINDEPLOYQT_EXECUTABLE}" --verbose 0 --no-compiler-runtime --no-translations \"$\" - COMMENT "Deploying Qt libraries" - ) + if (WIN32) + # Find the windeployqt application + get_target_property(_qmake_executable Qt6::qmake IMPORTED_LOCATION) + get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY) + add_custom_command( + TARGET OpenSpace POST_BUILD + COMMAND "${WINDEPLOYQT_EXECUTABLE}" --verbose 0 --no-compiler-runtime --no-translations \"$\" + COMMENT "Deploying Qt libraries" + ) + endif () endif () - # Web Browser and Web gui # Why not put these in the module's path? Because they do not have access to the # target as of July 2017, which is needed. diff --git a/apps/OpenSpace/main.cpp b/apps/OpenSpace/main.cpp index 40daa211bf..969b90fc53 100644 --- a/apps/OpenSpace/main.cpp +++ b/apps/OpenSpace/main.cpp @@ -79,9 +79,11 @@ #include #endif // OPENSPACE_BREAK_ON_FLOATING_POINT_EXCEPTION +#ifdef OPENSPACE_HAS_LAUNCHER #include #include #include +#endif // OPENSPACE_HAS_LAUNCHER #ifdef WIN32 extern "C" { @@ -1450,6 +1452,7 @@ int main(int argc, char* argv[]) { #endif // __APPLE__ if (!global::configuration->bypassLauncher) { +#ifdef OPENSPACE_HAS_LAUNCHER #ifndef __APPLE__ int qac = 0; QApplication app(qac, nullptr); @@ -1542,6 +1545,9 @@ int main(int argc, char* argv[]) { } global::configuration->windowConfiguration = config; } +#else // ^^^^ OPENSPACE_HAS_LAUNCHER // !OPENSPACE_HAS_LAUNCHER + glfwInit(); +#endif // OPENSPACE_HAS_LAUNCHER } else { glfwInit(); From 7e712aca3803c2d1424932894bdf1409a9fdf54c Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Thu, 4 Dec 2025 10:37:41 +0100 Subject: [PATCH 21/43] Add angular fisheye texture mapping for spheres (#3837) * Add equirectangular to fisheye coordinate mapping for spheres * Code cleanup and some image examples * Add documentation and video sphere example * Fix renderable video sphere not updating on changed sphere settings * Increase example video sphere resolution and clarify orientation setting * Apply suggestions from code review Co-authored-by: Malin E * Address more code review comments * Update docs to match recent changes in #3835 * Apply suggestions from code review Co-authored-by: Alexander Bock Co-authored-by: Andreas Engberg <48772850+engbergandreas@users.noreply.github.com> * Move texture mapping to fragment shader Fixes issues at edges due to interpolation of texture coordinates --------- Co-authored-by: Malin E Co-authored-by: Alexander Bock Co-authored-by: Andreas Engberg <48772850+engbergandreas@users.noreply.github.com> --- .../sphereimagelocal_fisheye.asset | 28 +++++++++++ .../sphereimageonline_fisheye.asset | 28 +++++++++++ .../videosphere_fisheye.asset | 42 +++++++++++++++++ modules/base/rendering/renderablesphere.cpp | 47 ++++++++++++++++--- modules/base/rendering/renderablesphere.h | 3 +- .../rendering/renderablesphereimagelocal.cpp | 4 ++ .../rendering/renderablesphereimageonline.cpp | 4 ++ modules/base/shaders/sphere_fs.glsl | 41 +++++++++++++++- modules/base/shaders/sphere_vs.glsl | 3 +- modules/video/src/renderablevideosphere.cpp | 8 +++- 10 files changed, 196 insertions(+), 12 deletions(-) create mode 100644 data/assets/examples/renderable/renderablesphereimagelocal/sphereimagelocal_fisheye.asset create mode 100644 data/assets/examples/renderable/renderablesphereimageonline/sphereimageonline_fisheye.asset create mode 100644 data/assets/examples/renderable/renderablevideosphere/videosphere_fisheye.asset diff --git a/data/assets/examples/renderable/renderablesphereimagelocal/sphereimagelocal_fisheye.asset b/data/assets/examples/renderable/renderablesphereimagelocal/sphereimagelocal_fisheye.asset new file mode 100644 index 0000000000..a38ff5454a --- /dev/null +++ b/data/assets/examples/renderable/renderablesphereimagelocal/sphereimagelocal_fisheye.asset @@ -0,0 +1,28 @@ +-- Fisheye Mapping +-- This example shows a sphere that is covered with an image which is retrieved from +-- a local file path and mapped to the sphere using Angular Fisheye projection. The image +-- will cover half of the sphere. + +local Node = { + Identifier = "RenderableSphereImageLocal_Example_FisheyeMapping", + Renderable = { + Type = "RenderableSphereImageLocal", + Texture = openspace.absPath("${DATA}/test3.jpg"), + TextureProjection = "Angular Fisheye", + -- Set orientation to also render the inside of the sphere (which is the correct view + -- for a fisheye/fulldome image) + Orientation = "Both" + }, + GUI = { + Name = "RenderableSphereImageLocal - Fisheye Mapping", + Path = "/Examples" + } +} + +asset.onInitialize(function() + openspace.addSceneGraphNode(Node) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(Node) +end) diff --git a/data/assets/examples/renderable/renderablesphereimageonline/sphereimageonline_fisheye.asset b/data/assets/examples/renderable/renderablesphereimageonline/sphereimageonline_fisheye.asset new file mode 100644 index 0000000000..1b81646550 --- /dev/null +++ b/data/assets/examples/renderable/renderablesphereimageonline/sphereimageonline_fisheye.asset @@ -0,0 +1,28 @@ +-- Fisheye Mapping +-- This example shows a sphere that is covered with an image which is retrieved from an +-- online URL and mapped to the sphere using Angular Fisheye projection. The image will +-- cover half of the sphere. + +local Node = { + Identifier = "RenderableSphereImageOnline_Example_FisheyeMapping", + Renderable = { + Type = "RenderableSphereImageOnline", + URL = "http://data.openspaceproject.com/examples/renderableplaneimageonline.jpg", + TextureProjection = "Angular Fisheye", + -- Set orientation to also render the inside of the sphere (which is the correct view + -- for a fisheye/fulldome image) + Orientation = "Both" + }, + GUI = { + Name = "RenderableSphereImageOnline - Fisheye Mapping", + Path = "/Examples" + } +} + +asset.onInitialize(function() + openspace.addSceneGraphNode(Node) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(Node) +end) diff --git a/data/assets/examples/renderable/renderablevideosphere/videosphere_fisheye.asset b/data/assets/examples/renderable/renderablevideosphere/videosphere_fisheye.asset new file mode 100644 index 0000000000..108a005b96 --- /dev/null +++ b/data/assets/examples/renderable/renderablevideosphere/videosphere_fisheye.asset @@ -0,0 +1,42 @@ +-- Fulldome Fisheye Video +-- Creates a 3D sphere with an angular fisheye video (fulldome) mapped onto its surface. +-- The video will be shown on half of the sphere. + +-- The video file is here downloaded from a URL. This code returns the path to a folder +-- where the file is stored after download +local data = asset.resource({ + Name = "Example Video Angular Fisheye", + Type = "UrlSynchronization", + Identifier = "example_video_angularfisheye", + Url = "https://liu-se.cdn.openspaceproject.com/files/examples/video/examplevideo_fisheye.mp4" +}) + +-- For a local file, use "asset.resource("path/to/local/video.mp4")" here instead +local video = data .. "examplevideo_fisheye.mp4" + +local Node = { + Identifier = "RenderableVideoSphere_Example", + Renderable = { + Type = "RenderableVideoSphere", + Video = video, + TextureProjection = "Angular Fisheye", + -- Set orientation to also render the inside of the sphere (which is the correct view + -- for a fisheye/fulldome video) + Orientation = "Both", + -- Increasing the number of segments makes the sphere smoother and reduces distortion + -- at the edge of the video + Segments = 64 + }, + GUI = { + Name = "RenderableVideoSphere - Fisheye Video", + Path = "/Examples" + } +} + +asset.onInitialize(function() + openspace.addSceneGraphNode(Node) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(Node) +end) diff --git a/modules/base/rendering/renderablesphere.cpp b/modules/base/rendering/renderablesphere.cpp index 0af99514ce..16728b1ae4 100644 --- a/modules/base/rendering/renderablesphere.cpp +++ b/modules/base/rendering/renderablesphere.cpp @@ -67,8 +67,8 @@ namespace { openspace::properties::Property::Visibility::AdvancedUser }; - enum class Orientation : int { - Outside = 0, + enum class Orientation { + Outside, Inside, Both }; @@ -88,6 +88,20 @@ namespace { openspace::properties::Property::Visibility::AdvancedUser }; + enum class TextureProjection { + Equirectangular, + AngularFisheye + }; + + constexpr openspace::properties::Property::PropertyInfo TextureProjectionInfo = { + "TextureProjection", + "Texture Projection", + "Specifies the projection mapping to use for any texture loaded onto the sphere " + "(assumes Equirectangular per default). Note that for \"Angular Fisheye\" only " + "half the sphere will be textured - the hemisphere centered around the z-axis.", + openspace::properties::Property::Visibility::AdvancedUser + }; + constexpr openspace::properties::Property::PropertyInfo DisableFadeInOutInfo = { "DisableFadeInOut", "Disable fade-in/fade-out effects", @@ -145,10 +159,11 @@ namespace { openspace::properties::Property::Visibility::AdvancedUser }; - // This `Renderable` represents a simple sphere with an image. The image that is shown - // should be in an equirectangular projection/spherical panoramic image or else - // distortions will be introduced. The `Orientation` parameter determines whether the - // provided image is shown on the inside, outside, or both sides of the sphere. + // This `Renderable` represents a simple sphere with an image. Per default, the + // sphere uses an equirectangular projection for the image mapping. + // + // The `Orientation` parameter determines whether the provided image is shown on + // the inside, outside, or both sides of the sphere. struct [[codegen::Dictionary(RenderableSphere)]] Parameters { // [[codegen::verbatim(SizeInfo.description)]] std::optional size [[codegen::greater(0.f)]]; @@ -168,6 +183,14 @@ namespace { // [[codegen::verbatim(MirrorTextureInfo.description)]] std::optional mirrorTexture; + enum class [[codegen::map(TextureProjection)]] TextureProjection { + Equirectangular, + AngularFisheye [[codegen::key("Angular Fisheye")]] + }; + + // [[codegen::verbatim(TextureProjectionInfo.description)]] + std::optional textureProjection; + // [[codegen::verbatim(DisableFadeInOutInfo.description)]] std::optional disableFadeInOut; @@ -204,6 +227,7 @@ RenderableSphere::RenderableSphere(const ghoul::Dictionary& dictionary) , _segments(SegmentsInfo, 16, 4, 1000) , _orientation(OrientationInfo) , _mirrorTexture(MirrorTextureInfo, false) + , _textureProjection(TextureProjectionInfo) , _disableFadeInDistance(DisableFadeInOutInfo, false) , _fadeInThreshold(FadeInThresholdInfo, 0.f, 0.f, 1.f, 0.001f) , _fadeOutThreshold(FadeOutThresholdInfo, 0.f, 0.f, 1.f, 0.001f) @@ -243,6 +267,15 @@ RenderableSphere::RenderableSphere(const ghoul::Dictionary& dictionary) _mirrorTexture = p.mirrorTexture.value_or(_mirrorTexture); addProperty(_mirrorTexture); + _textureProjection.addOptions({ + { static_cast(TextureProjection::Equirectangular), "Equirectangular" }, + { static_cast(TextureProjection::AngularFisheye), "Angular Fisheye" } + }); + _textureProjection = p.textureProjection.has_value() ? + static_cast(codegen::map(*p.textureProjection)) : + static_cast(TextureProjection::Equirectangular); + addProperty(_textureProjection); + _disableFadeInDistance = p.disableFadeInOut.value_or(_disableFadeInDistance); addProperty(_disableFadeInDistance); @@ -439,6 +472,8 @@ void RenderableSphere::render(const RenderData& data, RendererTasks&) { defer{ unbindTexture(); }; _shader->setUniform(_uniformCache.colorTexture, unit); + _shader->setUniform(_uniformCache.textureProjection, _textureProjection.value()); + // Setting these states should not be necessary, // since they are the default state in OpenSpace. glEnable(GL_CULL_FACE); diff --git a/modules/base/rendering/renderablesphere.h b/modules/base/rendering/renderablesphere.h index 9a6c835607..470dde39b5 100644 --- a/modules/base/rendering/renderablesphere.h +++ b/modules/base/rendering/renderablesphere.h @@ -65,6 +65,7 @@ protected: properties::OptionProperty _orientation; properties::BoolProperty _mirrorTexture; + properties::OptionProperty _textureProjection; properties::BoolProperty _disableFadeInDistance; properties::FloatProperty _fadeInThreshold; @@ -84,7 +85,7 @@ private: std::unique_ptr _transferFunction; UniformCache(opacity, modelViewProjection, modelViewTransform, modelViewRotation, - colorTexture, mirrorTexture) _uniformCache; + colorTexture, mirrorTexture, textureProjection) _uniformCache; }; } // namespace openspace diff --git a/modules/base/rendering/renderablesphereimagelocal.cpp b/modules/base/rendering/renderablesphereimagelocal.cpp index 322b6e92d2..8a2acad954 100644 --- a/modules/base/rendering/renderablesphereimagelocal.cpp +++ b/modules/base/rendering/renderablesphereimagelocal.cpp @@ -44,6 +44,10 @@ namespace { // This `Renderable` shows a sphere with an image provided by a local file on disk. To // show a sphere with an image from an online source, see // [RenderableSphereImageOnline](#base_screenspace_image_online). + // + // Per default, the sphere uses an equirectangular projection for the image mapping + // and hence expects an equirectangular image. However, it can also be used to show + // fisheye images by changing the `TextureProjection`. struct [[codegen::Dictionary(RenderableSphereImageLocal)]] Parameters { // [[codegen::verbatim(TextureInfo.description)]] std::filesystem::path texture; diff --git a/modules/base/rendering/renderablesphereimageonline.cpp b/modules/base/rendering/renderablesphereimageonline.cpp index ffb567cbf8..1afe4900f5 100644 --- a/modules/base/rendering/renderablesphereimageonline.cpp +++ b/modules/base/rendering/renderablesphereimageonline.cpp @@ -68,6 +68,10 @@ namespace { // will be downloaded when the `Renderable` is added to a scene graph node. To show a // sphere with an image from a local file, see // [RenderableSphereImageLocal](#base_screenspace_image_local). + // + // Per default, the sphere uses an equirectangular projection for the image mapping + // and hence expects an equirectangular image. However, it can also be used to show + // fisheye images by changing the `TextureProjection`. struct [[codegen::Dictionary(RenderableSphereImageOnline)]] Parameters { // [[codegen::verbatim(TextureInfo.description)]] std::string url [[codegen::key("URL")]]; diff --git a/modules/base/shaders/sphere_fs.glsl b/modules/base/shaders/sphere_fs.glsl index 98ecb7ff62..20843e5497 100644 --- a/modules/base/shaders/sphere_fs.glsl +++ b/modules/base/shaders/sphere_fs.glsl @@ -38,9 +38,48 @@ uniform vec2 dataMinMaxValues; uniform float opacity; uniform bool mirrorTexture; +const int Equirectangular = 0; +const int AngularFisheye = 1; +uniform int textureProjection; + +const float M_PI = 3.14159265358979323846; + +// Remap equirectangular texture coordinates into angular fisheye +vec2 equiToAngularFisheye(vec2 textureCoords) { + vec2 pos2 = textureCoords * 2.0 - 1.0; // Map [0,1] tex coords to [-1,1] + + // 2D equi to 3D vector + float lat = pos2.y * 0.5 * M_PI; + float lon = pos2.x * M_PI; + + // Map to 3D position, with Z being the north pole + vec3 pos3 = vec3( + cos(lat) * cos(lon), + sin(lat), + cos(lat) * sin(lon) + ); + + float coverAngle = M_PI; // 180 degrees + + // 3D vector to normalized 2D fisheye [-1,1] + float r = 2.0 / coverAngle * atan(sqrt(dot(pos3.xz, pos3.xz)), pos3.y); + float theta = atan(pos3.z, pos3.x); + vec2 fisheye2D = vec2(r * cos(theta), r * sin(theta)); + + if (r > 1.0) { + discard; // Invalid coordinates (outside fisheye frame) + } + + // Remap to [0,1] + return 0.5 * fisheye2D + 0.5; +} Fragment getFragment() { - vec2 texCoord = vs_textureCoords; + vec2 texCoord = vs_textureCoords; // Equirectangular + + if (textureProjection == AngularFisheye) { + texCoord = equiToAngularFisheye(vs_textureCoords); + } Fragment frag; if (mirrorTexture) { diff --git a/modules/base/shaders/sphere_vs.glsl b/modules/base/shaders/sphere_vs.glsl index d55d09f701..2944ac6c10 100644 --- a/modules/base/shaders/sphere_vs.glsl +++ b/modules/base/shaders/sphere_vs.glsl @@ -36,11 +36,10 @@ uniform mat4 modelViewProjection; uniform mat4 modelViewTransform; uniform mat3 modelViewRotation; - void main() { - vs_normal = modelViewRotation * normalize(in_position.xyz); vs_textureCoords = in_textureCoords; + vs_normal = modelViewRotation * normalize(in_position.xyz); vec4 position = modelViewProjection * vec4(in_position.xyz, 1.0); vs_position = modelViewTransform * vec4(in_position.xyz, 1.0); diff --git a/modules/video/src/renderablevideosphere.cpp b/modules/video/src/renderablevideosphere.cpp index 494696f5c5..0dd87e6340 100644 --- a/modules/video/src/renderablevideosphere.cpp +++ b/modules/video/src/renderablevideosphere.cpp @@ -29,7 +29,10 @@ #include namespace { - // This `Renderable` creates a textured 3D sphere where the texture is a video. + // This `Renderable` creates a textured 3D sphere where the texture is a video. Per + // default, the sphere uses an equirectangular projection for the image mapping + // and hence expects a video in equirectangular format. However, it can also be used + // to play fisheye videos by changing the `TextureProjection`. // // The video can either be played back based on a given simulation time // (`PlaybackMode` MapToSimulationTime) or through the user interface (for @@ -83,7 +86,8 @@ void RenderableVideoSphere::render(const RenderData& data, RendererTasks& render } } -void RenderableVideoSphere::update(const UpdateData&) { +void RenderableVideoSphere::update(const UpdateData& data) { + RenderableSphere::update(data); if (!_videoPlayer.isInitialized()) { return; } From e81129c42e687e2925fe098ffe913a384927d1b7 Mon Sep 17 00:00:00 2001 From: hn-88 Date: Thu, 4 Dec 2025 15:58:30 +0530 Subject: [PATCH 22/43] CMake 4 fixes for the MacOS build CMake 4.x requires consistency - once you use plain signature, all calls must be plain, or once you use keywords, all must use keywords. (#3858) --- modules/webbrowser/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/webbrowser/CMakeLists.txt b/modules/webbrowser/CMakeLists.txt index f4cc2a3ddc..188f3df8d0 100644 --- a/modules/webbrowser/CMakeLists.txt +++ b/modules/webbrowser/CMakeLists.txt @@ -201,7 +201,7 @@ if (OS_MACOSX) set_executable_target_properties(${target}) # add_cef_logical_target("libcef_lib" "${CEF_LIB_DEBUG}" "${CEF_LIB_RELEASE}") add_dependencies(${target} libcef_dll_wrapper) - target_link_libraries(${target} libcef_dll_wrapper ${CEF_STANDARD_LIBS}) + target_link_libraries(${target} PRIVATE libcef_dll_wrapper ${CEF_STANDARD_LIBS}) set_target_properties(${target} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/mac/helper-Info.plist OUTPUT_NAME "${target}_OUTPUT_NAME" @@ -212,7 +212,7 @@ if (OS_MACOSX) if (USE_SANDBOX) # Logical target used to link the cef_sandbox library. - target_link_libraries(${target} cef_sandbox_lib) + target_link_libraries(${target} PRIVATE cef_sandbox_lib) endif () endforeach() From 6b20d114c8f49cf51423e4f9d95392907c57e38a Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 8 Dec 2025 20:13:31 +0100 Subject: [PATCH 23/43] Global pass over optimizing includes (#3862) --- .../ext/launcher/src/backgroundimage.cpp | 1 - .../ext/launcher/src/launcherwindow.cpp | 20 ++- .../ext/launcher/src/notificationwindow.cpp | 2 - .../ext/launcher/src/profile/actiondialog.cpp | 6 +- .../src/profile/additionalscriptsdialog.cpp | 7 +- .../ext/launcher/src/profile/assetedit.cpp | 7 - .../ext/launcher/src/profile/assetsdialog.cpp | 2 +- .../launcher/src/profile/assettreemodel.cpp | 4 +- .../ext/launcher/src/profile/cameradialog.cpp | 6 - .../launcher/src/profile/deltatimesdialog.cpp | 14 +- .../launcher/src/profile/horizonsdialog.cpp | 9 +- .../launcher/src/profile/marknodesdialog.cpp | 7 +- .../ext/launcher/src/profile/metadialog.cpp | 4 +- .../launcher/src/profile/modulesdialog.cpp | 2 - .../ext/launcher/src/profile/profileedit.cpp | 5 +- .../launcher/src/profile/propertiesdialog.cpp | 6 - .../launcher/src/profile/scriptlogdialog.cpp | 12 +- .../ext/launcher/src/profile/timedialog.cpp | 6 +- .../ext/launcher/src/settingsdialog.cpp | 3 - .../src/sgctedit/displaywindowunion.cpp | 7 +- .../ext/launcher/src/sgctedit/monitorbox.cpp | 1 - .../ext/launcher/src/sgctedit/sgctedit.cpp | 3 - .../launcher/src/sgctedit/windowcontrol.cpp | 5 +- .../ext/launcher/src/splitcombobox.cpp | 2 - .../ext/launcher/src/windowcolors.cpp | 1 + apps/OpenSpace/ext/sgct | 2 +- ext/ghoul | 2 +- include/openspace/camera/camera.h | 2 +- include/openspace/data/dataloader.h | 2 - include/openspace/data/datamapping.h | 6 +- .../documentation/documentationengine.h | 3 +- include/openspace/engine/downloadmanager.h | 2 +- include/openspace/engine/moduleengine.inl | 16 +- include/openspace/engine/openspaceengine.h | 1 - include/openspace/engine/syncengine.h | 1 - include/openspace/events/event.h | 20 +-- .../interaction/camerainteractionstates.h | 4 +- .../interaction/joystickcamerastates.h | 1 - .../interaction/joystickinputstate.h | 3 - .../interaction/scriptcamerastates.h | 2 + .../interaction/websocketcamerastates.h | 1 - .../interaction/websocketinputstate.h | 2 - include/openspace/mission/missionmanager.h | 2 - .../openspace/navigation/navigationhandler.h | 3 - .../openspace/navigation/navigationstate.h | 4 +- .../openspace/navigation/orbitalnavigator.h | 1 - include/openspace/navigation/path.h | 4 +- .../pathcurves/avoidcollisioncurve.h | 2 + include/openspace/navigation/pathnavigator.h | 1 - .../openspace/network/parallelconnection.h | 2 +- include/openspace/network/parallelpeer.h | 1 - .../properties/list/stringlistproperty.h | 2 + .../openspace/properties/misc/listproperty.h | 1 + .../properties/misc/selectionproperty.h | 1 + .../openspace/rendering/framebufferrenderer.h | 2 - include/openspace/rendering/loadingscreen.h | 3 - include/openspace/rendering/luaconsole.h | 2 - include/openspace/rendering/renderable.h | 2 - include/openspace/rendering/renderengine.h | 16 +- .../rendering/screenspacerenderable.h | 1 - .../rendering/screenspacerenderabletext.h | 13 +- .../openspace/rendering/texturecomponent.h | 2 +- .../openspace/rendering/transferfunction.h | 2 - include/openspace/rendering/volumeraycaster.h | 2 - include/openspace/scene/profile.h | 1 - include/openspace/scene/scene.h | 1 - include/openspace/scene/scenegraphnode.h | 3 +- include/openspace/scene/timeframe.h | 1 - include/openspace/scripting/scriptengine.h | 1 - include/openspace/util/collisionhelper.h | 2 +- include/openspace/util/concurrentjobmanager.h | 4 +- .../openspace/util/concurrentjobmanager.inl | 10 +- include/openspace/util/concurrentqueue.inl | 1 - include/openspace/util/distanceconversion.h | 1 - .../util/dynamicfilesequencedownloader.h | 4 - include/openspace/util/ellipsoid.h | 1 - include/openspace/util/factorymanager.inl | 1 - include/openspace/util/job.h | 2 - include/openspace/util/json_helper.h | 3 +- include/openspace/util/json_helper.inl | 1 - include/openspace/util/keys.h | 3 +- include/openspace/util/planegeometry.h | 4 +- include/openspace/util/sphere.h | 2 +- include/openspace/util/spicemanager.h | 1 - include/openspace/util/syncbuffer.h | 1 - include/openspace/util/syncbuffer.inl | 1 - include/openspace/util/syncdata.h | 2 +- include/openspace/util/syncdata.inl | 20 +-- include/openspace/util/threadpool.h | 2 +- include/openspace/util/timeconversion.h | 1 - include/openspace/util/timeline.h | 2 - include/openspace/util/timeline.inl | 2 + include/openspace/util/touch.h | 1 - .../rendering/renderablefieldlinessequence.h | 1 + .../fitsfilereader/include/fitsfilereader.h | 16 +- .../include/renderabletimevaryingfitssphere.h | 1 + .../fitsfilereader/include/wsafitshelper.h | 4 +- modules/fitsfilereader/src/fitsfilereader.cpp | 6 +- modules/fitsfilereader/src/wsafitshelper.cpp | 4 +- modules/globebrowsing/src/lrucache.inl | 30 ++-- modules/globebrowsing/src/lruthreadpool.h | 6 +- modules/globebrowsing/src/lruthreadpool.inl | 20 +-- .../src/prioritizingconcurrentjobmanager.h | 2 +- .../rendering/renderablemultiresvolume.cpp | 1 + modules/server/include/serverinterface.h | 3 +- modules/server/src/serverinterface.cpp | 1 - modules/volume/lrucache.h | 4 +- modules/volume/lrucache.inl | 34 ++-- modules/volume/rawvolume.inl | 2 +- src/camera/camera.cpp | 1 - src/data/csvloader.cpp | 1 + src/data/dataloader.cpp | 2 - src/data/speckloader.cpp | 5 - src/documentation/documentation.cpp | 4 +- src/documentation/documentationengine.cpp | 170 +++++++++--------- src/engine/configuration.cpp | 17 +- src/engine/downloadmanager.cpp | 10 +- src/engine/globals.cpp | 3 - src/engine/logfactory.cpp | 2 - src/engine/moduleengine.cpp | 2 - src/engine/moduleengine_lua.inl | 6 +- src/engine/openspaceengine.cpp | 6 - src/engine/openspaceengine_lua.inl | 23 ++- src/engine/settings.cpp | 5 +- src/engine/syncengine.cpp | 2 +- src/events/event.cpp | 52 +++--- src/interaction/actionmanager_lua.inl | 25 +-- src/interaction/interactionmonitor.cpp | 1 - src/interaction/joystickcamerastates.cpp | 1 - src/interaction/joystickinputstate.cpp | 2 - src/interaction/keybindingmanager.cpp | 4 - src/interaction/websocketcamerastates.cpp | 6 +- src/interaction/websocketinputstate.cpp | 3 - src/mission/mission.cpp | 3 +- src/mission/missionmanager.cpp | 4 - src/navigation/keyframenavigator.cpp | 3 - src/navigation/navigationhandler.cpp | 4 - src/navigation/navigationhandler_lua.inl | 1 - src/navigation/navigationstate.cpp | 3 +- src/navigation/orbitalnavigator.cpp | 4 +- src/navigation/orbitalnavigator_lua.inl | 10 +- src/navigation/path.cpp | 3 - src/navigation/pathcurve.cpp | 4 - .../pathcurves/avoidcollisioncurve.cpp | 3 - .../pathcurves/zoomoutoverviewcurve.cpp | 3 - src/navigation/pathnavigator.cpp | 8 - src/navigation/waypoint.cpp | 1 - src/network/parallelconnection.cpp | 2 - src/properties/list/doublelistproperty.cpp | 3 - src/properties/list/intlistproperty.cpp | 3 - src/properties/list/stringlistproperty.cpp | 3 - src/properties/matrix/dmat2property.cpp | 3 +- src/properties/matrix/dmat3property.cpp | 3 +- src/properties/matrix/dmat4property.cpp | 3 +- src/properties/matrix/mat2property.cpp | 3 +- src/properties/matrix/mat3property.cpp | 3 +- src/properties/matrix/mat4property.cpp | 3 +- src/properties/misc/selectionproperty.cpp | 2 - src/properties/property.cpp | 2 - src/properties/propertyowner.cpp | 1 - src/properties/scalar/doubleproperty.cpp | 4 +- src/properties/scalar/floatproperty.cpp | 4 +- src/properties/scalar/intproperty.cpp | 4 +- src/properties/scalar/longproperty.cpp | 4 +- src/properties/scalar/shortproperty.cpp | 4 +- src/properties/scalar/uintproperty.cpp | 4 +- src/properties/scalar/ulongproperty.cpp | 4 +- src/properties/scalar/ushortproperty.cpp | 4 +- src/properties/vector/dvec2property.cpp | 3 +- src/properties/vector/dvec3property.cpp | 3 +- src/properties/vector/dvec4property.cpp | 3 +- src/properties/vector/ivec2property.cpp | 3 +- src/properties/vector/ivec3property.cpp | 3 +- src/properties/vector/ivec4property.cpp | 3 +- src/properties/vector/uvec2property.cpp | 3 +- src/properties/vector/uvec3property.cpp | 3 +- src/properties/vector/uvec4property.cpp | 3 +- src/properties/vector/vec2property.cpp | 3 +- src/properties/vector/vec3property.cpp | 3 +- src/properties/vector/vec4property.cpp | 3 +- src/rendering/colormappingcomponent.cpp | 2 - src/rendering/dashboard.cpp | 3 +- src/rendering/dashboarditem.cpp | 2 - src/rendering/dashboardtextitem.cpp | 1 - src/rendering/deferredcastermanager.cpp | 1 - src/rendering/fadeable.cpp | 4 - src/rendering/framebufferrenderer.cpp | 2 - src/rendering/helper.cpp | 3 +- src/rendering/loadingscreen.cpp | 3 - src/rendering/luaconsole.cpp | 1 - src/rendering/raycastermanager.cpp | 1 - src/rendering/renderable.cpp | 1 - src/rendering/renderengine.cpp | 9 - src/rendering/renderengine_lua.inl | 14 +- .../screenspacerenderableframebuffer.cpp | 3 - src/rendering/texturecomponent.cpp | 1 - src/rendering/transferfunction.cpp | 3 +- src/scene/asset.cpp | 3 - src/scene/assetmanager.cpp | 2 +- src/scene/assetmanager_lua.inl | 3 + src/scene/profile.cpp | 5 - src/scene/rotation.cpp | 2 - src/scene/scale.cpp | 2 - src/scene/scene_lua.inl | 1 - src/scene/timeframe.cpp | 4 - src/scene/translation.cpp | 2 - src/scripting/scriptengine.cpp | 3 - src/scripting/scriptscheduler.cpp | 1 - src/scripting/scriptscheduler_lua.inl | 12 +- src/scripting/systemcapabilitiesbinding.cpp | 5 - .../systemcapabilitiesbinding_lua.inl | 4 + src/util/boxgeometry.cpp | 2 - src/util/collisionhelper.cpp | 2 - src/util/coordinateconversion.cpp | 1 - src/util/distanceconversion.cpp | 2 - src/util/dynamicfilesequencedownloader.cpp | 4 +- src/util/factorymanager.cpp | 1 - src/util/geodetic.cpp | 1 - src/util/httprequest.cpp | 2 - src/util/json_helper.cpp | 2 +- src/util/keys.cpp | 1 - src/util/openspacemodule.cpp | 1 - src/util/planegeometry.cpp | 6 +- src/util/spicemanager.cpp | 5 - src/util/spicemanager_lua.inl | 1 + src/util/syncbuffer.cpp | 1 - src/util/taskloader.cpp | 2 - src/util/time.cpp | 11 +- src/util/time_lua.inl | 3 +- src/util/timeconversion.cpp | 4 - src/util/timemanager.cpp | 1 - src/util/timerange.cpp | 1 - support/coding/codegen | 2 +- tests/test_profile.cpp | 6 +- 234 files changed, 459 insertions(+), 710 deletions(-) diff --git a/apps/OpenSpace/ext/launcher/src/backgroundimage.cpp b/apps/OpenSpace/ext/launcher/src/backgroundimage.cpp index c9582e7d25..91868b8fbe 100644 --- a/apps/OpenSpace/ext/launcher/src/backgroundimage.cpp +++ b/apps/OpenSpace/ext/launcher/src/backgroundimage.cpp @@ -26,7 +26,6 @@ #include #include -#include #include BackgroundImage::BackgroundImage(QRect size, const std::filesystem::path& syncFolder, diff --git a/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp b/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp index 9522db71bc..b6ca263267 100644 --- a/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp +++ b/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp @@ -31,17 +31,14 @@ #include "splitcombobox.h" #include #include -#include +#include #include #include #include -#include #include #include #include -#include #include -#include #include using namespace openspace; @@ -148,9 +145,18 @@ LauncherWindow::LauncherWindow(bool profileEnabled, const Configuration& globalC { QFile file(":/qss/launcher.qss"); - file.open(QFile::ReadOnly); - const QString styleSheet = QLatin1String(file.readAll()); - setStyleSheet(styleSheet); + const bool success = file.open(QFile::ReadOnly); + if (!success) { + QMessageBox::critical( + this, + "Missing QSS", + "Could not find launcher.qss" + ); + } + else { + const QString styleSheet = QLatin1String(file.readAll()); + setStyleSheet(styleSheet); + } } QWidget* centralWidget = new QWidget; diff --git a/apps/OpenSpace/ext/launcher/src/notificationwindow.cpp b/apps/OpenSpace/ext/launcher/src/notificationwindow.cpp index b154cf8d75..a50dd9ffd9 100644 --- a/apps/OpenSpace/ext/launcher/src/notificationwindow.cpp +++ b/apps/OpenSpace/ext/launcher/src/notificationwindow.cpp @@ -31,11 +31,9 @@ #include #include #include -#include #include #include #include -#include #include using namespace openspace; diff --git a/apps/OpenSpace/ext/launcher/src/profile/actiondialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/actiondialog.cpp index a1ba99e755..c4174d2794 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/actiondialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/actiondialog.cpp @@ -27,21 +27,19 @@ #include "profile/line.h" #include "profile/scriptlogdialog.h" #include -#include #include #include #include #include #include #include -#include #include #include -#include +#include #include #include #include -#include +#include using namespace openspace; diff --git a/apps/OpenSpace/ext/launcher/src/profile/additionalscriptsdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/additionalscriptsdialog.cpp index 245b2f8ec3..8cfcb05c9a 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/additionalscriptsdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/additionalscriptsdialog.cpp @@ -26,15 +26,18 @@ #include "profile/line.h" #include "profile/scriptlogdialog.h" -#include #include #include #include #include #include #include -#include +#include +#include #include +#include +#include +#include AdditionalScriptsDialog::AdditionalScriptsDialog(QWidget* parent, std::vector* scripts) diff --git a/apps/OpenSpace/ext/launcher/src/profile/assetedit.cpp b/apps/OpenSpace/ext/launcher/src/profile/assetedit.cpp index 0ea4ab91bf..c5922e0b5d 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/assetedit.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/assetedit.cpp @@ -26,17 +26,10 @@ #include "profile/horizonsdialog.h" #include "profile/line.h" -#include -#include #include -#include #include -#include #include #include -#include -#include -#include AssetEdit::AssetEdit(QWidget* parent) : QDialog(parent) diff --git a/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp index 1481d7cce5..b11ca492fc 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp @@ -27,7 +27,6 @@ #include "profile/assetedit.h" #include "profile/line.h" #include -#include #include #include #include @@ -35,6 +34,7 @@ #include #include #include +#include namespace { bool traverseToExpandSelectedItems(QTreeView& tree, AssetTreeModel& model, int rows, diff --git a/apps/OpenSpace/ext/launcher/src/profile/assettreemodel.cpp b/apps/OpenSpace/ext/launcher/src/profile/assettreemodel.cpp index f025897a14..9eab2845e0 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/assettreemodel.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/assettreemodel.cpp @@ -22,12 +22,12 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include "profile/assettreeitem.h" #include "profile/assettreemodel.h" + +#include "profile/assettreeitem.h" #include "filesystemaccess.h" #include #include -#include namespace { constexpr std::string_view Header1 = "Asset"; diff --git a/apps/OpenSpace/ext/launcher/src/profile/cameradialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/cameradialog.cpp index fdc0e9baa8..1b6930c151 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/cameradialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/cameradialog.cpp @@ -27,17 +27,11 @@ #include "profile/line.h" #include #include -#include #include -#include #include -#include #include -#include #include -#include #include -#include #include namespace { diff --git a/apps/OpenSpace/ext/launcher/src/profile/deltatimesdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/deltatimesdialog.cpp index 79f5b47bfa..b901ed4032 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/deltatimesdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/deltatimesdialog.cpp @@ -25,22 +25,24 @@ #include "profile/deltatimesdialog.h" #include "profile/line.h" -#include -#include #include #include -#include -#include #include #include #include -#include #include #include #include -#include #include +#include +#include +#include #include +#include +#include +#include +#include +#include namespace { constexpr int MaxNumberOfKeys = 30; diff --git a/apps/OpenSpace/ext/launcher/src/profile/horizonsdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/horizonsdialog.cpp index ac71422aea..0d2d7bcf24 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/horizonsdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/horizonsdialog.cpp @@ -26,9 +26,7 @@ #include "profile/line.h" #include -#include #include -#include #include #include #include @@ -36,7 +34,6 @@ #include #include #include -#include #include #include #include @@ -44,12 +41,10 @@ #include #include #include -#include +#include +#include #include -//using json = nlohmann::json; -//using namespace openspace; - namespace { constexpr std::string_view _loggerCat = "HorizonsDialog"; diff --git a/apps/OpenSpace/ext/launcher/src/profile/marknodesdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/marknodesdialog.cpp index bb1a664e18..b6310dddb7 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/marknodesdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/marknodesdialog.cpp @@ -25,15 +25,16 @@ #include "profile/marknodesdialog.h" #include "profile/line.h" -#include #include -#include #include #include -#include #include #include #include +#include +#include +#include +#include MarkNodesDialog::MarkNodesDialog(QWidget* parent, std::vector* markedNodes) : QDialog(parent) diff --git a/apps/OpenSpace/ext/launcher/src/profile/metadialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/metadialog.cpp index 4fd0342c1f..c1d60ca3e8 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/metadialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/metadialog.cpp @@ -27,12 +27,10 @@ #include "profile/line.h" #include #include -#include #include -#include #include #include -#include +#include MetaDialog::MetaDialog(QWidget* parent, std::optional* meta) : QDialog(parent) diff --git a/apps/OpenSpace/ext/launcher/src/profile/modulesdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/modulesdialog.cpp index d59b23d032..1b7588b5e3 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/modulesdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/modulesdialog.cpp @@ -26,11 +26,9 @@ #include "profile/line.h" #include -#include #include #include #include -#include #include #include #include diff --git a/apps/OpenSpace/ext/launcher/src/profile/profileedit.cpp b/apps/OpenSpace/ext/launcher/src/profile/profileedit.cpp index 1b562035f6..ce3ec6f5d4 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/profileedit.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/profileedit.cpp @@ -37,20 +37,19 @@ #include "profile/timedialog.h" #include "profile/uipanelsdialog.h" #include -#include #include #include #include #include -#include #include #include #include #include #include +#include #include #include -#include +#include #ifdef WIN32 #include diff --git a/apps/OpenSpace/ext/launcher/src/profile/propertiesdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/propertiesdialog.cpp index 168953a12a..4602f71e38 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/propertiesdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/propertiesdialog.cpp @@ -26,20 +26,14 @@ #include "profile/line.h" #include "profile/scriptlogdialog.h" -#include #include #include -#include -#include #include #include -#include #include #include #include -#include #include -#include using namespace openspace; diff --git a/apps/OpenSpace/ext/launcher/src/profile/scriptlogdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/scriptlogdialog.cpp index 7a88ce9c57..dd318b90c8 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/scriptlogdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/scriptlogdialog.cpp @@ -27,19 +27,21 @@ #include "profile/line.h" #include #include -#include #include -#include #include #include #include #include -#include #include -#include #include -#include #include +#include +#include +#include +#include +#include +#include +#include ScriptLogDialog::ScriptLogDialog(QWidget* parent, std::string filter) : QDialog(parent) diff --git a/apps/OpenSpace/ext/launcher/src/profile/timedialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/timedialog.cpp index a1c86a2f7b..d7bde8ec34 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/timedialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/timedialog.cpp @@ -26,16 +26,12 @@ #include "profile/line.h" #include -#include #include #include -#include #include -#include -#include #include #include -#include +#include using namespace openspace; diff --git a/apps/OpenSpace/ext/launcher/src/settingsdialog.cpp b/apps/OpenSpace/ext/launcher/src/settingsdialog.cpp index 5e943f99c3..11508a9004 100644 --- a/apps/OpenSpace/ext/launcher/src/settingsdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/settingsdialog.cpp @@ -25,14 +25,11 @@ #include "settingsdialog.h" #include "profile/line.h" - #include #include #include #include #include -#include -#include #include SettingsDialog::SettingsDialog(openspace::Settings settings, QWidget* parent) diff --git a/apps/OpenSpace/ext/launcher/src/sgctedit/displaywindowunion.cpp b/apps/OpenSpace/ext/launcher/src/sgctedit/displaywindowunion.cpp index 87da6cdc2a..92d26a3018 100644 --- a/apps/OpenSpace/ext/launcher/src/sgctedit/displaywindowunion.cpp +++ b/apps/OpenSpace/ext/launcher/src/sgctedit/displaywindowunion.cpp @@ -25,14 +25,11 @@ #include "sgctedit/displaywindowunion.h" #include "sgctedit/windowcontrol.h" -#include #include -#include -#include #include #include -#include -#include +#include +#include namespace { template struct overloaded : Ts... { using Ts::operator()...; }; diff --git a/apps/OpenSpace/ext/launcher/src/sgctedit/monitorbox.cpp b/apps/OpenSpace/ext/launcher/src/sgctedit/monitorbox.cpp index 95eb18c98a..930c83dc0a 100644 --- a/apps/OpenSpace/ext/launcher/src/sgctedit/monitorbox.cpp +++ b/apps/OpenSpace/ext/launcher/src/sgctedit/monitorbox.cpp @@ -24,7 +24,6 @@ #include "sgctedit/monitorbox.h" -#include #include "windowcolors.h" #include diff --git a/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp b/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp index 733dc087b6..5e7e65dfe8 100644 --- a/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp +++ b/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp @@ -26,13 +26,10 @@ #include #include -#include #include #include #include #include -#include -#include #include #include #include diff --git a/apps/OpenSpace/ext/launcher/src/sgctedit/windowcontrol.cpp b/apps/OpenSpace/ext/launcher/src/sgctedit/windowcontrol.cpp index deddf743ef..f671b2326a 100644 --- a/apps/OpenSpace/ext/launcher/src/sgctedit/windowcontrol.cpp +++ b/apps/OpenSpace/ext/launcher/src/sgctedit/windowcontrol.cpp @@ -24,19 +24,18 @@ #include "sgctedit/windowcontrol.h" -#include #include -#include "sgctedit/displaywindowunion.h" #include "windowcolors.h" #include #include #include #include #include -#include #include #include +#include #include +#include namespace { std::array, 10> Quality = { diff --git a/apps/OpenSpace/ext/launcher/src/splitcombobox.cpp b/apps/OpenSpace/ext/launcher/src/splitcombobox.cpp index c97e2b2f36..d34f6865ca 100644 --- a/apps/OpenSpace/ext/launcher/src/splitcombobox.cpp +++ b/apps/OpenSpace/ext/launcher/src/splitcombobox.cpp @@ -26,8 +26,6 @@ #include "usericon.h" #include -#include -#include #include SplitComboBox::SplitComboBox(QWidget* parent, std::filesystem::path userPath, diff --git a/apps/OpenSpace/ext/launcher/src/windowcolors.cpp b/apps/OpenSpace/ext/launcher/src/windowcolors.cpp index 7bedcbb6b1..aa05f1a384 100644 --- a/apps/OpenSpace/ext/launcher/src/windowcolors.cpp +++ b/apps/OpenSpace/ext/launcher/src/windowcolors.cpp @@ -25,6 +25,7 @@ #include "windowcolors.h" #include +#include QColor colorForWindow(int idx) { constexpr std::array Hardcoded = { diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index 98be6301fb..c3ae514b21 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit 98be6301fb8884f4c3906c52e67d2786593f6da6 +Subproject commit c3ae514b21e97e74c7dc36597a3ac65a785cc987 diff --git a/ext/ghoul b/ext/ghoul index b274675f3d..50315734cb 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit b274675f3de2cffeef995def4247e5d0fbf50693 +Subproject commit 50315734cb1f3f5bd2fbfb60d599bccdfc2e8262 diff --git a/include/openspace/camera/camera.h b/include/openspace/camera/camera.h index 298391f336..bb1424d488 100644 --- a/include/openspace/camera/camera.h +++ b/include/openspace/camera/camera.h @@ -56,7 +56,7 @@ public: * Used to explicitly show which variables within the Camera class that are used * for caching. */ - template + template struct Cached { T datum = T(0); bool isDirty = true; diff --git a/include/openspace/data/dataloader.h b/include/openspace/data/dataloader.h index c0f22cc7de..0e9a173454 100644 --- a/include/openspace/data/dataloader.h +++ b/include/openspace/data/dataloader.h @@ -27,8 +27,6 @@ #include #include -#include -#include #include #include #include diff --git a/include/openspace/data/datamapping.h b/include/openspace/data/datamapping.h index 5554c630d9..da203e690d 100644 --- a/include/openspace/data/datamapping.h +++ b/include/openspace/data/datamapping.h @@ -29,8 +29,8 @@ #include #include -namespace openspace::documentation { struct Documentation; } namespace ghoul { class Dictionary; } +namespace openspace::documentation { struct Documentation; } namespace openspace::dataloader { @@ -62,8 +62,8 @@ struct DataMapping { }; /** - * Generate a string based on the data mapping, that can be used to uniquely - * identify the dataset. + * Generate a string based on the data mapping, that can be used to uniquely identify the + * dataset. */ std::string generateHashString(const DataMapping& dm); diff --git a/include/openspace/documentation/documentationengine.h b/include/openspace/documentation/documentationengine.h index 4b8c08e1bc..25690c4778 100644 --- a/include/openspace/documentation/documentationengine.h +++ b/include/openspace/documentation/documentationengine.h @@ -28,13 +28,12 @@ #include #include #include -#include namespace openspace::documentation { /** * The DocumentationEngine has the ability to collect all Documentation%s that are - * produced in the application an write them out as a documentation file for human + * produced in the application and write them out as a documentation file for human * consumption. */ class DocumentationEngine { diff --git a/include/openspace/engine/downloadmanager.h b/include/openspace/engine/downloadmanager.h index 5f49f0a07d..54519e4c71 100644 --- a/include/openspace/engine/downloadmanager.h +++ b/include/openspace/engine/downloadmanager.h @@ -84,7 +84,7 @@ public: // Just a helper function to check if a future is ready to ".get()". Not specific // to DownloadManager but is useful for anyone using the DownloadManager - template + template static bool futureReady(std::future const& f) { return f.wait_for(std::chrono::seconds(0)) == std::future_status::ready; } diff --git a/include/openspace/engine/moduleengine.inl b/include/openspace/engine/moduleengine.inl index c53d2105af..ca8cc74deb 100644 --- a/include/openspace/engine/moduleengine.inl +++ b/include/openspace/engine/moduleengine.inl @@ -30,16 +30,14 @@ namespace openspace { template ModuleSubClass* ModuleEngine::module() const { - const auto it = std::find_if(_modules.begin(), _modules.end(), + const auto it = std::find_if( + _modules.begin(), + _modules.end(), [](const std::unique_ptr& m) { - return m->identifier() == ModuleSubClass::Name; - }); - if (it != _modules.end()) { - return dynamic_cast(it->get()); - } - else { - return nullptr; - } + return m->identifier() == ModuleSubClass::Name; + } + ); + return it != _modules.end() ? dynamic_cast(it->get()) : nullptr; } } // namespace openspace diff --git a/include/openspace/engine/openspaceengine.h b/include/openspace/engine/openspaceengine.h index 597d09f295..a9cc5400e4 100644 --- a/include/openspace/engine/openspaceengine.h +++ b/include/openspace/engine/openspaceengine.h @@ -27,7 +27,6 @@ #include #include -#include #include #include #include diff --git a/include/openspace/engine/syncengine.h b/include/openspace/engine/syncengine.h index d26907f22e..3da9fbea23 100644 --- a/include/openspace/engine/syncengine.h +++ b/include/openspace/engine/syncengine.h @@ -28,7 +28,6 @@ #include #include -#include #include namespace openspace { diff --git a/include/openspace/events/event.h b/include/openspace/events/event.h index 012bb29936..02a1eea501 100644 --- a/include/openspace/events/event.h +++ b/include/openspace/events/event.h @@ -30,15 +30,15 @@ #include namespace openspace { - namespace properties { class Property; } +namespace properties { class Property; } - class Camera; - class Layer; - class Profile; - class Renderable; - class SceneGraphNode; - class ScreenSpaceRenderable; - class Time; +class Camera; +class Layer; +class Profile; +class Renderable; +class SceneGraphNode; +class ScreenSpaceRenderable; +class Time; } // namespace openspace namespace openspace::events { @@ -171,8 +171,8 @@ struct EventAssetLoading : public Event { * Creates an instance of an AssetLoading event. * * \param assetPath_ The path to the asset - * \param state_ The new state of the asset given by 'asstPath_'; is one of `Loading`, - * `Loaded`, `Unloaded`, or `Error` + * \param newState The new state of the asset given by 'asstPath_'; is one of + `Loading`, `Loaded`, `Unloaded`, or `Error` */ EventAssetLoading(const std::filesystem::path& assetPath_, State newState); diff --git a/include/openspace/interaction/camerainteractionstates.h b/include/openspace/interaction/camerainteractionstates.h index edd300a4dc..4a4dc2c744 100644 --- a/include/openspace/interaction/camerainteractionstates.h +++ b/include/openspace/interaction/camerainteractionstates.h @@ -55,7 +55,7 @@ public: void resetVelocities(); /** - * Returns true if any of the velocities are larger than zero, i.e. wether an + * Returns true if any of the velocities are larger than zero, i.e. whether an * interaction happened. */ bool hasNonZeroVelocities(bool checkOnlyMovement = false) const; @@ -63,7 +63,7 @@ public: protected: template struct InteractionState { - InteractionState(double scaleFactor); + explicit InteractionState(double scaleFactor); void setFriction(double friction); void setVelocityScaleFactor(double scaleFactor); diff --git a/include/openspace/interaction/joystickcamerastates.h b/include/openspace/interaction/joystickcamerastates.h index edd4e86bc3..f2c0adaa73 100644 --- a/include/openspace/interaction/joystickcamerastates.h +++ b/include/openspace/interaction/joystickcamerastates.h @@ -29,7 +29,6 @@ #include #include -#include #include #include diff --git a/include/openspace/interaction/joystickinputstate.h b/include/openspace/interaction/joystickinputstate.h index 12b81e1ee4..eee1e65bd0 100644 --- a/include/openspace/interaction/joystickinputstate.h +++ b/include/openspace/interaction/joystickinputstate.h @@ -25,12 +25,9 @@ #ifndef __OPENSPACE_CORE___JOYSTICKINPUTSTATE___H__ #define __OPENSPACE_CORE___JOYSTICKINPUTSTATE___H__ -#include #include #include -#include #include -#include #include namespace openspace::interaction { diff --git a/include/openspace/interaction/scriptcamerastates.h b/include/openspace/interaction/scriptcamerastates.h index f9617f5cc3..342f736d87 100644 --- a/include/openspace/interaction/scriptcamerastates.h +++ b/include/openspace/interaction/scriptcamerastates.h @@ -27,6 +27,8 @@ #include +#include + namespace openspace::interaction { class ScriptCameraStates : public CameraInteractionStates { diff --git a/include/openspace/interaction/websocketcamerastates.h b/include/openspace/interaction/websocketcamerastates.h index 2fc50547bf..3e5c80ce92 100644 --- a/include/openspace/interaction/websocketcamerastates.h +++ b/include/openspace/interaction/websocketcamerastates.h @@ -29,7 +29,6 @@ #include #include -#include #include #include diff --git a/include/openspace/interaction/websocketinputstate.h b/include/openspace/interaction/websocketinputstate.h index 593fb22394..1251948ba4 100644 --- a/include/openspace/interaction/websocketinputstate.h +++ b/include/openspace/interaction/websocketinputstate.h @@ -27,9 +27,7 @@ #include #include -#include #include -#include #include #include diff --git a/include/openspace/mission/missionmanager.h b/include/openspace/mission/missionmanager.h index 50bd573e47..b6200d67ac 100644 --- a/include/openspace/mission/missionmanager.h +++ b/include/openspace/mission/missionmanager.h @@ -27,8 +27,6 @@ #include -#include -#include #include #include diff --git a/include/openspace/navigation/navigationhandler.h b/include/openspace/navigation/navigationhandler.h index 9e4b598cd5..053f6526b4 100644 --- a/include/openspace/navigation/navigationhandler.h +++ b/include/openspace/navigation/navigationhandler.h @@ -51,10 +51,7 @@ namespace openspace::scripting { struct LuaLibrary; } namespace openspace::interaction { struct JoystickInputStates; -class KeyframeNavigator; struct NavigationState; -class OrbitalNavigator; -class PathNavigator; struct NodeCameraStateSpec; struct WebsocketInputStates; diff --git a/include/openspace/navigation/navigationstate.h b/include/openspace/navigation/navigationstate.h index ced0f6dd3b..fec5b79d04 100644 --- a/include/openspace/navigation/navigationstate.h +++ b/include/openspace/navigation/navigationstate.h @@ -29,9 +29,7 @@ #include #include -namespace openspace { - struct CameraPose; -} // namespace openspace +namespace openspace { struct CameraPose; } namespace openspace::interaction { diff --git a/include/openspace/navigation/orbitalnavigator.h b/include/openspace/navigation/orbitalnavigator.h index f3601b7bc3..37061bbbc3 100644 --- a/include/openspace/navigation/orbitalnavigator.h +++ b/include/openspace/navigation/orbitalnavigator.h @@ -27,7 +27,6 @@ #include -#include #include #include #include diff --git a/include/openspace/navigation/path.h b/include/openspace/navigation/path.h index ffa0661a57..2b3680f677 100644 --- a/include/openspace/navigation/path.h +++ b/include/openspace/navigation/path.h @@ -32,9 +32,7 @@ #include #include -namespace openspace { - struct CameraPose; -} // namespace openspace +namespace openspace { struct CameraPose; } namespace openspace::interaction { diff --git a/include/openspace/navigation/pathcurves/avoidcollisioncurve.h b/include/openspace/navigation/pathcurves/avoidcollisioncurve.h index f42257f2f3..034a6f926c 100644 --- a/include/openspace/navigation/pathcurves/avoidcollisioncurve.h +++ b/include/openspace/navigation/pathcurves/avoidcollisioncurve.h @@ -27,6 +27,8 @@ #include +#include + namespace openspace { class SceneGraphNode; } namespace openspace::interaction { diff --git a/include/openspace/navigation/pathnavigator.h b/include/openspace/navigation/pathnavigator.h index 1cc0633d19..8f157dd7e9 100644 --- a/include/openspace/navigation/pathnavigator.h +++ b/include/openspace/navigation/pathnavigator.h @@ -33,7 +33,6 @@ #include #include #include -#include #include namespace openspace { diff --git a/include/openspace/network/parallelconnection.h b/include/openspace/network/parallelconnection.h index 1eebac617c..59382c3c7a 100644 --- a/include/openspace/network/parallelconnection.h +++ b/include/openspace/network/parallelconnection.h @@ -32,7 +32,7 @@ namespace openspace { -class ParallelConnection { +class ParallelConnection { public: enum class Status : uint32_t { Disconnected = 0, diff --git a/include/openspace/network/parallelpeer.h b/include/openspace/network/parallelpeer.h index a5cbbeab39..f03bf09f6b 100644 --- a/include/openspace/network/parallelpeer.h +++ b/include/openspace/network/parallelpeer.h @@ -27,7 +27,6 @@ #include -#include #include #include #include diff --git a/include/openspace/properties/list/stringlistproperty.h b/include/openspace/properties/list/stringlistproperty.h index ca56b50aea..25eb12e441 100644 --- a/include/openspace/properties/list/stringlistproperty.h +++ b/include/openspace/properties/list/stringlistproperty.h @@ -26,7 +26,9 @@ #define __OPENSPACE_CORE___STRINGLISTPROPERTY___H__ #include + #include +#include namespace openspace::properties { diff --git a/include/openspace/properties/misc/listproperty.h b/include/openspace/properties/misc/listproperty.h index aa70fb3d21..2453549adc 100644 --- a/include/openspace/properties/misc/listproperty.h +++ b/include/openspace/properties/misc/listproperty.h @@ -26,6 +26,7 @@ #define __OPENSPACE_CORE___LISTPROPERTY___H__ #include + #include namespace openspace::properties { diff --git a/include/openspace/properties/misc/selectionproperty.h b/include/openspace/properties/misc/selectionproperty.h index 17c0c24023..8542bb308f 100644 --- a/include/openspace/properties/misc/selectionproperty.h +++ b/include/openspace/properties/misc/selectionproperty.h @@ -28,6 +28,7 @@ #include #include +#include #include namespace openspace::properties { diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index e71718d978..8447ed381a 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -29,11 +29,9 @@ #include #include -#include #include #include #include -#include #include namespace ghoul { class Dictionary; } diff --git a/include/openspace/rendering/loadingscreen.h b/include/openspace/rendering/loadingscreen.h index cdb7f2f27b..a291b1ef25 100644 --- a/include/openspace/rendering/loadingscreen.h +++ b/include/openspace/rendering/loadingscreen.h @@ -28,9 +28,6 @@ #include #include #include -#include -#include -#include #include #include #include diff --git a/include/openspace/rendering/luaconsole.h b/include/openspace/rendering/luaconsole.h index 03095dc516..f21cf5c72c 100644 --- a/include/openspace/rendering/luaconsole.h +++ b/include/openspace/rendering/luaconsole.h @@ -32,8 +32,6 @@ #include #include #include -#include -#include #include #include #include diff --git a/include/openspace/rendering/renderable.h b/include/openspace/rendering/renderable.h index f434928015..5a91fe8948 100644 --- a/include/openspace/rendering/renderable.h +++ b/include/openspace/rendering/renderable.h @@ -30,8 +30,6 @@ #include #include -#include -#include #include #include #include diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index d1e2ceb207..210ea4f002 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -28,8 +28,6 @@ #include #include -#include -#include #include #include #include @@ -40,14 +38,14 @@ #include namespace ghoul { - namespace fontrendering { class Font; } - namespace opengl { - class ProgramObject; - class OpenGLStateCache; - } // namespace opengl +namespace fontrendering { class Font; } +namespace opengl { + class ProgramObject; + class OpenGLStateCache; +} // namespace opengl - class Dictionary; - class SharedMemory; +class Dictionary; +class SharedMemory; } // ghoul namespace openspace { diff --git a/include/openspace/rendering/screenspacerenderable.h b/include/openspace/rendering/screenspacerenderable.h index 47c7cd4b68..e2bf58921a 100644 --- a/include/openspace/rendering/screenspacerenderable.h +++ b/include/openspace/rendering/screenspacerenderable.h @@ -33,7 +33,6 @@ #include #include #include -#include #include #include diff --git a/include/openspace/rendering/screenspacerenderabletext.h b/include/openspace/rendering/screenspacerenderabletext.h index ed5f10429e..50f8cc339c 100644 --- a/include/openspace/rendering/screenspacerenderabletext.h +++ b/include/openspace/rendering/screenspacerenderabletext.h @@ -31,12 +31,17 @@ #include #include -namespace ghoul { class Dictionary; } -namespace ghoul::opengl { +namespace ghoul { + +class Dictionary; + +namespace fontrendering { class Font; } +namespace opengl { class FramebufferObject; class Texture; -} // namespace ghoul::opengl -namespace ghoul::fontrendering { class Font; } +} // namespace opengl + +} // namespace ghoul namespace openspace { diff --git a/include/openspace/rendering/texturecomponent.h b/include/openspace/rendering/texturecomponent.h index 5b623d8907..88500194c1 100644 --- a/include/openspace/rendering/texturecomponent.h +++ b/include/openspace/rendering/texturecomponent.h @@ -29,7 +29,7 @@ #include namespace ghoul::filesystem { class File; } -namespace ghoul::opengl {class Texture; } +namespace ghoul::opengl { class Texture; } namespace openspace { diff --git a/include/openspace/rendering/transferfunction.h b/include/openspace/rendering/transferfunction.h index 1b0fe415c5..045af80965 100644 --- a/include/openspace/rendering/transferfunction.h +++ b/include/openspace/rendering/transferfunction.h @@ -29,7 +29,6 @@ #include #include #include -#include namespace ghoul::filesystem { class File; } namespace ghoul::opengl { class Texture; } @@ -57,7 +56,6 @@ public: private: void setTextureFromImage(); - void uploadTexture(); std::filesystem::path _filepath; std::unique_ptr _file; diff --git a/include/openspace/rendering/volumeraycaster.h b/include/openspace/rendering/volumeraycaster.h index f9d8809e39..135cf488f3 100644 --- a/include/openspace/rendering/volumeraycaster.h +++ b/include/openspace/rendering/volumeraycaster.h @@ -27,8 +27,6 @@ #include #include -#include -#include namespace ghoul::opengl { class Texture; diff --git a/include/openspace/scene/profile.h b/include/openspace/scene/profile.h index ebf3b2222f..e169c1b23c 100644 --- a/include/openspace/scene/profile.h +++ b/include/openspace/scene/profile.h @@ -25,7 +25,6 @@ #ifndef __OPENSPACE_CORE___PROFILE___H__ #define __OPENSPACE_CORE___PROFILE___H__ -#include #include #include #include diff --git a/include/openspace/scene/scene.h b/include/openspace/scene/scene.h index d0a60a71e0..c319e89b86 100644 --- a/include/openspace/scene/scene.h +++ b/include/openspace/scene/scene.h @@ -29,7 +29,6 @@ #include #include -#include #include #include #include diff --git a/include/openspace/scene/scenegraphnode.h b/include/openspace/scene/scenegraphnode.h index 7f08699654..1be70e9852 100644 --- a/include/openspace/scene/scenegraphnode.h +++ b/include/openspace/scene/scenegraphnode.h @@ -39,11 +39,10 @@ #include #include #include -#include #include #include - //#define Debugging_Core_SceneGraphNode_Indices +// #define Debugging_Core_SceneGraphNode_Indices namespace ghoul { class Dictionary; } namespace ghoul::opengl { class ProgramObject; } diff --git a/include/openspace/scene/timeframe.h b/include/openspace/scene/timeframe.h index 344ee1b428..adcd0ec836 100644 --- a/include/openspace/scene/timeframe.h +++ b/include/openspace/scene/timeframe.h @@ -30,7 +30,6 @@ #include #include #include -#include namespace ghoul { class Dictionary; } diff --git a/include/openspace/scripting/scriptengine.h b/include/openspace/scripting/scriptengine.h index a5e1c7612d..16c8d6642d 100644 --- a/include/openspace/scripting/scriptengine.h +++ b/include/openspace/scripting/scriptengine.h @@ -31,7 +31,6 @@ #include #include #include -#include #include #include diff --git a/include/openspace/util/collisionhelper.h b/include/openspace/util/collisionhelper.h index 5e9eab4082..7cfc662137 100644 --- a/include/openspace/util/collisionhelper.h +++ b/include/openspace/util/collisionhelper.h @@ -50,7 +50,7 @@ bool lineSphereIntersection(const glm::dvec3& p1, const glm::dvec3& p2, /** * Check if the point \p p is inside of the sphere defined by radius \p r and center - * point \p c + * point \p c. */ bool isPointInsideSphere(const glm::dvec3& p, const glm::dvec3& c, double r); diff --git a/include/openspace/util/concurrentjobmanager.h b/include/openspace/util/concurrentjobmanager.h index 46d0a37f9e..91ebf03113 100644 --- a/include/openspace/util/concurrentjobmanager.h +++ b/include/openspace/util/concurrentjobmanager.h @@ -27,7 +27,7 @@ #include #include - +#include #include namespace openspace { @@ -38,7 +38,7 @@ template struct Job; * Templated Concurrent Job Manager * This class is used execute specific jobs on one (1) parallel thread */ -template +template class ConcurrentJobManager { public: explicit ConcurrentJobManager(ThreadPool pool); diff --git a/include/openspace/util/concurrentjobmanager.inl b/include/openspace/util/concurrentjobmanager.inl index 14e5bf1792..d4a69194e5 100644 --- a/include/openspace/util/concurrentjobmanager.inl +++ b/include/openspace/util/concurrentjobmanager.inl @@ -27,12 +27,12 @@ namespace openspace { -template +template ConcurrentJobManager

::ConcurrentJobManager(ThreadPool pool) : threadPool(pool) {} -template +template void ConcurrentJobManager

::enqueueJob(std::shared_ptr> job) { threadPool.enqueue([this, job]() { job->execute(); @@ -41,12 +41,12 @@ void ConcurrentJobManager

::enqueueJob(std::shared_ptr> job) { }); } -template +template void ConcurrentJobManager

::clearEnqueuedJobs() { threadPool.clearTasks(); } -template +template std::shared_ptr> ConcurrentJobManager

::popFinishedJob() { ghoul_assert(!_finishedJobs.empty(), "There is no finished job to pop"); @@ -54,7 +54,7 @@ std::shared_ptr> ConcurrentJobManager

::popFinishedJob() { return _finishedJobs.pop(); } -template +template size_t ConcurrentJobManager

::numFinishedJobs() const { return _finishedJobs.size(); } diff --git a/include/openspace/util/concurrentqueue.inl b/include/openspace/util/concurrentqueue.inl index 043cb3dac6..50a54fafbb 100644 --- a/include/openspace/util/concurrentqueue.inl +++ b/include/openspace/util/concurrentqueue.inl @@ -75,5 +75,4 @@ bool ConcurrentQueue::empty() const { return size() == 0; } - } // namespace openspace diff --git a/include/openspace/util/distanceconversion.h b/include/openspace/util/distanceconversion.h index 7f061896db..063c3f0853 100644 --- a/include/openspace/util/distanceconversion.h +++ b/include/openspace/util/distanceconversion.h @@ -28,7 +28,6 @@ #include #include -#include #include #include #include diff --git a/include/openspace/util/dynamicfilesequencedownloader.h b/include/openspace/util/dynamicfilesequencedownloader.h index 699c5a20d9..a9d13028f2 100644 --- a/include/openspace/util/dynamicfilesequencedownloader.h +++ b/include/openspace/util/dynamicfilesequencedownloader.h @@ -26,13 +26,9 @@ #define __OPENSPACE_CORE___DYNAMICFILESEQUENCEDOWNLOADER___H__ #include -#include #include -#include #include -#include #include -#include #include namespace openspace { diff --git a/include/openspace/util/ellipsoid.h b/include/openspace/util/ellipsoid.h index 5a4dd2e186..5ab77df487 100644 --- a/include/openspace/util/ellipsoid.h +++ b/include/openspace/util/ellipsoid.h @@ -26,7 +26,6 @@ #define __OPENSPACE_CORE___ELLIPSOID___H__ #include - #include namespace openspace { diff --git a/include/openspace/util/factorymanager.inl b/include/openspace/util/factorymanager.inl index 8b093f3519..7c52b7255e 100644 --- a/include/openspace/util/factorymanager.inl +++ b/include/openspace/util/factorymanager.inl @@ -33,7 +33,6 @@ void FactoryManager::addFactory(std::string name) { _factories.push_back({ std::move(f), std::move(name) }); } - template ghoul::TemplateFactory* FactoryManager::factory() const { for (const FactoryInfo& f : _factories) { diff --git a/include/openspace/util/job.h b/include/openspace/util/job.h index 01350aa21c..0cdc8cb96c 100644 --- a/include/openspace/util/job.h +++ b/include/openspace/util/job.h @@ -25,8 +25,6 @@ #ifndef __OPENSPACE_CORE___JOB___H__ #define __OPENSPACE_CORE___JOB___H__ -#include - namespace openspace { /** diff --git a/include/openspace/util/json_helper.h b/include/openspace/util/json_helper.h index 1cc2079bcf..9d64113c8c 100644 --- a/include/openspace/util/json_helper.h +++ b/include/openspace/util/json_helper.h @@ -28,6 +28,7 @@ #include #include #include +#include namespace openspace { @@ -74,7 +75,7 @@ std::string formatJson(T value); * \param json The JSON object to sort * \param key The key the JSON should be sorted by */ -void sortJson(nlohmann::json& json, const std::string& key); +void sortJson(nlohmann::json& json, std::string_view key); /** * Converts the provided JSON object into its corresponding Dictionary format. Please note diff --git a/include/openspace/util/json_helper.inl b/include/openspace/util/json_helper.inl index 86d52a96b6..54f11937e1 100644 --- a/include/openspace/util/json_helper.inl +++ b/include/openspace/util/json_helper.inl @@ -22,7 +22,6 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include #include #include #include diff --git a/include/openspace/util/keys.h b/include/openspace/util/keys.h index b4a626f0cf..27e34ea2bd 100644 --- a/include/openspace/util/keys.h +++ b/include/openspace/util/keys.h @@ -59,9 +59,8 @@ #include #include -#include +#include #include -#include namespace openspace { diff --git a/include/openspace/util/planegeometry.h b/include/openspace/util/planegeometry.h index c3f32f8c2c..6ab6d025c5 100644 --- a/include/openspace/util/planegeometry.h +++ b/include/openspace/util/planegeometry.h @@ -42,10 +42,10 @@ public: void render() const; void updateSize(const glm::vec2& size); - void updateSize(const float size); + void updateSize(float size); private: - void updateGeometry(); + void updateGeometry() const; GLuint _vaoId = 0; GLuint _vBufferId = 0; diff --git a/include/openspace/util/sphere.h b/include/openspace/util/sphere.h index 528ef60595..1caa496ec0 100644 --- a/include/openspace/util/sphere.h +++ b/include/openspace/util/sphere.h @@ -32,7 +32,7 @@ namespace openspace { class Sphere { public: - Sphere(float radius, int segments = 8); + explicit Sphere(float radius, int segments = 8); Sphere(glm::vec3 radius, int segments); Sphere(const Sphere& cpy); ~Sphere(); diff --git a/include/openspace/util/spicemanager.h b/include/openspace/util/spicemanager.h index e7c71f30ef..b66d821120 100644 --- a/include/openspace/util/spicemanager.h +++ b/include/openspace/util/spicemanager.h @@ -27,7 +27,6 @@ #include #include -#include #include #include #include diff --git a/include/openspace/util/syncbuffer.h b/include/openspace/util/syncbuffer.h index a486eefabc..4408cf6781 100644 --- a/include/openspace/util/syncbuffer.h +++ b/include/openspace/util/syncbuffer.h @@ -26,7 +26,6 @@ #define __OPENSPACE_CORE___SYNCBUFFER___H__ #include -#include #include #include diff --git a/include/openspace/util/syncbuffer.inl b/include/openspace/util/syncbuffer.inl index 10fd4c748d..09a18d0099 100644 --- a/include/openspace/util/syncbuffer.inl +++ b/include/openspace/util/syncbuffer.inl @@ -23,7 +23,6 @@ ****************************************************************************************/ #include -#include #include namespace openspace { diff --git a/include/openspace/util/syncdata.h b/include/openspace/util/syncdata.h index 141f28e161..f9bdb0b9e5 100644 --- a/include/openspace/util/syncdata.h +++ b/include/openspace/util/syncdata.h @@ -42,7 +42,7 @@ namespace openspace { * * `((T&) t).method();` */ -template +template class SyncData : public Syncable { public: SyncData() = default; diff --git a/include/openspace/util/syncdata.inl b/include/openspace/util/syncdata.inl index 915150b913..6037f26e09 100644 --- a/include/openspace/util/syncdata.inl +++ b/include/openspace/util/syncdata.inl @@ -26,56 +26,56 @@ namespace openspace { -template +template SyncData::SyncData(const T& val) : _data(val) {} -template +template SyncData::SyncData(const SyncData& o) : _data(o._data) , _doubleBufferedData(o._doubleBufferedData) {} -template +template SyncData& SyncData::operator=(const T& rhs) { _data = rhs; return *this; } -template +template SyncData::operator T&() { return _data; } -template +template SyncData::operator const T&() const { return _data; } -template +template T& SyncData::data() { return _data; } -template +template const T& SyncData::data() const { return _data; } -template +template void SyncData::encode(SyncBuffer* syncBuffer) { _mutex.lock(); syncBuffer->encode(_data); _mutex.unlock(); } -template +template void SyncData::decode(SyncBuffer* syncBuffer) { _mutex.lock(); syncBuffer->decode(_doubleBufferedData); _mutex.unlock(); } -template +template void SyncData::postSync(bool isMaster) { // apply synced update if (!isMaster) { diff --git a/include/openspace/util/threadpool.h b/include/openspace/util/threadpool.h index 8bb74b9e21..89b5a06567 100644 --- a/include/openspace/util/threadpool.h +++ b/include/openspace/util/threadpool.h @@ -26,9 +26,9 @@ #define __OPENSPACE_CORE___THREAD_POOL___H__ #include +#include #include #include -#include #include #include diff --git a/include/openspace/util/timeconversion.h b/include/openspace/util/timeconversion.h index 2fa5b0507b..5b71a3e1a1 100644 --- a/include/openspace/util/timeconversion.h +++ b/include/openspace/util/timeconversion.h @@ -28,7 +28,6 @@ #include #include -#include #include #include #include diff --git a/include/openspace/util/timeline.h b/include/openspace/util/timeline.h index a998153f8c..58bdce1d87 100644 --- a/include/openspace/util/timeline.h +++ b/include/openspace/util/timeline.h @@ -25,9 +25,7 @@ #ifndef __OPENSPACE_CORE___TIMELINE___H__ #define __OPENSPACE_CORE___TIMELINE___H__ -#include #include -#include namespace openspace { diff --git a/include/openspace/util/timeline.inl b/include/openspace/util/timeline.inl index 41fcd558a5..d27942bfac 100644 --- a/include/openspace/util/timeline.inl +++ b/include/openspace/util/timeline.inl @@ -22,6 +22,8 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include + namespace openspace { template diff --git a/include/openspace/util/touch.h b/include/openspace/util/touch.h index ca3d1ed90f..5ee1a84785 100644 --- a/include/openspace/util/touch.h +++ b/include/openspace/util/touch.h @@ -27,7 +27,6 @@ #include -#include #include namespace openspace { diff --git a/modules/fieldlinessequence/rendering/renderablefieldlinessequence.h b/modules/fieldlinessequence/rendering/renderablefieldlinessequence.h index 36c1a970da..b04d395c1f 100644 --- a/modules/fieldlinessequence/rendering/renderablefieldlinessequence.h +++ b/modules/fieldlinessequence/rendering/renderablefieldlinessequence.h @@ -36,6 +36,7 @@ #include #include #include +#include #include namespace openspace { diff --git a/modules/fitsfilereader/include/fitsfilereader.h b/modules/fitsfilereader/include/fitsfilereader.h index 613bd900ca..4cfd388b64 100644 --- a/modules/fitsfilereader/include/fitsfilereader.h +++ b/modules/fitsfilereader/include/fitsfilereader.h @@ -43,14 +43,14 @@ namespace ghoul::opengl { class Texture; } namespace openspace { -template +template struct ImageData { std::valarray contents; long int width; long int height; }; -template +template struct TableData { std::unordered_map> contents; int readRows; @@ -63,13 +63,13 @@ public: explicit FitsFileReader(bool verboseMode); ~FitsFileReader(); - template + template std::shared_ptr> readImage(const std::filesystem::path& path); - template + template std::shared_ptr> readHeader( std::vector& keywords); - template + template std::shared_ptr readHeaderValue(const std::string key); /** @@ -78,7 +78,7 @@ public: * longer if it's a big file. If no HDU index is given the current Extension HDU will * be read from. */ - template + template std::shared_ptr> readTable(const std::filesystem::path& path, const std::vector& columnNames, int startRow = 1, int endRow = 10, int hduIdx = 1, bool readAll = false); @@ -105,10 +105,10 @@ private: bool _verboseMode; bool isPrimaryHDU(); - template + template std::shared_ptr> readImageInternal(CCfits::PHDU& image); - template + template std::shared_ptr> readImageInternal(CCfits::ExtHDU& image); mutable std::mutex _mutex; diff --git a/modules/fitsfilereader/include/renderabletimevaryingfitssphere.h b/modules/fitsfilereader/include/renderabletimevaryingfitssphere.h index dbe899896a..4aca6a74aa 100644 --- a/modules/fitsfilereader/include/renderabletimevaryingfitssphere.h +++ b/modules/fitsfilereader/include/renderabletimevaryingfitssphere.h @@ -29,6 +29,7 @@ #include #include +#include namespace openspace { diff --git a/modules/fitsfilereader/include/wsafitshelper.h b/modules/fitsfilereader/include/wsafitshelper.h index 6b49cbf379..5e70e350fc 100644 --- a/modules/fitsfilereader/include/wsafitshelper.h +++ b/modules/fitsfilereader/include/wsafitshelper.h @@ -37,7 +37,7 @@ namespace CCfits { namespace openspace { -template +template struct ImageData { std::valarray contents; int width; @@ -67,7 +67,7 @@ void readFitsHeader(const std::filesystem::path& path); */ int nLayers(const std::filesystem::path& path); -template +template std::shared_ptr> readImageInternal(U& image); } // namespace openspace diff --git a/modules/fitsfilereader/src/fitsfilereader.cpp b/modules/fitsfilereader/src/fitsfilereader.cpp index 94657c569d..409cb7a8a9 100644 --- a/modules/fitsfilereader/src/fitsfilereader.cpp +++ b/modules/fitsfilereader/src/fitsfilereader.cpp @@ -138,7 +138,7 @@ std::shared_ptr FitsFileReader::readHeaderValue(const std::string key) { return nullptr; } -template +template std::shared_ptr> FitsFileReader::readTable(const std::filesystem::path& path, const std::vector& columnNames, int startRow, @@ -657,7 +657,7 @@ std::vector FitsFileReader::readSpeckFile(const std::filesystem::path& fi // This is pretty annoying, the read method is not derived from the HDU class // in CCfits - need to explicitly cast to the sub classes to access read -template +template std::shared_ptr> FitsFileReader::readImageInternal(ExtHDU& image) { try { std::valarray contents; @@ -675,7 +675,7 @@ std::shared_ptr> FitsFileReader::readImageInternal(ExtHDU& image) { return nullptr; } -template +template std::shared_ptr> FitsFileReader::readImageInternal(PHDU& image) { try { std::valarray contents; diff --git a/modules/fitsfilereader/src/wsafitshelper.cpp b/modules/fitsfilereader/src/wsafitshelper.cpp index 492484901d..0b33686d2a 100644 --- a/modules/fitsfilereader/src/wsafitshelper.cpp +++ b/modules/fitsfilereader/src/wsafitshelper.cpp @@ -89,7 +89,7 @@ std::unique_ptr loadTextureFromFits( // Create texture from imagedata auto texture = std::make_unique( imageData, - glm::size3_t(fitsValues->width, fitsValues->height, 1), + glm::uvec3(fitsValues->width, fitsValues->height, 1), GL_TEXTURE_2D, ghoul::opengl::Texture::Format::Red, GL_RED, @@ -140,7 +140,7 @@ int nLayers(const std::filesystem::path& path) { } } -template +template std::shared_ptr> readImageInternal(U& image) { try { std::valarray contents; diff --git a/modules/globebrowsing/src/lrucache.inl b/modules/globebrowsing/src/lrucache.inl index 4dc774fb1c..99c8c6103a 100644 --- a/modules/globebrowsing/src/lrucache.inl +++ b/modules/globebrowsing/src/lrucache.inl @@ -27,24 +27,24 @@ namespace openspace::globebrowsing::cache { -template +template LRUCache::LRUCache(size_t size) : _maximumCacheSize(size) {} -template +template void LRUCache::clear() { _itemList.clear(); _itemMap.clear(); } -template +template void LRUCache::put(KeyType key, ValueType value) { putWithoutCleaning(std::move(key), std::move(value)); clean(); } -template +template std::vector> LRUCache::putAndFetchPopped(KeyType key, ValueType value) { @@ -52,12 +52,12 @@ LRUCache::putAndFetchPopped(KeyType key, ValueTy return cleanAndFetchPopped(); } -template +template bool LRUCache::exist(const KeyType& key) const { return (_itemMap.count(key) > 0); } -template +template bool LRUCache::touch(const KeyType& key) { ZoneScoped; @@ -84,12 +84,12 @@ bool LRUCache::touch(const KeyType& key) { } } -template +template bool LRUCache::isEmpty() const { return (_itemMap.size() == 0); } -template +template ValueType LRUCache::get(const KeyType& key) { const auto it = _itemMap.find(key); // Move list iterator pointing to value @@ -98,7 +98,7 @@ ValueType LRUCache::get(const KeyType& key) { return res; } -template +template std::pair LRUCache::popMRU() { ghoul_assert(!_itemList.empty(), "Cannot pop LRU cache. Ensure cache is not empty"); @@ -109,7 +109,7 @@ std::pair LRUCache::popMRU() return toReturn; } -template +template std::pair LRUCache::popLRU() { ghoul_assert(!_itemList.empty(), "Cannot pop LRU cache. Ensure cache is not empty"); @@ -121,17 +121,17 @@ std::pair LRUCache::popLRU() return toReturn; } -template +template size_t LRUCache::size() const { return _itemMap.size(); } -template +template size_t LRUCache::maximumCacheSize() const { return _maximumCacheSize; } -template +template void LRUCache::putWithoutCleaning(KeyType key, ValueType value) { @@ -144,7 +144,7 @@ void LRUCache::putWithoutCleaning(KeyType key, _itemMap.emplace(std::move(key), _itemList.begin()); } -template +template void LRUCache::clean() { while (_itemMap.size() > _maximumCacheSize) { auto lastIt = _itemList.end(); @@ -154,7 +154,7 @@ void LRUCache::clean() { } } -template +template std::vector> LRUCache::cleanAndFetchPopped() { diff --git a/modules/globebrowsing/src/lruthreadpool.h b/modules/globebrowsing/src/lruthreadpool.h index 6c40f07790..d5b1004bfe 100644 --- a/modules/globebrowsing/src/lruthreadpool.h +++ b/modules/globebrowsing/src/lruthreadpool.h @@ -36,9 +36,9 @@ namespace openspace::globebrowsing { -template class LRUThreadPool; +template class LRUThreadPool; -template +template class LRUThreadPoolWorker { public: explicit LRUThreadPoolWorker(LRUThreadPool& pool); @@ -58,7 +58,7 @@ private: * same key will simply be bumped and prioritised before other enqueued tasks. The given * task will be ignored. */ -template +template class LRUThreadPool { public: LRUThreadPool(size_t numThreads, size_t queueSize); diff --git a/modules/globebrowsing/src/lruthreadpool.inl b/modules/globebrowsing/src/lruthreadpool.inl index e1fcce40f8..c46de72dd1 100644 --- a/modules/globebrowsing/src/lruthreadpool.inl +++ b/modules/globebrowsing/src/lruthreadpool.inl @@ -24,12 +24,12 @@ namespace openspace::globebrowsing { -template +template LRUThreadPoolWorker::LRUThreadPoolWorker(LRUThreadPool& pool) : _pool(pool) {} -template +template void LRUThreadPoolWorker::operator()() { std::function task; while (true) { @@ -57,7 +57,7 @@ void LRUThreadPoolWorker::operator()() { } } -template +template LRUThreadPool::LRUThreadPool(size_t numThreads, size_t queueSize) : _queuedTasks(queueSize) { @@ -66,13 +66,13 @@ LRUThreadPool::LRUThreadPool(size_t numThreads, size_t queueSize) } } -template +template LRUThreadPool::LRUThreadPool(const LRUThreadPool& toCopy) : LRUThreadPool(toCopy._workers.size(), toCopy._queuedTasks.maximumCacheSize()) {} // the destructor joins all threads -template +template LRUThreadPool::~LRUThreadPool() { { std::unique_lock lock(_queueMutex); @@ -87,7 +87,7 @@ LRUThreadPool::~LRUThreadPool() { } // add new work item to the pool -template +template void LRUThreadPool::enqueue(std::function f, KeyType key) { { std::unique_lock lock(_queueMutex); @@ -107,13 +107,13 @@ void LRUThreadPool::enqueue(std::function f, KeyType key) { _condition.notify_one(); } -template +template bool LRUThreadPool::touch(KeyType key) { std::unique_lock lock(_queueMutex); return _queuedTasks.touch(key); } -template +template std::vector LRUThreadPool::getUnqueuedTasksKeys() { std::vector toReturn = _unqueuedTasks; { @@ -123,7 +123,7 @@ std::vector LRUThreadPool::getUnqueuedTasksKeys() { return toReturn; } -template +template std::vector LRUThreadPool::getQueuedTasksKeys() { std::vector queuedTasks; { @@ -135,7 +135,7 @@ std::vector LRUThreadPool::getQueuedTasksKeys() { return queuedTasks; } -template +template void LRUThreadPool::clearEnqueuedTasks() { std::unique_lock lock(_queueMutex); _queuedTasks.clear(); diff --git a/modules/globebrowsing/src/prioritizingconcurrentjobmanager.h b/modules/globebrowsing/src/prioritizingconcurrentjobmanager.h index 0cbdf76f27..d7319d6a6c 100644 --- a/modules/globebrowsing/src/prioritizingconcurrentjobmanager.h +++ b/modules/globebrowsing/src/prioritizingconcurrentjobmanager.h @@ -39,7 +39,7 @@ namespace openspace::globebrowsing { * which is used to identify jobs. In case a job need to be explicitly ended. It can be * identified using its key. */ -template +template class PrioritizingConcurrentJobManager { public: explicit PrioritizingConcurrentJobManager(LRUThreadPool pool); diff --git a/modules/multiresvolume/rendering/renderablemultiresvolume.cpp b/modules/multiresvolume/rendering/renderablemultiresvolume.cpp index f26746f1b6..2221517c38 100644 --- a/modules/multiresvolume/rendering/renderablemultiresvolume.cpp +++ b/modules/multiresvolume/rendering/renderablemultiresvolume.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include #include #include diff --git a/modules/server/include/serverinterface.h b/modules/server/include/serverinterface.h index 03ec0a0cf2..42117f5297 100644 --- a/modules/server/include/serverinterface.h +++ b/modules/server/include/serverinterface.h @@ -31,8 +31,7 @@ #include #include #include - -namespace ghoul::io { class SocketServer; } +#include namespace openspace { diff --git a/modules/server/src/serverinterface.cpp b/modules/server/src/serverinterface.cpp index 1654ec89f4..f600a8591c 100644 --- a/modules/server/src/serverinterface.cpp +++ b/modules/server/src/serverinterface.cpp @@ -28,7 +28,6 @@ #include #include #include -#include namespace { constexpr openspace::properties::Property::PropertyInfo EnabledInfo = { diff --git a/modules/volume/lrucache.h b/modules/volume/lrucache.h index e857efe991..8111c00703 100644 --- a/modules/volume/lrucache.h +++ b/modules/volume/lrucache.h @@ -31,10 +31,10 @@ namespace openspace::volume { -template< +template < typename KeyType, typename ValueType, - template class ContainerType + template class ContainerType > class LruCache { public: diff --git a/modules/volume/lrucache.inl b/modules/volume/lrucache.inl index d9d04c0589..d6292d2aff 100644 --- a/modules/volume/lrucache.inl +++ b/modules/volume/lrucache.inl @@ -24,18 +24,18 @@ namespace openspace::volume { -template class ContainerType> -LruCache::LruCache(size_t capacity) { +template class Container> +LruCache::LruCache(size_t capacity) { _capacity = capacity; } -template class ContainerType> -bool LruCache::has(const KeyType& key) { +template class Container> +bool LruCache::has(const Key& key) { return (_cache.find(key) != _cache.end()); } -template class ContainerType> -void LruCache::set(const KeyType& key, ValueType value) +template class Container> +void LruCache::set(const Key& key, Value value) { auto prev = _cache.find(key); if (prev != _cache.end()) { @@ -48,35 +48,33 @@ void LruCache::set(const KeyType& key, ValueT } } -template class ContainerType> -ValueType& LruCache::use(const KeyType& key) { +template class Container> +ValueType& LruCache::use(const Key& key) { auto iter = _cache.find(key); std::list::iterator trackerIter = iter->second.second; _tracker.splice(_tracker.end(), _tracker, trackerIter); return iter->second.first; } -template class ContainerType> -ValueType& LruCache::get(const KeyType& key) { +template class Container> +ValueType& LruCache::get(const Key& key) { auto iter = _cache.find(key); return iter->second.first; } -template class ContainerType> -void LruCache::evict() { +template class Container> +void LruCache::evict() { _cache.erase(_cache.find(_tracker.front())); _tracker.pop_front(); } -template class ContainerType> -size_t LruCache::capacity() const { +template class Container> +size_t LruCache::capacity() const { return _capacity; } -template class ContainerType> -void LruCache::insert(const KeyType& key, - const ValueType& value) -{ +template class Container> +void LruCache::insert(const Key& key, const Value& value) { if (_cache.size() == _capacity) { evict(); } diff --git a/modules/volume/rawvolume.inl b/modules/volume/rawvolume.inl index 703c712db2..b88c2e7085 100644 --- a/modules/volume/rawvolume.inl +++ b/modules/volume/rawvolume.inl @@ -45,7 +45,7 @@ void RawVolume::setDimensions(const glm::uvec3& dimensions) { _data.resize(nCells()); } -template +template size_t RawVolume::nCells() const { return static_cast(_dimensions.x) * static_cast(_dimensions.y) * diff --git a/src/camera/camera.cpp b/src/camera/camera.cpp index 0a9a9453d8..538b2d55d2 100644 --- a/src/camera/camera.cpp +++ b/src/camera/camera.cpp @@ -25,7 +25,6 @@ #include #include -#include namespace openspace { diff --git a/src/data/csvloader.cpp b/src/data/csvloader.cpp index 6df532d5ab..76a766aafa 100644 --- a/src/data/csvloader.cpp +++ b/src/data/csvloader.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include diff --git a/src/data/dataloader.cpp b/src/data/dataloader.cpp index ac286aaae0..2d1592a00c 100644 --- a/src/data/dataloader.cpp +++ b/src/data/dataloader.cpp @@ -27,14 +27,12 @@ #include #include #include -#include #include #include #include #include #include #include -#include #include #include #include diff --git a/src/data/speckloader.cpp b/src/data/speckloader.cpp index c192ab8e15..f25516fd1e 100644 --- a/src/data/speckloader.cpp +++ b/src/data/speckloader.cpp @@ -24,20 +24,15 @@ #include -#include -#include -#include #include #include #include #include #include #include -#include #include #include - namespace { bool startsWith(std::string lhs, std::string_view rhs) noexcept { lhs = ghoul::toLowerCase(lhs); diff --git a/src/documentation/documentation.cpp b/src/documentation/documentation.cpp index fa0ccafc51..6ab68fb776 100644 --- a/src/documentation/documentation.cpp +++ b/src/documentation/documentation.cpp @@ -27,8 +27,10 @@ #include #include #include -#include +#include #include +#include +#include namespace { diff --git a/src/documentation/documentationengine.cpp b/src/documentation/documentationengine.cpp index 6b44f0b25b..7c1edcd2ed 100644 --- a/src/documentation/documentationengine.cpp +++ b/src/documentation/documentationengine.cpp @@ -24,7 +24,6 @@ #include -#include #include #include #include @@ -39,7 +38,6 @@ #include #include #include -#include #include #include #include @@ -55,81 +53,80 @@ namespace { constexpr std::string_view _loggerCat = "DocumentationEngine"; // General keys - constexpr const char* NameKey = "name"; - constexpr const char* IdentifierKey = "identifier"; - constexpr const char* DescriptionKey = "description"; - constexpr const char* DataKey = "data"; - constexpr const char* TypeKey = "type"; - constexpr const char* DocumentationKey = "documentation"; - constexpr const char* ActionKey = "action"; - constexpr const char* IdKey = "id"; + constexpr std::string_view NameKey = "name"; + constexpr std::string_view IdentifierKey = "identifier"; + constexpr std::string_view DescriptionKey = "description"; + constexpr std::string_view DataKey = "data"; + constexpr std::string_view TypeKey = "type"; + constexpr std::string_view DocumentationKey = "documentation"; + constexpr std::string_view ActionKey = "action"; + constexpr std::string_view IdKey = "id"; // Actions - constexpr const char* ActionTitle = "Actions"; - constexpr const char* GuiNameKey = "guiName"; - constexpr const char* CommandKey = "command"; - constexpr const char* ColorKey = "color"; - constexpr const char* TextColorKey = "textColor"; + constexpr std::string_view ActionTitle = "Actions"; + constexpr std::string_view GuiNameKey = "guiName"; + constexpr std::string_view CommandKey = "command"; + constexpr std::string_view ColorKey = "color"; + constexpr std::string_view TextColorKey = "textColor"; // Factory - constexpr const char* MembersKey = "members"; - constexpr const char* OptionalKey = "optional"; - constexpr const char* ReferenceKey = "reference"; - constexpr const char* FoundKey = "found"; - constexpr const char* ClassesKey = "classes"; + constexpr std::string_view MembersKey = "members"; + constexpr std::string_view OptionalKey = "optional"; + constexpr std::string_view ReferenceKey = "reference"; + constexpr std::string_view FoundKey = "found"; + constexpr std::string_view ClassesKey = "classes"; - constexpr const char* OtherName = "Other"; - constexpr const char* OtherIdentifierName = "other"; - constexpr const char* propertyOwnerName = "propertyOwner"; - constexpr const char* categoryName = "category"; + constexpr std::string_view OtherName = "Other"; + constexpr std::string_view OtherIdentifierName = "other"; + constexpr std::string_view PropertyOwnerName = "propertyOwner"; + constexpr std::string_view CategoryName = "category"; // Properties - constexpr const char* SettingsTitle = "Settings"; - constexpr const char* SceneTitle = "Scene"; - constexpr const char* PropertiesKeys = "properties"; - constexpr const char* PropertyOwnersKey = "propertyOwners"; - constexpr const char* TagsKey = "tags"; - constexpr const char* UriKey = "uri"; + constexpr std::string_view SettingsTitle = "Settings"; + constexpr std::string_view SceneTitle = "Scene"; + constexpr std::string_view PropertiesKeys = "properties"; + constexpr std::string_view PropertyOwnersKey = "propertyOwners"; + constexpr std::string_view TagsKey = "tags"; + constexpr std::string_view UriKey = "uri"; // Scripting - constexpr const char* DefaultValueKey = "defaultValue"; - constexpr const char* ArgumentsKey = "arguments"; - constexpr const char* ReturnTypeKey = "returnType"; - constexpr const char* HelpKey = "help"; - constexpr const char* FileKey = "file"; - constexpr const char* LineKey = "line"; - constexpr const char* LibraryKey = "library"; - constexpr const char* FullNameKey = "fullName"; - constexpr const char* FunctionsKey = "functions"; - constexpr const char* SourceLocationKey = "sourceLocation"; - constexpr const char* OpenSpaceScriptingKey = "openspace"; + constexpr std::string_view DefaultValueKey = "defaultValue"; + constexpr std::string_view ArgumentsKey = "arguments"; + constexpr std::string_view ReturnTypeKey = "returnType"; + constexpr std::string_view HelpKey = "help"; + constexpr std::string_view FileKey = "file"; + constexpr std::string_view LineKey = "line"; + constexpr std::string_view LibraryKey = "library"; + constexpr std::string_view FullNameKey = "fullName"; + constexpr std::string_view FunctionsKey = "functions"; + constexpr std::string_view SourceLocationKey = "sourceLocation"; + constexpr std::string_view OpenSpaceScriptingKey = "openspace"; // Licenses - constexpr const char* LicensesTitle = "Licenses"; - constexpr const char* ProfileName = "Profile"; - constexpr const char* AssetsName = "Assets"; - constexpr const char* LicensesName = "Licenses"; - constexpr const char* NoLicenseName = "No License"; - constexpr const char* NoDataName = ""; + constexpr std::string_view LicensesTitle = "Licenses"; + constexpr std::string_view ProfileName = "Profile"; + constexpr std::string_view AssetsName = "Assets"; + constexpr std::string_view LicensesName = "Licenses"; + constexpr std::string_view NoLicenseName = "No License"; - constexpr const char* ProfileNameKey = "profileName"; - constexpr const char* VersionKey = "version"; - constexpr const char* AuthorKey = "author"; - constexpr const char* UrlKey = "url"; - constexpr const char* LicenseKey = "license"; - constexpr const char* IdentifiersKey = "identifiers"; - constexpr const char* PathKey = "path"; - constexpr const char* AssetKey = "assets"; - constexpr const char* LicensesKey = "licenses"; + constexpr std::string_view ProfileNameKey = "profileName"; + constexpr std::string_view VersionKey = "version"; + constexpr std::string_view AuthorKey = "author"; + constexpr std::string_view UrlKey = "url"; + constexpr std::string_view LicenseKey = "license"; + constexpr std::string_view IdentifiersKey = "identifiers"; + constexpr std::string_view PathKey = "path"; + constexpr std::string_view AssetKey = "assets"; + constexpr std::string_view LicensesKey = "licenses"; // Keybindings - constexpr const char* KeybindingsTitle = "Keybindings"; - constexpr const char* KeybindingsKey = "keybindings"; + constexpr std::string_view KeybindingsTitle = "Keybindings"; + constexpr std::string_view KeybindingsKey = "keybindings"; // Events - constexpr const char* EventsTitle = "Events"; - constexpr const char* FiltersKey = "filters"; - constexpr const char* ActionsKey = "actions"; + constexpr std::string_view EventsTitle = "Events"; + constexpr std::string_view FiltersKey = "filters"; + constexpr std::string_view ActionsKey = "actions"; nlohmann::json documentationToJson( const openspace::documentation::Documentation& documentation) @@ -242,7 +239,7 @@ namespace { nlohmann::json argument; argument[NameKey] = arg.name; argument[TypeKey] = arg.type; - argument[DefaultValueKey] = arg.defaultValue.value_or(NoDataName); + argument[DefaultValueKey] = arg.defaultValue.value_or(""); arguments.push_back(argument); } @@ -314,8 +311,9 @@ nlohmann::json DocumentationEngine::generateScriptEngineJson() const { // Keep the library key for backwards compatability library[LibraryKey] = libraryName; library[NameKey] = libraryName; - std::string os = OpenSpaceScriptingKey; - library[FullNameKey] = libraryName.empty() ? os : os + "." + libraryName; + std::string_view os = OpenSpaceScriptingKey; + library[FullNameKey] = + libraryName.empty() ? os : std::format("{}.{}", os, libraryName); for (const LuaLibrary::Function& f : l.functions) { constexpr bool HasSourceLocation = true; @@ -342,12 +340,12 @@ nlohmann::json DocumentationEngine::generateLicenseGroupsJson() const { nlohmann::json metaJson; metaJson[NameKey] = ProfileName; - metaJson[ProfileNameKey] = meta.name.value_or(NoDataName); - metaJson[VersionKey] = meta.version.value_or(NoDataName); - metaJson[DescriptionKey] = meta.description.value_or(NoDataName); - metaJson[AuthorKey] = meta.author.value_or(NoDataName); - metaJson[UrlKey] = meta.url.value_or(NoDataName); - metaJson[LicenseKey] = meta.license.value_or(NoDataName); + metaJson[ProfileNameKey] = meta.name.value_or(""); + metaJson[VersionKey] = meta.version.value_or(""); + metaJson[DescriptionKey] = meta.description.value_or(""); + metaJson[AuthorKey] = meta.author.value_or(""); + metaJson[UrlKey] = meta.url.value_or(""); + metaJson[LicenseKey] = meta.license.value_or(""); json.push_back(std::move(metaJson)); } @@ -360,17 +358,17 @@ nlohmann::json DocumentationEngine::generateLicenseGroupsJson() const { std::optional meta = asset->metaInformation(); // Ensure the license is not going to be an empty string - std::string licenseName = NoLicenseName; - if (meta.has_value() && meta->license != NoDataName) { + std::string licenseName = std::string(NoLicenseName); + if (meta.has_value() && !meta->license.empty()) { licenseName = meta->license; } nlohmann::json assetJson; - assetJson[NameKey] = meta.has_value() ? meta->name : NoDataName; - assetJson[VersionKey] = meta.has_value() ? meta->version : NoDataName; - assetJson[DescriptionKey] = meta.has_value() ? meta->description : NoDataName; - assetJson[AuthorKey] = meta.has_value() ? meta->author : NoDataName; - assetJson[UrlKey] = meta.has_value() ? meta->url : NoDataName; + assetJson[NameKey] = meta.has_value() ? meta->name : ""; + assetJson[VersionKey] = meta.has_value() ? meta->version : ""; + assetJson[DescriptionKey] = meta.has_value() ? meta->description : ""; + assetJson[AuthorKey] = meta.has_value() ? meta->author : ""; + assetJson[UrlKey] = meta.has_value() ? meta->url : ""; assetJson[LicenseKey] = licenseName; assetJson[PathKey] = asset->path().string(); assetJson[IdKey] = asset->path().string(); @@ -406,12 +404,12 @@ nlohmann::json DocumentationEngine::generateLicenseListJson() const { if (global::profile->meta.has_value()) { nlohmann::json profile; - profile[NameKey] = global::profile->meta->name.value_or(NoDataName); - profile[VersionKey] = global::profile->meta->version.value_or(NoDataName); - profile[DescriptionKey] = global::profile->meta->description.value_or(NoDataName); - profile[AuthorKey] = global::profile->meta->author.value_or(NoDataName); - profile[UrlKey] = global::profile->meta->url.value_or(NoDataName); - profile[LicenseKey] = global::profile->meta->license.value_or(NoDataName); + profile[NameKey] = global::profile->meta->name.value_or(""); + profile[VersionKey] = global::profile->meta->version.value_or(""); + profile[DescriptionKey] = global::profile->meta->description.value_or(""); + profile[AuthorKey] = global::profile->meta->author.value_or(""); + profile[UrlKey] = global::profile->meta->url.value_or(""); + profile[LicenseKey] = global::profile->meta->license.value_or(""); json.push_back(profile); } @@ -505,7 +503,7 @@ nlohmann::json DocumentationEngine::generateFactoryManagerJson() const { } nlohmann::json factory; factory[NameKey] = factoryInfo.name; - factory[IdentifierKey] = categoryName + factoryInfo.name; + factory[IdentifierKey] = std::format("{}{}", CategoryName, factoryInfo.name); ghoul::TemplateFactoryBase* f = factoryInfo.factory.get(); // Add documentation about base class @@ -615,7 +613,7 @@ nlohmann::json DocumentationEngine::generatePropertyOwnerJson( sortJson(json, NameKey); nlohmann::json result; - result[NameKey] = propertyOwnerName; + result[NameKey] = PropertyOwnerName; result[DataKey] = json; return result; @@ -710,7 +708,6 @@ nlohmann::json DocumentationEngine::generateActionJson() const { return res; } - void DocumentationEngine::addDocumentation(Documentation documentation) { if (documentation.id.empty()) { _documentations.push_back(std::move(documentation)); @@ -737,4 +734,5 @@ void DocumentationEngine::addDocumentation(Documentation documentation) { std::vector DocumentationEngine::documentations() const { return _documentations; } + } // namespace openspace::documentation diff --git a/src/engine/configuration.cpp b/src/engine/configuration.cpp index 4553b68c89..ed7efa1e79 100644 --- a/src/engine/configuration.cpp +++ b/src/engine/configuration.cpp @@ -28,15 +28,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 +#include namespace { // We can't use ${SCRIPTS} here as that hasn't been defined by this point diff --git a/src/engine/downloadmanager.cpp b/src/engine/downloadmanager.cpp index df1a1cdeaa..4674cbf760 100644 --- a/src/engine/downloadmanager.cpp +++ b/src/engine/downloadmanager.cpp @@ -24,8 +24,6 @@ #include -#include -#include #include #include #include @@ -142,18 +140,14 @@ std::shared_ptr DownloadManager::downloadFile( const std::string f = file.string(); errno_t error = fopen_s(&fp, f.c_str(), "wb"); if (error != 0) { - LERROR(std::format( - "Could not open/create file: {}. Errno: {}", file, errno - )); + LERROR(std::format("Could not open/create file: {}. Errno: {}", file, errno)); } #else const std::string f = file.string(); FILE* fp = fopen(f.c_str(), "wb"); // write binary #endif // WIN32 if (!fp) { - LERROR(std::format( - "Could not open/create file: {}. Errno: {}", file, errno - )); + LERROR(std::format("Could not open/create file: {}. Errno: {}", file, errno)); } auto downloadFunction = [url, failOnError, timeout_secs, diff --git a/src/engine/globals.cpp b/src/engine/globals.cpp index dca1a827a4..c8407caab1 100644 --- a/src/engine/globals.cpp +++ b/src/engine/globals.cpp @@ -57,13 +57,10 @@ #include #include #include -#include #include #include -#include #include #include -#include #include namespace openspace { diff --git a/src/engine/logfactory.cpp b/src/engine/logfactory.cpp index e5688a361b..4cf4494b0d 100644 --- a/src/engine/logfactory.cpp +++ b/src/engine/logfactory.cpp @@ -25,13 +25,11 @@ #include #include -#include #include #include #include #include #include -#include #include namespace { diff --git a/src/engine/moduleengine.cpp b/src/engine/moduleengine.cpp index a45ee061d4..c943382198 100644 --- a/src/engine/moduleengine.cpp +++ b/src/engine/moduleengine.cpp @@ -25,10 +25,8 @@ #include #include -#include #include #include -#include #include #include #include diff --git a/src/engine/moduleengine_lua.inl b/src/engine/moduleengine_lua.inl index e9bb73e33c..6ac8202744 100644 --- a/src/engine/moduleengine_lua.inl +++ b/src/engine/moduleengine_lua.inl @@ -22,9 +22,13 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include + namespace { -// Checks whether the passed OpenSpaceModule is loaded. +/** + * Checks whether the passed OpenSpaceModule is loaded. + */ [[codegen::luawrap]] bool isLoaded(std::string moduleName) { using namespace openspace; diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index 285fe6be50..695cf04c9f 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include @@ -47,12 +46,10 @@ #include #include #include -#include #include #include #include #include -#include #include #include #include @@ -62,13 +59,11 @@ #include #include #include -#include #include #include #include #include #include -#include #include #include #include @@ -82,7 +77,6 @@ #include #include #include -#include #include #include #include diff --git a/src/engine/openspaceengine_lua.inl b/src/engine/openspaceengine_lua.inl index 10acdbfae4..305450178c 100644 --- a/src/engine/openspaceengine_lua.inl +++ b/src/engine/openspaceengine_lua.inl @@ -25,9 +25,9 @@ #include #include #include -#include #include #include +#include #include #include #include @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -46,20 +47,22 @@ namespace { /** * Toggles the shutdown mode that will close the application after the countdown timer - * is reached + * is reached. */ [[codegen::luawrap]] void toggleShutdown() { openspace::global::openSpaceEngine->toggleShutdownMode(); } /** - * Writes out documentation files + * Writes out documentation files. */ [[codegen::luawrap]] void writeDocumentation() { DocEng.writeJavascriptDocumentation(); } -// Sets the folder used for storing screenshots or session recording frames +/** + * Sets the folder used for storing screenshots or session recording frames. + */ [[codegen::luawrap]] void setScreenshotFolder(std::string newFolder) { using namespace openspace; @@ -77,7 +80,9 @@ namespace { global::windowDelegate->setScreenshotFolder(std::move(folder)); } -// Adds a Tag to a SceneGraphNode identified by the provided uri +/** + * Adds a Tag to a SceneGraphNode identified by the provided uri. + */ [[codegen::luawrap]] void addTag(std::string uri, std::string tag) { using namespace openspace; @@ -89,7 +94,9 @@ namespace { node->addTag(std::move(tag)); } -// Removes a tag (second argument) from a scene graph node (first argument) +/** + * Removes a tag(second argument) from a scene graph node (first argument). + */ [[codegen::luawrap]] void removeTag(std::string uri, std::string tag) { using namespace openspace; @@ -101,7 +108,9 @@ namespace { node->removeTag(tag); } -// Downloads a file from Lua interpreter +/** + * Downloads a file from Lua interpreter. + */ [[codegen::luawrap]] void downloadFile(std::string url, std::string savePath, bool waitForCompletion = false, bool overrideExistingFile = true) diff --git a/src/engine/settings.cpp b/src/engine/settings.cpp index 2bdc562a17..6aeeb00c37 100644 --- a/src/engine/settings.cpp +++ b/src/engine/settings.cpp @@ -31,8 +31,7 @@ namespace openspace { namespace { template -std::optional get_to(nlohmann::json& obj, const std::string& key) -{ +std::optional get_to(nlohmann::json& obj, const std::string& key) { auto it = obj.find(key); if (it != obj.end()) { return it->get(); @@ -44,7 +43,7 @@ std::optional get_to(nlohmann::json& obj, const std::string& key) } // namespace namespace version1 { - Settings parseSettings(nlohmann::json json) { + static Settings parseSettings(nlohmann::json json) { ghoul_assert(json.at("version").get() == 1, "Wrong value"); Settings settings; diff --git a/src/engine/syncengine.cpp b/src/engine/syncengine.cpp index 1cceb42b3a..7ae604c202 100644 --- a/src/engine/syncengine.cpp +++ b/src/engine/syncengine.cpp @@ -24,7 +24,7 @@ #include -#include +#include #include #include #include diff --git a/src/events/event.cpp b/src/events/event.cpp index e897f328d7..52f43fca94 100644 --- a/src/events/event.cpp +++ b/src/events/event.cpp @@ -43,7 +43,7 @@ using namespace std::string_literals; namespace openspace::events { -void log(int i, const EventParallelConnection& e) { +static void log(int i, const EventParallelConnection& e) { ghoul_assert(e.type == EventParallelConnection::Type, "Wrong type"); std::string_view state = [](EventParallelConnection::State s) { switch (s) { @@ -57,12 +57,12 @@ void log(int i, const EventParallelConnection& e) { LINFO(std::format("[{}] ParallelConnection ({})", i, state)); } -void log(int i, [[maybe_unused]] const EventProfileLoadingFinished& e) { +static void log(int i, [[maybe_unused]] const EventProfileLoadingFinished& e) { ghoul_assert(e.type == EventProfileLoadingFinished::Type, "Wrong type"); LINFO(std::format("[{}] ProfileLoadingFinished", i)); } -void log(int i, const EventAssetLoading& e) { +static void log(int i, const EventAssetLoading& e) { ghoul_assert(e.type == EventAssetLoading::Type, "Wrong type"); std::string_view state = [](EventAssetLoading::State s) { switch (s) { @@ -76,7 +76,7 @@ void log(int i, const EventAssetLoading& e) { LINFO(std::format("[{}] AssetLoading: '{}': ({})", i, e.assetPath, state)); } -void log(int i, const EventApplicationShutdown& e) { +static void log(int i, const EventApplicationShutdown& e) { ghoul_assert(e.type == EventApplicationShutdown::Type, "Wrong type"); const std::string t = [](EventApplicationShutdown::State state) { switch (state) { @@ -89,7 +89,7 @@ void log(int i, const EventApplicationShutdown& e) { LINFO(std::format("[{}] ApplicationShutdown", i)); } -void log(int i, const EventCameraFocusTransition& e) { +static void log(int i, const EventCameraFocusTransition& e) { ghoul_assert(e.type == EventCameraFocusTransition::Type, "Wrong type"); std::string_view t = [](EventCameraFocusTransition::Transition transition) { switch (transition) { @@ -112,7 +112,7 @@ void log(int i, const EventCameraFocusTransition& e) { )); } -void log(int i, const EventTimeOfInterestReached& e) { +static void log(int i, const EventTimeOfInterestReached& e) { ghoul_assert(e.type == EventTimeOfInterestReached::Type, "Wrong type"); LINFO(std::format( "[{}] TimeOfInterestReached: {}, {}", @@ -120,57 +120,57 @@ void log(int i, const EventTimeOfInterestReached& e) { )); } -void log(int i, const EventMissionAdded& e) { +static void log(int i, const EventMissionAdded& e) { ghoul_assert(e.type == EventMissionAdded::Type, "Wrong type"); LINFO(std::format("[{}] MissionAdded: {}", i, e.identifier)); } -void log(int i, const EventMissionRemoved& e) { +static void log(int i, const EventMissionRemoved& e) { ghoul_assert(e.type == EventMissionRemoved::Type, "Wrong type"); LINFO(std::format("[{}] MissionRemoved: {}", i, e.identifier)); } -void log(int i, [[maybe_unused]] const EventMissionEventReached& e) { +static void log(int i, [[maybe_unused]] const EventMissionEventReached& e) { ghoul_assert(e.type == EventMissionEventReached::Type, "Wrong type"); LINFO(std::format("[{}] MissionEventReached", i)); } -void log(int i, const EventPlanetEclipsed& e) { +static void log(int i, const EventPlanetEclipsed& e) { ghoul_assert(e.type == EventPlanetEclipsed::Type, "Wrong type"); LINFO(std::format("[{}] PlanetEclipsed: {} -> {}", i, e.eclipsee, e.eclipser)); } -void log(int i, [[maybe_unused]] const EventInterpolationFinished& e) { +static void log(int i, [[maybe_unused]] const EventInterpolationFinished& e) { ghoul_assert(e.type == EventInterpolationFinished::Type, "Wrong type"); LINFO(std::format("[{}] InterpolationFinished", i)); } -void log(int i, const EventFocusNodeChanged& e) { +static void log(int i, const EventFocusNodeChanged& e) { ghoul_assert(e.type == EventFocusNodeChanged::Type, "Wrong type"); LINFO(std::format("[{}] FocusNodeChanged: {} -> {}", i, e.oldNode, e.newNode)); } -void log(int i, const EventPropertyTreeUpdated& e) { +static void log(int i, const EventPropertyTreeUpdated& e) { ghoul_assert(e.type == EventPropertyTreeUpdated::Type, "Wrong type"); LINFO(std::format("[{}] PropertyTreeUpdated: {}", i, e.uri)); } -void log(int i, const EventPropertyTreePruned& e) { +static void log(int i, const EventPropertyTreePruned& e) { ghoul_assert(e.type == EventPropertyTreePruned::Type, "Wrong type"); LINFO(std::format("[{}] PropertyTreePruned: {}", i, e.uri)); } -void log(int i, const EventActionAdded& e) { +static void log(int i, const EventActionAdded& e) { ghoul_assert(e.type == EventActionAdded::Type, "Wrong type"); LINFO(std::format("[{}] ActionAdded: {}", i, e.uri)); } -void log(int i, const EventActionRemoved& e) { +static void log(int i, const EventActionRemoved& e) { ghoul_assert(e.type == EventActionRemoved::Type, "Wrong type"); LINFO(std::format("[{}] ActionRemoved: {}", i, e.uri)); } -void log(int i, const EventSessionRecordingPlayback& e) { +static void log(int i, const EventSessionRecordingPlayback& e) { ghoul_assert(e.type == EventSessionRecordingPlayback::Type, "Wrong type"); std::string_view state = [](EventSessionRecordingPlayback::State s) { @@ -186,7 +186,7 @@ void log(int i, const EventSessionRecordingPlayback& e) { LINFO(std::format("[{}] SessionRecordingPlayback: {}", i, state)); } -void log(int i, const EventPointSpacecraft& e) { +static void log(int i, const EventPointSpacecraft& e) { ghoul_assert(e.type == EventPointSpacecraft::Type, "Wrong type"); LINFO(std::format( "[{}] PointSpacecraft: Ra: {}, Dec: {}, Duration: {}", i, e.ra, e.dec, @@ -194,17 +194,17 @@ void log(int i, const EventPointSpacecraft& e) { )); } -void log(int i, const EventRenderableEnabled& e) { +static void log(int i, const EventRenderableEnabled& e) { ghoul_assert(e.type == EventRenderableEnabled::Type, "Wrong type"); LINFO(std::format("[{}] EventRenderableEnabled: {}", i, e.node)); } -void log(int i, const EventRenderableDisabled& e) { +static void log(int i, const EventRenderableDisabled& e) { ghoul_assert(e.type == EventRenderableDisabled::Type, "Wrong type"); LINFO(std::format("[{}] EventRenderableDisabled: {}", i, e.node)); } -void log(int i, const EventCameraPathStarted& e) { +static void log(int i, const EventCameraPathStarted& e) { ghoul_assert(e.type == EventCameraPathStarted::Type, "Wrong type"); LINFO(std::format( "[{}] EventCameraPathStarted: Origin: '{}' Destination: '{}'", @@ -212,7 +212,7 @@ void log(int i, const EventCameraPathStarted& e) { )); } -void log(int i, const EventCameraPathFinished& e) { +static void log(int i, const EventCameraPathFinished& e) { ghoul_assert(e.type == EventCameraPathFinished::Type, "Wrong type"); LINFO(std::format( "[{}] EventCameraPathFinished: Origin: '{}' Destination: '{}'", @@ -220,22 +220,22 @@ void log(int i, const EventCameraPathFinished& e) { )); } -void log(int i, const EventCameraMovedPosition& e) { +static void log(int i, const EventCameraMovedPosition& e) { ghoul_assert(e.type == EventCameraMovedPosition::Type, "Wrong type"); LINFO(std::format("[{}] EventCameraMovedPosition", i)); } -void log(int i, const EventScheduledScriptExecuted& e) { +static void log(int i, const EventScheduledScriptExecuted& e) { ghoul_assert(e.type == EventScheduledScriptExecuted::Type, "Wrong type"); LINFO(std::format("[{}] ScheduledScriptExecuted: Script '{}'", i, e.script)); } -void log(int i, const EventGuiTreeUpdated& e) { +static void log(int i, const EventGuiTreeUpdated& e) { ghoul_assert(e.type == EventGuiTreeUpdated::Type, "Wrong type"); LINFO(std::format("[{}] EventGuiTreeUpdated", i)); } -void log(int i, const CustomEvent& e) { +static void log(int i, const CustomEvent& e) { ghoul_assert(e.type == CustomEvent::Type, "Wrong type"); LINFO(std::format("[{}] CustomEvent: {} ({})", i, e.subtype, e.payload)); } diff --git a/src/interaction/actionmanager_lua.inl b/src/interaction/actionmanager_lua.inl index 4d752fe875..782cabbc21 100644 --- a/src/interaction/actionmanager_lua.inl +++ b/src/interaction/actionmanager_lua.inl @@ -27,7 +27,9 @@ namespace { -// Checks if the passed identifier corresponds to an action. +/** + * Checks if the passed identifier corresponds to an action. + */ [[codegen::luawrap]] bool hasAction(std::string identifier) { if (identifier.empty()) { throw ghoul::lua::LuaError("Identifier must not be empty"); @@ -73,20 +75,20 @@ namespace { } struct [[codegen::Dictionary(Action)]] Action { - // The identifier under which the action is registered + /// The identifier under which the action is registered std::string identifier; - // The Lua script that is to be executed when the action is triggered + /// The Lua script that is to be executed when the action is triggered std::string command; - // The user-facing name of the action + /// The user-facing name of the action std::optional name; - // A documentation that explains what the action does + /// A documentation that explains what the action does std::optional documentation; - // The path in the GUI under which the action is shown to the user. If the value is - // not provided, the default value is / + /// The path in the GUI under which the action is shown to the user. If the value is + /// not provided, the default value is / std::optional guiPath; /// This parameter, if specified, will be used as a hint to any potential user @@ -99,10 +101,11 @@ struct [[codegen::Dictionary(Action)]] Action { /// group similar Actions together std::optional textColor [[codegen::color()]]; - // Determines whether the provided command will be executed locally or will be sent to - // connected computers in a cluster or parallel connection environment + /// Determines whether the provided command will be executed locally or will be sent + /// to connected computers in a cluster or parallel connection environment std::optional isLocal; }; + /** * Registers a new action. The first argument is the identifier which cannot have been * used to register a previous action before, the second argument is the Lua command that @@ -204,7 +207,9 @@ struct [[codegen::Dictionary(Action)]] Action { return res; } -// Triggers the action given by the specified identifier. +/** + * Triggers the action given by the specified identifier. + */ [[codegen::luawrap]] void triggerAction(std::string id, ghoul::Dictionary arg = ghoul::Dictionary()) { diff --git a/src/interaction/interactionmonitor.cpp b/src/interaction/interactionmonitor.cpp index 6e66442405..97f11bfeac 100644 --- a/src/interaction/interactionmonitor.cpp +++ b/src/interaction/interactionmonitor.cpp @@ -26,7 +26,6 @@ #include #include -#include namespace { constexpr openspace::properties::Property::PropertyInfo IdleTimeInfo = { diff --git a/src/interaction/joystickcamerastates.cpp b/src/interaction/joystickcamerastates.cpp index f5c4acb38a..dd1c6a5bdd 100644 --- a/src/interaction/joystickcamerastates.cpp +++ b/src/interaction/joystickcamerastates.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include diff --git a/src/interaction/joystickinputstate.cpp b/src/interaction/joystickinputstate.cpp index 8ca2113de1..ef5303dc42 100644 --- a/src/interaction/joystickinputstate.cpp +++ b/src/interaction/joystickinputstate.cpp @@ -26,9 +26,7 @@ #include #include -#include #include -#include #include namespace openspace::interaction { diff --git a/src/interaction/keybindingmanager.cpp b/src/interaction/keybindingmanager.cpp index 881095118e..b437c5d82f 100644 --- a/src/interaction/keybindingmanager.cpp +++ b/src/interaction/keybindingmanager.cpp @@ -27,11 +27,7 @@ #include #include #include -#include #include -#include -#include -#include #include "keybindingmanager_lua.inl" diff --git a/src/interaction/websocketcamerastates.cpp b/src/interaction/websocketcamerastates.cpp index 55f14fbb4c..a0c679120f 100644 --- a/src/interaction/websocketcamerastates.cpp +++ b/src/interaction/websocketcamerastates.cpp @@ -24,12 +24,8 @@ #include -#include -#include -#include -#include -#include #include +#include namespace openspace::interaction { diff --git a/src/interaction/websocketinputstate.cpp b/src/interaction/websocketinputstate.cpp index b0dcd4486e..2b6ce9e357 100644 --- a/src/interaction/websocketinputstate.cpp +++ b/src/interaction/websocketinputstate.cpp @@ -24,11 +24,8 @@ #include -#include #include -#include #include -#include #include namespace openspace::interaction { diff --git a/src/mission/mission.cpp b/src/mission/mission.cpp index 346334d37f..307030c2da 100644 --- a/src/mission/mission.cpp +++ b/src/mission/mission.cpp @@ -24,9 +24,8 @@ #include -#include + #include #include -#include #include #include #include diff --git a/src/mission/missionmanager.cpp b/src/mission/missionmanager.cpp index 1d5cc61f23..d107441528 100644 --- a/src/mission/missionmanager.cpp +++ b/src/mission/missionmanager.cpp @@ -26,11 +26,7 @@ #include #include -#include -#include -#include #include -#include #include "missionmanager_lua.inl" diff --git a/src/navigation/keyframenavigator.cpp b/src/navigation/keyframenavigator.cpp index cff0f416ca..86a2e2e796 100644 --- a/src/navigation/keyframenavigator.cpp +++ b/src/navigation/keyframenavigator.cpp @@ -31,9 +31,6 @@ #include #include #include -#include - -#include namespace openspace::interaction { diff --git a/src/navigation/navigationhandler.cpp b/src/navigation/navigationhandler.cpp index 29fb6e96e3..5c898bc5f9 100644 --- a/src/navigation/navigationhandler.cpp +++ b/src/navigation/navigationhandler.cpp @@ -25,14 +25,12 @@ #include #include -#include #include #include #include #include #include #include -#include #include #include #include @@ -43,12 +41,10 @@ #include #include #include -#include #include #include #include #include -#include #include #include #include diff --git a/src/navigation/navigationhandler_lua.inl b/src/navigation/navigationhandler_lua.inl index 92c910a3e5..327a832dca 100644 --- a/src/navigation/navigationhandler_lua.inl +++ b/src/navigation/navigationhandler_lua.inl @@ -23,7 +23,6 @@ ****************************************************************************************/ #include - #include namespace { diff --git a/src/navigation/navigationstate.cpp b/src/navigation/navigationstate.cpp index 0c7ec52f5f..d29b369783 100644 --- a/src/navigation/navigationstate.cpp +++ b/src/navigation/navigationstate.cpp @@ -22,9 +22,10 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include + #include #include -#include #include #include #include diff --git a/src/navigation/orbitalnavigator.cpp b/src/navigation/orbitalnavigator.cpp index 185508aed9..bc4a6457b3 100644 --- a/src/navigation/orbitalnavigator.cpp +++ b/src/navigation/orbitalnavigator.cpp @@ -22,13 +22,14 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include + #include #include #include #include #include #include -#include #include #include #include @@ -38,7 +39,6 @@ #include #include #include -#include #include #include diff --git a/src/navigation/orbitalnavigator_lua.inl b/src/navigation/orbitalnavigator_lua.inl index 9e17b41a1a..69acf26899 100644 --- a/src/navigation/orbitalnavigator_lua.inl +++ b/src/navigation/orbitalnavigator_lua.inl @@ -25,8 +25,9 @@ namespace { /** -* Set minimum allowed distance to a multiplier of the interaction sphere of the focus node -*/ + * Set minimum allowed distance to a multiplier of the interaction sphere of the focus + * node. + */ [[codegen::luawrap]] void setRelativeMinDistance(float multiplier) { using namespace openspace; const SceneGraphNode* node = global::navigationHandler->anchorNode(); @@ -41,8 +42,9 @@ namespace { } /** -* Set maximum allowed distance to a multiplier of the interaction sphere of the focus node -*/ + * Set maximum allowed distance to a multiplier of the interaction sphere of the focus + * node. + */ [[codegen::luawrap]] void setRelativeMaxDistance(float multiplier) { using namespace openspace; const SceneGraphNode* node = global::navigationHandler->anchorNode(); diff --git a/src/navigation/path.cpp b/src/navigation/path.cpp index 8d4215c85e..d93a765b45 100644 --- a/src/navigation/path.cpp +++ b/src/navigation/path.cpp @@ -24,10 +24,8 @@ #include -#include #include #include -#include #include #include #include @@ -39,7 +37,6 @@ #include #include #include -#include namespace { constexpr std::string_view _loggerCat = "Path"; diff --git a/src/navigation/pathcurve.cpp b/src/navigation/pathcurve.cpp index 8aad9ea7b7..d0b97d7b76 100644 --- a/src/navigation/pathcurve.cpp +++ b/src/navigation/pathcurve.cpp @@ -25,12 +25,8 @@ #include #include -#include -#include -#include #include #include -#include #include #include diff --git a/src/navigation/pathcurves/avoidcollisioncurve.cpp b/src/navigation/pathcurves/avoidcollisioncurve.cpp index 7fc34c1013..f0eeb58512 100644 --- a/src/navigation/pathcurves/avoidcollisioncurve.cpp +++ b/src/navigation/pathcurves/avoidcollisioncurve.cpp @@ -25,15 +25,12 @@ #include #include -#include #include #include #include -#include #include #include #include -#include #include #include #include diff --git a/src/navigation/pathcurves/zoomoutoverviewcurve.cpp b/src/navigation/pathcurves/zoomoutoverviewcurve.cpp index 4948fef8b6..0a9dbbbcd4 100644 --- a/src/navigation/pathcurves/zoomoutoverviewcurve.cpp +++ b/src/navigation/pathcurves/zoomoutoverviewcurve.cpp @@ -24,10 +24,7 @@ #include -#include -#include #include -#include #include #include #include diff --git a/src/navigation/pathnavigator.cpp b/src/navigation/pathnavigator.cpp index 0146d45cac..1ed2ce0d0f 100644 --- a/src/navigation/pathnavigator.cpp +++ b/src/navigation/pathnavigator.cpp @@ -27,11 +27,9 @@ #include #include #include -#include #include #include #include -#include #include #include #include @@ -40,13 +38,7 @@ #include #include #include -#include -#include -#include #include -#include -#include -#include #include #include "pathnavigator_lua.inl" diff --git a/src/navigation/waypoint.cpp b/src/navigation/waypoint.cpp index 1949345665..297cd39044 100644 --- a/src/navigation/waypoint.cpp +++ b/src/navigation/waypoint.cpp @@ -26,7 +26,6 @@ #include #include -#include #include #include #include diff --git a/src/network/parallelconnection.cpp b/src/network/parallelconnection.cpp index 28672ec517..da33d434a2 100644 --- a/src/network/parallelconnection.cpp +++ b/src/network/parallelconnection.cpp @@ -24,8 +24,6 @@ #include -#include -#include #include #include #include diff --git a/src/properties/list/doublelistproperty.cpp b/src/properties/list/doublelistproperty.cpp index ab61262f24..1a639e0fed 100644 --- a/src/properties/list/doublelistproperty.cpp +++ b/src/properties/list/doublelistproperty.cpp @@ -24,11 +24,8 @@ #include -#include -#include #include #include -#include namespace openspace::properties { diff --git a/src/properties/list/intlistproperty.cpp b/src/properties/list/intlistproperty.cpp index 8358ee595a..8dcf20a5ed 100644 --- a/src/properties/list/intlistproperty.cpp +++ b/src/properties/list/intlistproperty.cpp @@ -24,11 +24,8 @@ #include -#include -#include #include #include -#include namespace openspace::properties { diff --git a/src/properties/list/stringlistproperty.cpp b/src/properties/list/stringlistproperty.cpp index 63db92cc21..18e6d69352 100644 --- a/src/properties/list/stringlistproperty.cpp +++ b/src/properties/list/stringlistproperty.cpp @@ -24,11 +24,8 @@ #include -#include -#include #include #include -#include namespace openspace::properties { diff --git a/src/properties/matrix/dmat2property.cpp b/src/properties/matrix/dmat2property.cpp index 26b0cd612f..5ae02718ba 100644 --- a/src/properties/matrix/dmat2property.cpp +++ b/src/properties/matrix/dmat2property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/properties/matrix/dmat3property.cpp b/src/properties/matrix/dmat3property.cpp index 7461e2e877..6cb874ebc4 100644 --- a/src/properties/matrix/dmat3property.cpp +++ b/src/properties/matrix/dmat3property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/properties/matrix/dmat4property.cpp b/src/properties/matrix/dmat4property.cpp index 38ab2b7477..03a1ab3720 100644 --- a/src/properties/matrix/dmat4property.cpp +++ b/src/properties/matrix/dmat4property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/properties/matrix/mat2property.cpp b/src/properties/matrix/mat2property.cpp index 2027986e28..ef1c476541 100644 --- a/src/properties/matrix/mat2property.cpp +++ b/src/properties/matrix/mat2property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/properties/matrix/mat3property.cpp b/src/properties/matrix/mat3property.cpp index a0cec81b4b..11383c15e7 100644 --- a/src/properties/matrix/mat3property.cpp +++ b/src/properties/matrix/mat3property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/properties/matrix/mat4property.cpp b/src/properties/matrix/mat4property.cpp index 91e1887f4f..63bb4ae16a 100644 --- a/src/properties/matrix/mat4property.cpp +++ b/src/properties/matrix/mat4property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/properties/misc/selectionproperty.cpp b/src/properties/misc/selectionproperty.cpp index 1ddcdebaa8..3472bb1afe 100644 --- a/src/properties/misc/selectionproperty.cpp +++ b/src/properties/misc/selectionproperty.cpp @@ -28,12 +28,10 @@ #include #include #include -#include #include namespace { constexpr std::string_view _loggerCat = "SelectionProperty"; - constexpr std::string_view OptionsKey = "options"; } // namespace diff --git a/src/properties/property.cpp b/src/properties/property.cpp index e2583a8e21..a2f1b9c1cb 100644 --- a/src/properties/property.cpp +++ b/src/properties/property.cpp @@ -29,8 +29,6 @@ #include #include #include -#include -#include #include namespace openspace::properties { diff --git a/src/properties/propertyowner.cpp b/src/properties/propertyowner.cpp index 055219890d..b48ff5d56c 100644 --- a/src/properties/propertyowner.cpp +++ b/src/properties/propertyowner.cpp @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include diff --git a/src/properties/scalar/doubleproperty.cpp b/src/properties/scalar/doubleproperty.cpp index 23fc0f1783..55cfb79135 100644 --- a/src/properties/scalar/doubleproperty.cpp +++ b/src/properties/scalar/doubleproperty.cpp @@ -24,8 +24,8 @@ #include -#include -#include +#include +#include namespace openspace::properties { diff --git a/src/properties/scalar/floatproperty.cpp b/src/properties/scalar/floatproperty.cpp index ad8c79c611..ee5f51dc21 100644 --- a/src/properties/scalar/floatproperty.cpp +++ b/src/properties/scalar/floatproperty.cpp @@ -24,8 +24,8 @@ #include -#include -#include +#include +#include namespace openspace::properties { diff --git a/src/properties/scalar/intproperty.cpp b/src/properties/scalar/intproperty.cpp index a37ed0db18..1199d1e150 100644 --- a/src/properties/scalar/intproperty.cpp +++ b/src/properties/scalar/intproperty.cpp @@ -24,8 +24,8 @@ #include -#include -#include +#include +#include namespace openspace::properties { diff --git a/src/properties/scalar/longproperty.cpp b/src/properties/scalar/longproperty.cpp index a97dd0209b..2db967a6d1 100644 --- a/src/properties/scalar/longproperty.cpp +++ b/src/properties/scalar/longproperty.cpp @@ -24,8 +24,8 @@ #include -#include -#include +#include +#include namespace openspace::properties { diff --git a/src/properties/scalar/shortproperty.cpp b/src/properties/scalar/shortproperty.cpp index e226f9e560..2c370c14f9 100644 --- a/src/properties/scalar/shortproperty.cpp +++ b/src/properties/scalar/shortproperty.cpp @@ -24,8 +24,8 @@ #include -#include -#include +#include +#include namespace openspace::properties { diff --git a/src/properties/scalar/uintproperty.cpp b/src/properties/scalar/uintproperty.cpp index 08c0caf333..b8bec87104 100644 --- a/src/properties/scalar/uintproperty.cpp +++ b/src/properties/scalar/uintproperty.cpp @@ -24,8 +24,8 @@ #include -#include -#include +#include +#include namespace openspace::properties { diff --git a/src/properties/scalar/ulongproperty.cpp b/src/properties/scalar/ulongproperty.cpp index 72a53ea6ec..8f26cf3f0f 100644 --- a/src/properties/scalar/ulongproperty.cpp +++ b/src/properties/scalar/ulongproperty.cpp @@ -24,8 +24,8 @@ #include -#include -#include +#include +#include namespace openspace::properties { diff --git a/src/properties/scalar/ushortproperty.cpp b/src/properties/scalar/ushortproperty.cpp index b828dc5c39..25f4107ef4 100644 --- a/src/properties/scalar/ushortproperty.cpp +++ b/src/properties/scalar/ushortproperty.cpp @@ -24,8 +24,8 @@ #include -#include -#include +#include +#include namespace openspace::properties { diff --git a/src/properties/vector/dvec2property.cpp b/src/properties/vector/dvec2property.cpp index 9c05535f20..ef70c7ad58 100644 --- a/src/properties/vector/dvec2property.cpp +++ b/src/properties/vector/dvec2property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/properties/vector/dvec3property.cpp b/src/properties/vector/dvec3property.cpp index 70bd5869b2..7659198529 100644 --- a/src/properties/vector/dvec3property.cpp +++ b/src/properties/vector/dvec3property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/properties/vector/dvec4property.cpp b/src/properties/vector/dvec4property.cpp index 0043455dc2..2e97823072 100644 --- a/src/properties/vector/dvec4property.cpp +++ b/src/properties/vector/dvec4property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/properties/vector/ivec2property.cpp b/src/properties/vector/ivec2property.cpp index ee41df1816..6c014b56aa 100644 --- a/src/properties/vector/ivec2property.cpp +++ b/src/properties/vector/ivec2property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/properties/vector/ivec3property.cpp b/src/properties/vector/ivec3property.cpp index 768251cd9b..0acdf215e7 100644 --- a/src/properties/vector/ivec3property.cpp +++ b/src/properties/vector/ivec3property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/properties/vector/ivec4property.cpp b/src/properties/vector/ivec4property.cpp index 785b43e1d1..ef2d6c5c75 100644 --- a/src/properties/vector/ivec4property.cpp +++ b/src/properties/vector/ivec4property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/properties/vector/uvec2property.cpp b/src/properties/vector/uvec2property.cpp index c8210ec77a..c65f967715 100644 --- a/src/properties/vector/uvec2property.cpp +++ b/src/properties/vector/uvec2property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/properties/vector/uvec3property.cpp b/src/properties/vector/uvec3property.cpp index 274c6f6961..02c4bc98fd 100644 --- a/src/properties/vector/uvec3property.cpp +++ b/src/properties/vector/uvec3property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/properties/vector/uvec4property.cpp b/src/properties/vector/uvec4property.cpp index cbf4e09450..8d7f9b285a 100644 --- a/src/properties/vector/uvec4property.cpp +++ b/src/properties/vector/uvec4property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/properties/vector/vec2property.cpp b/src/properties/vector/vec2property.cpp index a956b39509..b2dc52ec36 100644 --- a/src/properties/vector/vec2property.cpp +++ b/src/properties/vector/vec2property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/properties/vector/vec3property.cpp b/src/properties/vector/vec3property.cpp index a14412d102..1d4ced192c 100644 --- a/src/properties/vector/vec3property.cpp +++ b/src/properties/vector/vec3property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/properties/vector/vec4property.cpp b/src/properties/vector/vec4property.cpp index dcd1bb97b7..50716424fd 100644 --- a/src/properties/vector/vec4property.cpp +++ b/src/properties/vector/vec4property.cpp @@ -24,8 +24,7 @@ #include -#include -#include +#include #include namespace openspace::properties { diff --git a/src/rendering/colormappingcomponent.cpp b/src/rendering/colormappingcomponent.cpp index a21402dc3f..c8ce3778bf 100644 --- a/src/rendering/colormappingcomponent.cpp +++ b/src/rendering/colormappingcomponent.cpp @@ -25,8 +25,6 @@ #include #include -#include -#include #include namespace { diff --git a/src/rendering/dashboard.cpp b/src/rendering/dashboard.cpp index 2b8afbcad8..6a56df0838 100644 --- a/src/rendering/dashboard.cpp +++ b/src/rendering/dashboard.cpp @@ -26,9 +26,8 @@ #include #include -#include +#include #include -#include #include #include diff --git a/src/rendering/dashboarditem.cpp b/src/rendering/dashboarditem.cpp index f3505d67e4..8b36ab6a94 100644 --- a/src/rendering/dashboarditem.cpp +++ b/src/rendering/dashboarditem.cpp @@ -24,9 +24,7 @@ #include -#include #include -#include #include #include #include diff --git a/src/rendering/dashboardtextitem.cpp b/src/rendering/dashboardtextitem.cpp index c2eee6549a..a260987b32 100644 --- a/src/rendering/dashboardtextitem.cpp +++ b/src/rendering/dashboardtextitem.cpp @@ -25,7 +25,6 @@ #include #include -#include #include #include #include diff --git a/src/rendering/deferredcastermanager.cpp b/src/rendering/deferredcastermanager.cpp index 3297ef8699..3b282bd1d4 100644 --- a/src/rendering/deferredcastermanager.cpp +++ b/src/rendering/deferredcastermanager.cpp @@ -26,7 +26,6 @@ #include #include -#include namespace openspace { diff --git a/src/rendering/fadeable.cpp b/src/rendering/fadeable.cpp index 3f7d9508ca..71ac5bf4fe 100644 --- a/src/rendering/fadeable.cpp +++ b/src/rendering/fadeable.cpp @@ -24,10 +24,6 @@ #include -#include -#include -#include - namespace { constexpr openspace::properties::Property::PropertyInfo OpacityInfo = { "Opacity", diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index d5e59d6f51..52cf0de035 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -44,7 +43,6 @@ #include #include #include -#include #include #include diff --git a/src/rendering/helper.cpp b/src/rendering/helper.cpp index 08c723f8dd..3dbbfb4b9e 100644 --- a/src/rendering/helper.cpp +++ b/src/rendering/helper.cpp @@ -24,7 +24,6 @@ #include -#include #include #include #include @@ -37,7 +36,7 @@ #include #include #include -#include +#include #include namespace { diff --git a/src/rendering/loadingscreen.cpp b/src/rendering/loadingscreen.cpp index 3e5429c487..0c3731b6fd 100644 --- a/src/rendering/loadingscreen.cpp +++ b/src/rendering/loadingscreen.cpp @@ -39,11 +39,8 @@ #include #include #include -#include #include -#include #include -#include #include #include #include diff --git a/src/rendering/luaconsole.cpp b/src/rendering/luaconsole.cpp index aa6686822a..1fa346f3af 100644 --- a/src/rendering/luaconsole.cpp +++ b/src/rendering/luaconsole.cpp @@ -39,7 +39,6 @@ #include #include #include -#include #include #include diff --git a/src/rendering/raycastermanager.cpp b/src/rendering/raycastermanager.cpp index f6bbe00f29..8050182e20 100644 --- a/src/rendering/raycastermanager.cpp +++ b/src/rendering/raycastermanager.cpp @@ -26,7 +26,6 @@ #include #include -#include namespace openspace { diff --git a/src/rendering/renderable.cpp b/src/rendering/renderable.cpp index e06fccdc08..54413d0c2e 100644 --- a/src/rendering/renderable.cpp +++ b/src/rendering/renderable.cpp @@ -37,7 +37,6 @@ #include #include #include -#include #include namespace { diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 2cc65418a6..73752625f7 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -30,21 +30,15 @@ #include #include #include -#include -#include #include #include -#include #include -#include #include #include #include -#include #include #include #include -#include #include #include #include @@ -62,13 +56,10 @@ #include #include #include -#include #include -#include #include #include #include -#include #include "renderengine_lua.inl" diff --git a/src/rendering/renderengine_lua.inl b/src/rendering/renderengine_lua.inl index aeabab9664..3662b2f69b 100644 --- a/src/rendering/renderengine_lua.inl +++ b/src/rendering/renderengine_lua.inl @@ -26,7 +26,9 @@ namespace { -/// Will create a ScreenSpaceRenderable from a lua Table and add it in the RenderEngine +/** + * Will create a ScreenSpaceRenderable from a lua Table and add it in the RenderEngine. + */ [[codegen::luawrap]] void addScreenSpaceRenderable(ghoul::Dictionary screenSpace) { using namespace openspace; std::unique_ptr s = @@ -70,15 +72,17 @@ namespace { } /** -* Reset screenshot index to 0. -*/ + * Reset screenshot index to 0. + */ [[codegen::luawrap]] void resetScreenshotNumber() { using namespace openspace; global::renderEngine->resetScreenshotNumber(); } -// Extracts the DPI scaling for either the GUI window or if there is no dedicated GUI -// window, the first window. +/** + * Extracts the DPI scaling for either the GUI window or if there is no dedicated GUI + * window, the first window. + */ [[codegen::luawrap]] float dpiScaling() { return openspace::global::windowDelegate->osDpiScaling(); } diff --git a/src/rendering/screenspacerenderableframebuffer.cpp b/src/rendering/screenspacerenderableframebuffer.cpp index b08248f6b4..e1295a082a 100644 --- a/src/rendering/screenspacerenderableframebuffer.cpp +++ b/src/rendering/screenspacerenderableframebuffer.cpp @@ -27,10 +27,7 @@ #include #include #include -#include #include -#include -#include namespace { constexpr openspace::properties::Property::PropertyInfo SizeInfo = { diff --git a/src/rendering/texturecomponent.cpp b/src/rendering/texturecomponent.cpp index 6f80abd8b0..28a33bc450 100644 --- a/src/rendering/texturecomponent.cpp +++ b/src/rendering/texturecomponent.cpp @@ -25,7 +25,6 @@ #include #include -#include #include #include diff --git a/src/rendering/transferfunction.cpp b/src/rendering/transferfunction.cpp index 15b4e47f8a..a872465cf1 100644 --- a/src/rendering/transferfunction.cpp +++ b/src/rendering/transferfunction.cpp @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include @@ -197,7 +196,7 @@ void TransferFunction::setTextureFromTxt() { _texture = std::make_unique( transferFunction, - glm::size3_t(width, 1, 1), + glm::uvec3(width, 1, 1), GL_TEXTURE_1D, ghoul::opengl::Texture::Format::RGBA, GL_RGBA, diff --git a/src/scene/asset.cpp b/src/scene/asset.cpp index 476c398461..6f2f107aaa 100644 --- a/src/scene/asset.cpp +++ b/src/scene/asset.cpp @@ -29,15 +29,12 @@ #include #include #include -#include -#include #include #include #include #include #include #include -#include namespace openspace { diff --git a/src/scene/assetmanager.cpp b/src/scene/assetmanager.cpp index d9d91bb57b..7e1ffb5f9c 100644 --- a/src/scene/assetmanager.cpp +++ b/src/scene/assetmanager.cpp @@ -25,11 +25,11 @@ #include #include -#include #include #include #include #include +#include #include #include #include diff --git a/src/scene/assetmanager_lua.inl b/src/scene/assetmanager_lua.inl index 7c01343b7d..734fde442f 100644 --- a/src/scene/assetmanager_lua.inl +++ b/src/scene/assetmanager_lua.inl @@ -22,6 +22,9 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include +#include + namespace { /** diff --git a/src/scene/profile.cpp b/src/scene/profile.cpp index cb7970720c..3a034ede25 100644 --- a/src/scene/profile.cpp +++ b/src/scene/profile.cpp @@ -32,16 +32,11 @@ #include #include #include -#include #include -#include #include #include #include -#include #include -#include -#include #include #include diff --git a/src/scene/rotation.cpp b/src/scene/rotation.cpp index 8ef010c9b5..73a35da329 100644 --- a/src/scene/rotation.cpp +++ b/src/scene/rotation.cpp @@ -31,9 +31,7 @@ #include #include #include -#include #include -#include namespace { // A `Rotation` object describes a specific rotation for a scene graph node, which may diff --git a/src/scene/scale.cpp b/src/scene/scale.cpp index aec649c5c6..a280e711bb 100644 --- a/src/scene/scale.cpp +++ b/src/scene/scale.cpp @@ -30,9 +30,7 @@ #include #include #include -#include #include -#include namespace { struct [[codegen::Dictionary(Scale)]] Parameters { diff --git a/src/scene/scene_lua.inl b/src/scene/scene_lua.inl index 8e3f2fed91..cc6fdcfe23 100644 --- a/src/scene/scene_lua.inl +++ b/src/scene/scene_lua.inl @@ -59,7 +59,6 @@ #include #include #include -#include namespace { diff --git a/src/scene/timeframe.cpp b/src/scene/timeframe.cpp index 5ac3683bda..5d6968a335 100644 --- a/src/scene/timeframe.cpp +++ b/src/scene/timeframe.cpp @@ -26,11 +26,7 @@ #include #include -#include #include -#include -#include -#include #include #include diff --git a/src/scene/translation.cpp b/src/scene/translation.cpp index b203161ceb..d579346ca4 100644 --- a/src/scene/translation.cpp +++ b/src/scene/translation.cpp @@ -29,9 +29,7 @@ #include #include #include -#include #include -#include namespace { struct [[codegen::Dictionary(Translation)]] Parameters { diff --git a/src/scripting/scriptengine.cpp b/src/scripting/scriptengine.cpp index 44ba6fb1f6..ed06101537 100644 --- a/src/scripting/scriptengine.cpp +++ b/src/scripting/scriptengine.cpp @@ -28,12 +28,9 @@ #include #include #include -#include #include #include #include -#include -#include #include #include #include diff --git a/src/scripting/scriptscheduler.cpp b/src/scripting/scriptscheduler.cpp index 2114910be1..7c7540250c 100644 --- a/src/scripting/scriptscheduler.cpp +++ b/src/scripting/scriptscheduler.cpp @@ -29,7 +29,6 @@ #include #include #include -#include #include "scriptscheduler_lua.inl" diff --git a/src/scripting/scriptscheduler_lua.inl b/src/scripting/scriptscheduler_lua.inl index 3f115fc6be..bdb86f64e3 100644 --- a/src/scripting/scriptscheduler_lua.inl +++ b/src/scripting/scriptscheduler_lua.inl @@ -26,7 +26,9 @@ namespace { -// Load timed scripts from a Lua script file that returns a list of scheduled scripts. +/** + * Load timed scripts from a Lua script file that returns a list of scheduled scripts. + */ [[codegen::luawrap]] void loadFile(std::string fileName) { using namespace openspace; @@ -80,12 +82,16 @@ namespace { global::scriptScheduler->loadScripts(scripts); } -// Clears all scheduled scripts. +/** + * Clears all scheduled scripts. + */ [[codegen::luawrap]] void clear(std::optional group) { openspace::global::scriptScheduler->clearSchedule(group); } -// Returns the list of all scheduled scripts +/** + * Returns the list of all scheduled scripts. + */ [[codegen::luawrap]] std::vector scheduledScripts() { using namespace openspace; diff --git a/src/scripting/systemcapabilitiesbinding.cpp b/src/scripting/systemcapabilitiesbinding.cpp index 26a3e081e2..19cc42159a 100644 --- a/src/scripting/systemcapabilitiesbinding.cpp +++ b/src/scripting/systemcapabilitiesbinding.cpp @@ -25,11 +25,6 @@ #include #include -#include -#include -#include -#include -#include #include "systemcapabilitiesbinding_lua.inl" diff --git a/src/scripting/systemcapabilitiesbinding_lua.inl b/src/scripting/systemcapabilitiesbinding_lua.inl index a075e5199b..e0c9ef7007 100644 --- a/src/scripting/systemcapabilitiesbinding_lua.inl +++ b/src/scripting/systemcapabilitiesbinding_lua.inl @@ -23,6 +23,10 @@ ****************************************************************************************/ #include +#include +#include +#include +#include namespace { diff --git a/src/util/boxgeometry.cpp b/src/util/boxgeometry.cpp index 524d29cb84..a5aa7e1824 100644 --- a/src/util/boxgeometry.cpp +++ b/src/util/boxgeometry.cpp @@ -24,9 +24,7 @@ #include -#include #include -#include namespace openspace { diff --git a/src/util/collisionhelper.cpp b/src/util/collisionhelper.cpp index b599beb4d2..a2ac5a37fe 100644 --- a/src/util/collisionhelper.cpp +++ b/src/util/collisionhelper.cpp @@ -24,8 +24,6 @@ #include -#include - namespace openspace::collision { // Source: http://paulbourke.net/geometry/circlesphere/raysphere.c diff --git a/src/util/coordinateconversion.cpp b/src/util/coordinateconversion.cpp index 8d3385ecc8..28da012539 100644 --- a/src/util/coordinateconversion.cpp +++ b/src/util/coordinateconversion.cpp @@ -26,7 +26,6 @@ #include #include -#include namespace { constexpr std::string_view _loggerCat = "Coordinateconversion"; diff --git a/src/util/distanceconversion.cpp b/src/util/distanceconversion.cpp index 67b10deba6..a8e1250138 100644 --- a/src/util/distanceconversion.cpp +++ b/src/util/distanceconversion.cpp @@ -27,8 +27,6 @@ #include #include -#include - namespace openspace { std::pair simplifyDistance(double meters, diff --git a/src/util/dynamicfilesequencedownloader.cpp b/src/util/dynamicfilesequencedownloader.cpp index ef28914783..6a3915e386 100644 --- a/src/util/dynamicfilesequencedownloader.cpp +++ b/src/util/dynamicfilesequencedownloader.cpp @@ -24,9 +24,9 @@ #include -#include #include -#include +#include +#include #include #include #include diff --git a/src/util/factorymanager.cpp b/src/util/factorymanager.cpp index 3f02d0d809..2429640535 100644 --- a/src/util/factorymanager.cpp +++ b/src/util/factorymanager.cpp @@ -36,7 +36,6 @@ #include #include #include -#include namespace openspace { diff --git a/src/util/geodetic.cpp b/src/util/geodetic.cpp index 2648285a72..56e47155c7 100644 --- a/src/util/geodetic.cpp +++ b/src/util/geodetic.cpp @@ -30,7 +30,6 @@ #include #include #include -#include namespace openspace { diff --git a/src/util/httprequest.cpp b/src/util/httprequest.cpp index b5237521f2..53a47585e4 100644 --- a/src/util/httprequest.cpp +++ b/src/util/httprequest.cpp @@ -25,9 +25,7 @@ #include #include -#include #include -#include #include #include diff --git a/src/util/json_helper.cpp b/src/util/json_helper.cpp index 11c05d8655..3476a00dda 100644 --- a/src/util/json_helper.cpp +++ b/src/util/json_helper.cpp @@ -86,7 +86,7 @@ std::string formatJsonNumber(double d) { return std::format("{}", d); } -void sortJson(nlohmann::json& json, const std::string& key) { +void sortJson(nlohmann::json& json, std::string_view key) { std::sort( json.begin(), json.end(), diff --git a/src/util/keys.cpp b/src/util/keys.cpp index a278136152..e332d5385b 100644 --- a/src/util/keys.cpp +++ b/src/util/keys.cpp @@ -25,7 +25,6 @@ #include #include -#include #include #include #include diff --git a/src/util/openspacemodule.cpp b/src/util/openspacemodule.cpp index 1d0afdb34d..1f92ae61d4 100644 --- a/src/util/openspacemodule.cpp +++ b/src/util/openspacemodule.cpp @@ -32,7 +32,6 @@ #include #include #include -#include #include namespace { diff --git a/src/util/planegeometry.cpp b/src/util/planegeometry.cpp index ce1bed4e43..bc62e1ed89 100644 --- a/src/util/planegeometry.cpp +++ b/src/util/planegeometry.cpp @@ -24,9 +24,7 @@ #include -#include #include -#include namespace openspace { @@ -59,11 +57,11 @@ void PlaneGeometry::updateSize(const glm::vec2& size) { updateGeometry(); } -void PlaneGeometry::updateSize(const float size) { +void PlaneGeometry::updateSize(float size) { updateSize(glm::vec2(size)); } -void PlaneGeometry::updateGeometry() { +void PlaneGeometry::updateGeometry() const { const glm::vec2 size = _size; struct VertexData { GLfloat x; diff --git a/src/util/spicemanager.cpp b/src/util/spicemanager.cpp index c8f1d3c3e4..8a6e50e2af 100644 --- a/src/util/spicemanager.cpp +++ b/src/util/spicemanager.cpp @@ -24,19 +24,14 @@ #include -#include #include #include -#include -#include #include #include #include #include #include #include -#include "SpiceUsr.h" -#include "SpiceZpr.h" #include "spicemanager_lua.inl" diff --git a/src/util/spicemanager_lua.inl b/src/util/spicemanager_lua.inl index 17ba0c9dfc..18d044ee42 100644 --- a/src/util/spicemanager_lua.inl +++ b/src/util/spicemanager_lua.inl @@ -23,6 +23,7 @@ ****************************************************************************************/ #include +#include #include namespace { diff --git a/src/util/syncbuffer.cpp b/src/util/syncbuffer.cpp index 3a7b3836d0..a4a012a487 100644 --- a/src/util/syncbuffer.cpp +++ b/src/util/syncbuffer.cpp @@ -111,7 +111,6 @@ void SyncBuffer::setData(std::vector data) { std::vector SyncBuffer::data() { _dataStream.resize(_encodeOffset); - return _dataStream; } diff --git a/src/util/taskloader.cpp b/src/util/taskloader.cpp index 0870045cdc..fb30a31977 100644 --- a/src/util/taskloader.cpp +++ b/src/util/taskloader.cpp @@ -26,11 +26,9 @@ #include #include -#include #include #include #include -#include #include #include #include diff --git a/src/util/time.cpp b/src/util/time.cpp index 3dcf06894f..9600ed863a 100644 --- a/src/util/time.cpp +++ b/src/util/time.cpp @@ -24,27 +24,20 @@ #include -#include #include +#include #include -#include -#include -#include -#include -#include +#include #include #include -#include #include #include -#include #include #include #include #include #include #include -#include #include #include "time_lua.inl" diff --git a/src/util/time_lua.inl b/src/util/time_lua.inl index f8a6a00904..b8c705ccc8 100644 --- a/src/util/time_lua.inl +++ b/src/util/time_lua.inl @@ -22,9 +22,8 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include #include -#include -#include namespace { diff --git a/src/util/timeconversion.cpp b/src/util/timeconversion.cpp index 0084a1380c..0e6c1ae35f 100644 --- a/src/util/timeconversion.cpp +++ b/src/util/timeconversion.cpp @@ -24,10 +24,6 @@ #include -#include - -#include - namespace { std::pair extractUnit(double seconds) { using namespace openspace; diff --git a/src/util/timemanager.cpp b/src/util/timemanager.cpp index e5adf07cfb..c0fa5ab847 100644 --- a/src/util/timemanager.cpp +++ b/src/util/timemanager.cpp @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include diff --git a/src/util/timerange.cpp b/src/util/timerange.cpp index a18826ee60..27d9240b60 100644 --- a/src/util/timerange.cpp +++ b/src/util/timerange.cpp @@ -27,7 +27,6 @@ #include #include #include - #include namespace { diff --git a/support/coding/codegen b/support/coding/codegen index 02b0d6ad6a..fc88af99c9 160000 --- a/support/coding/codegen +++ b/support/coding/codegen @@ -1 +1 @@ -Subproject commit 02b0d6ad6a3da07e1817f8f83aaeed01e54aa9a7 +Subproject commit fc88af99c94d344ea913de4dc4c01f82e8537ff5 diff --git a/tests/test_profile.cpp b/tests/test_profile.cpp index b8e8063224..c2a74f1ebe 100644 --- a/tests/test_profile.cpp +++ b/tests/test_profile.cpp @@ -23,18 +23,16 @@ ****************************************************************************************/ #include -#include +#include #include +#include #include #include #include #include #include #include -#include -#include -#include // clang-tidy is convinced that it is possible to use emplace_back instead of push_back // for the profiole types, but I haven't been able to convince the Visual Studio From add85f4c6d5dd1730491b76d0625b90e1ca1abbf Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 8 Dec 2025 20:21:36 +0100 Subject: [PATCH 24/43] Add new Lua function to query size of an image --- ext/ghoul | 2 +- src/engine/openspaceengine.cpp | 1 + src/engine/openspaceengine_lua.inl | 11 +++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ext/ghoul b/ext/ghoul index 50315734cb..90240b2d5b 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit 50315734cb1f3f5bd2fbfb60d599bccdfc2e8262 +Subproject commit 90240b2d5bda2c910ea04c29bc9d4210dbd339b4 diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index 695cf04c9f..1b708175ec 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -1738,6 +1738,7 @@ scripting::LuaLibrary OpenSpaceEngine::luaLibrary() { codegen::lua::RemoveTag, codegen::lua::DownloadFile, codegen::lua::CreateSingleColorImage, + codegen::lua::ImageSize, codegen::lua::SaveBase64File, codegen::lua::IsMaster, codegen::lua::Version, diff --git a/src/engine/openspaceengine_lua.inl b/src/engine/openspaceengine_lua.inl index 305450178c..5d880c6dd5 100644 --- a/src/engine/openspaceengine_lua.inl +++ b/src/engine/openspaceengine_lua.inl @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -209,6 +210,16 @@ namespace { return fileName; } +/** + * This function returns the size in pixels of an image file. + * + * \param path The location of the image file for which the pixel size will be returned + * \return The size of the image in pixels + */ +[[codegen::luawrap]] glm::ivec2 imageSize(std::filesystem::path path) { + return ghoul::io::TextureReader::ref().imageSize(path); +} + /** * This function takes a base64 encoded data string, decodes it and saves the resulting * data to the provided filepath. From 1c7a5cb79fe91793484d149f8e2606bfb374a0db Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 8 Dec 2025 20:22:33 +0100 Subject: [PATCH 25/43] Correct longitudinal grid for Ecliptic --- data/assets/scene/digitaluniverse/grids.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/assets/scene/digitaluniverse/grids.asset b/data/assets/scene/digitaluniverse/grids.asset index 8d1c23fe2f..5ee8f20cd7 100644 --- a/data/assets/scene/digitaluniverse/grids.asset +++ b/data/assets/scene/digitaluniverse/grids.asset @@ -166,7 +166,7 @@ local EclipticSphere = { Color = { 0.3, 0.15, 0.15 }, LineWidth = 2.0, LatSegments = 19, - LongSegments = 24 + LongSegments = 36 }, Tag = { "du_grid" }, GUI = { From d92e2716d011a56a699f2a39ce4a837df31737fb Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 8 Dec 2025 20:23:28 +0100 Subject: [PATCH 26/43] Remove unused intermediate scene graph nodes (Itokawa, Gaia) and make the New Horizons Label identifier more specific --- .../missions/newhorizons/label.asset | 2 +- .../scene/solarsystem/sssb/itokawa.asset | 18 +----- .../solarsystem/telescopes/gaia/gaia.asset | 23 +++++++- .../telescopes/gaia/transforms.asset | 56 ------------------- 4 files changed, 24 insertions(+), 75 deletions(-) delete mode 100644 data/assets/scene/solarsystem/telescopes/gaia/transforms.asset diff --git a/data/assets/scene/solarsystem/missions/newhorizons/label.asset b/data/assets/scene/solarsystem/missions/newhorizons/label.asset index 5afd69abac..f7169b4aa9 100644 --- a/data/assets/scene/solarsystem/missions/newhorizons/label.asset +++ b/data/assets/scene/solarsystem/missions/newhorizons/label.asset @@ -10,7 +10,7 @@ local models = asset.resource({ }) local Labels = { - Identifier = "Labels", + Identifier = "NewHorizonsLabels", Parent = NewHorizonsModel.NewHorizons.Identifier, Renderable = { Type = "RenderableModel", diff --git a/data/assets/scene/solarsystem/sssb/itokawa.asset b/data/assets/scene/solarsystem/sssb/itokawa.asset index 42ea794cd2..849cd67865 100644 --- a/data/assets/scene/solarsystem/sssb/itokawa.asset +++ b/data/assets/scene/solarsystem/sssb/itokawa.asset @@ -44,8 +44,8 @@ local ItokawaTrail = { } } -local ItokawaPosition = { - Identifier = "ItokawaPosition", +local ItokawaModel = { + Identifier = "ItokawaModel", Parent = sunTransforms.SolarSystemBarycenter.Identifier, Transform = { Translation = { @@ -53,17 +53,6 @@ local ItokawaPosition = { HorizonsTextFile = orbit .. "horizons_itokawa.hrz" } }, - GUI = { - Name = "Itokawa Position", - Path = "/Solar System/Small Bodies/Itokawa", - Description = [[Position of asteroid 25143 Itokawa from 1950 JAN 1 00:00:00 - to 2050 JAN 1 00:00:00. Data from JPL Horizons]] - } -} - -local ItokawaModel = { - Identifier = "ItokawaModel", - Parent = ItokawaPosition.Identifier, Renderable = { Type = "RenderableModel", GeometryFile = model .. "itokawa.glb", @@ -83,7 +72,6 @@ local ItokawaModel = { asset.onInitialize(function() - openspace.addSceneGraphNode(ItokawaPosition) openspace.addSceneGraphNode(ItokawaTrail) openspace.addSceneGraphNode(ItokawaModel) end) @@ -91,10 +79,8 @@ end) asset.onDeinitialize(function() openspace.removeSceneGraphNode(ItokawaModel) openspace.removeSceneGraphNode(ItokawaTrail) - openspace.removeSceneGraphNode(ItokawaPosition) end) -asset.export(ItokawaPosition) asset.export(ItokawaTrail) asset.export(ItokawaModel) diff --git a/data/assets/scene/solarsystem/telescopes/gaia/gaia.asset b/data/assets/scene/solarsystem/telescopes/gaia/gaia.asset index 7528a0a9a7..f9d6510606 100644 --- a/data/assets/scene/solarsystem/telescopes/gaia/gaia.asset +++ b/data/assets/scene/solarsystem/telescopes/gaia/gaia.asset @@ -1,4 +1,4 @@ -local transforms = asset.require("./transforms") +local earthTransforms = asset.require("scene/solarsystem/planets/earth/transforms") local sunTransform = asset.require("scene/solarsystem/sun/transforms") local sun = asset.require("scene/solarsystem/sun/sun") @@ -11,11 +11,30 @@ local model = asset.resource({ Version = 2 }) +local trail = asset.resource({ + Name = "Gaia Trail", + Type = "HttpSynchronization", + Identifier = "gaia_trail", + Version = 3 +}) + local Gaia = { Identifier = "Gaia", - Parent = transforms.GaiaPosition.Identifier, + Parent = earthTransforms.EarthCenter.Identifier, Transform = { + Translation = { + Type = "HorizonsTranslation", + HorizonsTextFile = { + trail .. "gaia_orbit_horizons_1.hrz", --2013-12-19 09:55:27 to 2014-01-19 00:00:00 + trail .. "gaia_orbit_horizons_2.hrz" --2014-01-19 00:00:00 to 2026-09-14 00:00:00 + -- Target: Gaia (spacecraft) (-139479) + -- Observer: Earth (399 GEOCENTRIC) + -- Start time: 2013-Dec-19 09:55:27 (first data point) + -- End time: 2026-Sep-14 00:00:00 (last data point) + -- Step size: First file has 40 minutes and seocnd has 1 day step size + } + }, Rotation = { Type = "FixedRotation", Attached = "Gaia", diff --git a/data/assets/scene/solarsystem/telescopes/gaia/transforms.asset b/data/assets/scene/solarsystem/telescopes/gaia/transforms.asset deleted file mode 100644 index 702bded85b..0000000000 --- a/data/assets/scene/solarsystem/telescopes/gaia/transforms.asset +++ /dev/null @@ -1,56 +0,0 @@ -local earthTransforms = asset.require("scene/solarsystem/planets/earth/transforms") - - - -local trail = asset.resource({ - Name = "Gaia Trail", - Type = "HttpSynchronization", - Identifier = "gaia_trail", - Version = 3 -}) - - -local GaiaPosition = { - Identifier = "GaiaPosition", - Parent = earthTransforms.EarthCenter.Identifier, - Transform = { - Translation = { - Type = "HorizonsTranslation", - HorizonsTextFile = { - trail .. "gaia_orbit_horizons_1.hrz", --2013-12-19 09:55:27 to 2014-01-19 00:00:00 - trail .. "gaia_orbit_horizons_2.hrz" --2014-01-19 00:00:00 to 2026-09-14 00:00:00 - -- Target: Gaia (spacecraft) (-139479) - -- Observer: Earth (399 GEOCENTRIC) - -- Start time: 2013-Dec-19 09:55:27 (first data point) - -- End time: 2026-Sep-14 00:00:00 (last data point) - -- Step size: First file has 40 minutes and seocnd has 1 day step size - } - } - }, - GUI = { - Name = "Position", - Path = "/Solar System/Telescopes/Gaia" - } -} - - -asset.onInitialize(function() - openspace.addSceneGraphNode(GaiaPosition) -end) - -asset.onDeinitialize(function() - openspace.removeSceneGraphNode(GaiaPosition) -end) - -asset.export(GaiaPosition) - - - -asset.meta = { - Name = "Gaia Transform", - Description = [[This asset contains the position of Gaia from 2013 DEC 19 09:55:27 to - 2026 SEP 14 21:15:27. Data from JPL Horizons]], - Author = "OpenSpace Team", - URL = "https://ssd.jpl.nasa.gov/horizons.cgi", - License = "NASA" -} From e13d1515a5aacbc2c6ea4781547495c819794066 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 8 Dec 2025 20:23:39 +0100 Subject: [PATCH 27/43] Remove DebugPlane example --- .../screenspacedebugplane/debugplane.ostest | 52 ------------------- 1 file changed, 52 deletions(-) delete mode 100644 visualtests/example/screenspacerenderable/screenspacedebugplane/debugplane.ostest diff --git a/visualtests/example/screenspacerenderable/screenspacedebugplane/debugplane.ostest b/visualtests/example/screenspacerenderable/screenspacedebugplane/debugplane.ostest deleted file mode 100644 index aeb8ba22b5..0000000000 --- a/visualtests/example/screenspacerenderable/screenspacedebugplane/debugplane.ostest +++ /dev/null @@ -1,52 +0,0 @@ -{ - "profile": "empty", - "commands": [ - { - "type": "asset", - "value": "examples/screenspacerenderable/screenspaceimagelocal/imagelocal.asset" - }, - { - "type": "asset", - "value": "examples/screenspacerenderable/screenspacedebugplane/debugplane.asset" - }, - { - "type": "property", - "value": { - "property": "ScreenSpace.ScreenSpaceDebugPlane_Example.FaceCamera", - "value": false - } - }, - { - "type": "property", - "value": { - "property": "ScreenSpace.ScreenSpaceDebugPlane_Example.CartesianPosition", - "value": [ - 0.0, - 0.9599999785423279, - -2.0 - ] - } - }, - { - "type": "property", - "value": { - "property": "ScreenSpace.ScreenSpaceDebugPlane_Example.Scale", - "value": 1.4500000476837158 - } - }, - { - "type": "property", - "value": { - "property": "ScreenSpace.ScreenSpaceDebugPlane_Example.Texture", - "value": 2 - } - }, - { - "type": "wait", - "value": 5 - }, - { - "type": "screenshot" - } - ] -} From f9346452cb7db3f40c1781eb9d067c879aa31320 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 8 Dec 2025 23:35:54 +0100 Subject: [PATCH 28/43] Use string_views in more query functions --- ext/ghoul | 2 +- include/openspace/properties/propertyowner.h | 6 +++--- include/openspace/query/query.h | 10 +++++----- include/openspace/scene/scene.h | 15 +++++++-------- src/properties/propertyowner.cpp | 14 +++++++------- src/query/query.cpp | 8 ++++---- src/scene/scene.cpp | 6 +----- 7 files changed, 28 insertions(+), 33 deletions(-) diff --git a/ext/ghoul b/ext/ghoul index 90240b2d5b..faa5727b46 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit 90240b2d5bda2c910ea04c29bc9d4210dbd339b4 +Subproject commit faa5727b46cc52e5052af5465bf8c580e1a23528 diff --git a/include/openspace/properties/propertyowner.h b/include/openspace/properties/propertyowner.h index 77d4e6bdd9..251cd7c062 100644 --- a/include/openspace/properties/propertyowner.h +++ b/include/openspace/properties/propertyowner.h @@ -159,7 +159,7 @@ public: * \return If the Property cannot be found, `nullptr` is returned, otherwise the * pointer to the Property is returned */ - Property* property(const std::string& uri) const; + Property* property(std::string_view uri) const; /** * Retrieves a PropertyOwner identified by \p uri from this PropertyOwner. If \p uri @@ -173,7 +173,7 @@ public: * \return If the PropertyOwner cannot be found, `nullptr` is returned, otherwise the * pointer to the PropertyOwner is returned */ - PropertyOwner* propertyOwner(const std::string& uri) const; + PropertyOwner* propertyOwner(std::string_view uri) const; /** * Returns a uri for this PropertyOwner. This is created by looking up all the owners @@ -223,7 +223,7 @@ public: * \param identifier The identifier of the sub-owner that should be returned * \return The PropertyOwner with the given \p identifier, or `nullptr` */ - PropertyOwner* propertySubOwner(const std::string& identifier) const; + PropertyOwner* propertySubOwner(std::string_view identifier) const; /** * Returns `true` if this PropertyOwner owns a sub-owner with the provided diff --git a/include/openspace/query/query.h b/include/openspace/query/query.h index 9af26edcd7..f16c10b996 100644 --- a/include/openspace/query/query.h +++ b/include/openspace/query/query.h @@ -25,7 +25,7 @@ #ifndef __OPENSPACE_CORE___QUERY___H__ #define __OPENSPACE_CORE___QUERY___H__ -#include +#include #include namespace openspace { @@ -39,10 +39,10 @@ class IswaGroup; class ScreenSpaceRenderable; Scene* sceneGraph(); -SceneGraphNode* sceneGraphNode(const std::string& name); -const Renderable* renderable(const std::string& name); -properties::Property* property(const std::string& uri); -properties::PropertyOwner* propertyOwner(const std::string& uri); +SceneGraphNode* sceneGraphNode(std::string_view name); +const Renderable* renderable(std::string_view name); +properties::Property* property(std::string_view uri); +properties::PropertyOwner* propertyOwner(std::string_view uri); const std::vector& allProperties(); const std::vector& allPropertyOwners(); diff --git a/include/openspace/scene/scene.h b/include/openspace/scene/scene.h index c319e89b86..9a052ae3a8 100644 --- a/include/openspace/scene/scene.h +++ b/include/openspace/scene/scene.h @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -115,7 +116,7 @@ public: * Return the scenegraph node with the specified name or `nullptr` if that name does * not exist. */ - SceneGraphNode* sceneGraphNode(const std::string& name) const; + SceneGraphNode* sceneGraphNode(std::string_view name) const; /** * Add a node and all its children to the scene. @@ -137,11 +138,6 @@ public: */ const std::vector& allSceneGraphNodes() const; - /** - * Returns a map from identifier to scene graph node. - */ - const std::unordered_map& nodesByIdentifier() const; - /** * Load a scene graph node from a dictionary and return it. */ @@ -268,7 +264,6 @@ private: */ void propertyPushProfileValueToLua(ghoul::lua::LuaState& L, const std::string& value); - /** * Update dependencies. */ @@ -278,7 +273,11 @@ private: std::unique_ptr _camera; std::vector _topologicallySortedNodes; std::vector _circularNodes; - std::unordered_map _nodesByIdentifier; + std::unordered_map< + std::string, SceneGraphNode*, + transparent_string_hash, + std::equal_to<> + > _nodesByIdentifier; bool _dirtyNodeRegistry = false; SceneGraphNode _rootNode; std::unique_ptr _initializer; diff --git a/src/properties/propertyowner.cpp b/src/properties/propertyowner.cpp index b48ff5d56c..1b9f13f3d3 100644 --- a/src/properties/propertyowner.cpp +++ b/src/properties/propertyowner.cpp @@ -105,7 +105,7 @@ std::vector PropertyOwner::subownersRecursive() const { return subowners; } -Property* PropertyOwner::property(const std::string& uri) const { +Property* PropertyOwner::property(std::string_view uri) const { auto it = std::find_if( _properties.begin(), _properties.end(), @@ -121,8 +121,8 @@ Property* PropertyOwner::property(const std::string& uri) const { return nullptr; } else { - const std::string ownerName = uri.substr(0, ownerSeparator); - const std::string propertyName = uri.substr(ownerSeparator + 1); + const std::string_view ownerName = uri.substr(0, ownerSeparator); + const std::string_view propertyName = uri.substr(ownerSeparator + 1); PropertyOwner* owner = propertySubOwner(ownerName); if (!owner) { @@ -139,7 +139,7 @@ Property* PropertyOwner::property(const std::string& uri) const { } } -PropertyOwner* PropertyOwner::propertyOwner(const std::string& uri) const { +PropertyOwner* PropertyOwner::propertyOwner(std::string_view uri) const { PropertyOwner* directChild = propertySubOwner(uri); if (directChild) { return directChild; @@ -153,8 +153,8 @@ PropertyOwner* PropertyOwner::propertyOwner(const std::string& uri) const { return nullptr; } else { - const std::string parentName = uri.substr(0, ownerSeparator); - const std::string ownerName = uri.substr(ownerSeparator + 1); + const std::string_view parentName = uri.substr(0, ownerSeparator); + const std::string_view ownerName = uri.substr(ownerSeparator + 1); PropertyOwner* owner = propertySubOwner(parentName); return owner ? owner->propertyOwner(ownerName) : nullptr; @@ -205,7 +205,7 @@ const std::vector& PropertyOwner::propertySubOwners() const { return _subOwners; } -PropertyOwner* PropertyOwner::propertySubOwner(const std::string& identifier) const { +PropertyOwner* PropertyOwner::propertySubOwner(std::string_view identifier) const { std::vector::const_iterator it = std::find_if( _subOwners.begin(), _subOwners.end(), diff --git a/src/query/query.cpp b/src/query/query.cpp index 6df0a0a01a..6144197c3b 100644 --- a/src/query/query.cpp +++ b/src/query/query.cpp @@ -35,7 +35,7 @@ Scene* sceneGraph() { return global::renderEngine->scene(); } -SceneGraphNode* sceneGraphNode(const std::string& name) { +SceneGraphNode* sceneGraphNode(std::string_view name) { const Scene* graph = sceneGraph(); if (!graph) { return nullptr; @@ -43,7 +43,7 @@ SceneGraphNode* sceneGraphNode(const std::string& name) { return graph->sceneGraphNode(name); } -const Renderable* renderable(const std::string& name) { +const Renderable* renderable(std::string_view name) { SceneGraphNode* node = sceneGraphNode(name); if (!node) { return nullptr; @@ -51,12 +51,12 @@ const Renderable* renderable(const std::string& name) { return node->renderable(); } -properties::Property* property(const std::string& uri) { +properties::Property* property(std::string_view uri) { properties::Property* property = global::rootPropertyOwner->property(uri); return property; } -properties::PropertyOwner* propertyOwner(const std::string& uri) { +properties::PropertyOwner* propertyOwner(std::string_view uri) { properties::PropertyOwner* property = global::rootPropertyOwner->propertyOwner(uri); return property; } diff --git a/src/scene/scene.cpp b/src/scene/scene.cpp index d07b3158e7..13673c0fee 100644 --- a/src/scene/scene.cpp +++ b/src/scene/scene.cpp @@ -524,10 +524,6 @@ void Scene::render(const RenderData& data, RendererTasks& tasks) { } } -const std::unordered_map& Scene::nodesByIdentifier() const { - return _nodesByIdentifier; -} - SceneGraphNode* Scene::root() { return &_rootNode; } @@ -536,7 +532,7 @@ const SceneGraphNode* Scene::root() const { return &_rootNode; } -SceneGraphNode* Scene::sceneGraphNode(const std::string& name) const { +SceneGraphNode* Scene::sceneGraphNode(std::string_view name) const { const auto it = _nodesByIdentifier.find(name); if (it != _nodesByIdentifier.end()) { return it->second; From a269205f5db271d6b6c89ba9e15d2c54b0c28688 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 8 Dec 2025 23:36:19 +0100 Subject: [PATCH 29/43] Pass for coding style --- apps/OpenSpace/main.cpp | 2 +- ext/ghoul | 2 +- include/openspace/events/event.h | 24 +++++++++---------- include/openspace/rendering/luaconsole.h | 3 ++- .../screenspacerenderableframebuffer.h | 6 ++--- include/openspace/util/downloadeventengine.h | 6 ++--- include/openspace/util/geodetic.h | 4 ++-- .../rendering/renderabletrailtrajectory.cpp | 10 ++++---- modules/globebrowsing/src/renderableglobe.cpp | 20 +++++++++++----- modules/globebrowsing/src/ringscomponent.cpp | 12 +++++----- .../server/src/topics/downloadeventtopic.cpp | 2 +- .../rendering/renderableorbitalkepler.cpp | 16 ++++++++----- modules/sync/syncs/httpsynchronization.cpp | 3 ++- src/engine/configuration.cpp | 1 - src/navigation/navigationhandler_lua.inl | 4 ++-- src/rendering/luaconsole.cpp | 3 ++- src/util/geodetic.cpp | 2 +- 17 files changed, 67 insertions(+), 53 deletions(-) diff --git a/apps/OpenSpace/main.cpp b/apps/OpenSpace/main.cpp index 969b90fc53..2683289563 100644 --- a/apps/OpenSpace/main.cpp +++ b/apps/OpenSpace/main.cpp @@ -1185,7 +1185,7 @@ int main(int argc, char* argv[]) { // we need to explicitly tell the operating system where to find the PDB files. We // place them right next to the .exe file and this seems to be the only reliable way // to do it. - // Using SymInitialize and SymSetSearchPath from dbghelp.h didn't work + // Using SymInitialize and SymSetSearchPath from dbghelp.h didn't work // https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/symbol-path std::string exeFolder = std::filesystem::path(argv[0]).parent_path().string(); diff --git a/ext/ghoul b/ext/ghoul index faa5727b46..570de399b4 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit faa5727b46cc52e5052af5465bf8c580e1a23528 +Subproject commit 570de399b4e2cbc84434d0495bb69877e46c0959 diff --git a/include/openspace/events/event.h b/include/openspace/events/event.h index 02a1eea501..20b2754cc6 100644 --- a/include/openspace/events/event.h +++ b/include/openspace/events/event.h @@ -60,7 +60,7 @@ struct Event { enum class Type : uint8_t { ParallelConnection, ProfileLoadingFinished, - AssetLoading, + AssetLoading, ApplicationShutdown, CameraFocusTransition, TimeOfInterestReached, @@ -160,24 +160,24 @@ struct EventProfileLoadingFinished : public Event { struct EventAssetLoading : public Event { static constexpr Type Type = Event::Type::AssetLoading; - enum class State { - Loaded, - Loading, - Unloaded, - Error - }; + enum class State { + Loaded, + Loading, + Unloaded, + Error + }; /** * Creates an instance of an AssetLoading event. - * - * \param assetPath_ The path to the asset - * \param newState The new state of the asset given by 'asstPath_'; is one of + * + * \param assetPath_ The path to the asset + * \param newState The new state of the asset given by 'asstPath_'; is one of `Loading`, `Loaded`, `Unloaded`, or `Error` */ EventAssetLoading(const std::filesystem::path& assetPath_, State newState); - std::filesystem::path assetPath; - State state; + std::filesystem::path assetPath; + State state; }; /** diff --git a/include/openspace/rendering/luaconsole.h b/include/openspace/rendering/luaconsole.h index f21cf5c72c..be1ebeb795 100644 --- a/include/openspace/rendering/luaconsole.h +++ b/include/openspace/rendering/luaconsole.h @@ -63,7 +63,8 @@ private: void parallelConnectionChanged(const ParallelConnection::Status& status); void addToCommand(const std::string& c); void registerKeyHandlers(); - void registerKeyHandler(Key key, KeyModifier modifier, std::function callback); + void registerKeyHandler(Key key, KeyModifier modifier, + std::function callback); // Helper functions for tab autocomplete void autoCompleteCommand(); diff --git a/include/openspace/rendering/screenspacerenderableframebuffer.h b/include/openspace/rendering/screenspacerenderableframebuffer.h index 13f8f6f89f..47ae17fded 100644 --- a/include/openspace/rendering/screenspacerenderableframebuffer.h +++ b/include/openspace/rendering/screenspacerenderableframebuffer.h @@ -22,8 +22,8 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#ifndef __OPENSPACE_CORE___SCREENSPACEFRAMEBUFFER___H__ -#define __OPENSPACE_CORE___SCREENSPACEFRAMEBUFFER___H__ +#ifndef __OPENSPACE_CORE___SCREENSPACERENDERABLEFRAMEBUFFER___H__ +#define __OPENSPACE_CORE___SCREENSPACERENDERABLEFRAMEBUFFER___H__ #include @@ -78,4 +78,4 @@ private: } //namespace openspace -#endif // __OPENSPACE_CORE___SCREENSPACEFRAMEBUFFER___H__ +#endif // __OPENSPACE_CORE___SCREENSPACERENDERABLEFRAMEBUFFER___H__ diff --git a/include/openspace/util/downloadeventengine.h b/include/openspace/util/downloadeventengine.h index 46c9406f8c..fcb8343ace 100644 --- a/include/openspace/util/downloadeventengine.h +++ b/include/openspace/util/downloadeventengine.h @@ -22,8 +22,8 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#ifndef __OPENSPACE_MODULE_SYNC___DOWNLOAD_EVENT_ENGINE___H__ -#define __OPENSPACE_MODULE_SYNC___DOWNLOAD_EVENT_ENGINE___H__ +#ifndef __OPENSPACE_CORE___DOWNLOAD_EVENT_ENGINE___H__ +#define __OPENSPACE_CORE___DOWNLOAD_EVENT_ENGINE___H__ #include #include @@ -69,4 +69,4 @@ private: } // namespace openspace -#endif // __OPENSPACE_MODULE_SYNC___DOWNLOAD_EVENT_ENGINE___H__ +#endif // __OPENSPACE_CORE___DOWNLOAD_EVENT_ENGINE___H__ diff --git a/include/openspace/util/geodetic.h b/include/openspace/util/geodetic.h index 66b2a42a20..fd42f2e54d 100644 --- a/include/openspace/util/geodetic.h +++ b/include/openspace/util/geodetic.h @@ -74,14 +74,14 @@ glm::dvec3 geoPositionFromCamera(); /** * Returns the camera view direction relative to the current anchor node as geodetic * coordinates. The returned value contains the latitude and longitude in degrees in the - * x, and y-coordinate respectively. + * x, and y-coordinate respectively. */ glm::dvec3 geoViewFromCamera(); /** * Return the coordinates where the sun is at its zenith at the current anchor at the * current time. The returned value contains the latitude and longitude in degrees. - */ + */ glm::dvec2 subSolarCoordinates(); /** diff --git a/modules/base/rendering/renderabletrailtrajectory.cpp b/modules/base/rendering/renderabletrailtrajectory.cpp index a587f0d8f8..990f33c1fb 100644 --- a/modules/base/rendering/renderabletrailtrajectory.cpp +++ b/modules/base/rendering/renderabletrailtrajectory.cpp @@ -76,8 +76,8 @@ namespace { "The factor that is used to create subsamples along the trajectory. This value " "(together with 'SampleInterval') determines how far apart (in seconds) the " "samples are spaced along the trajectory. Subsamples are rendered as smaller " - "points compared to normal samples (from 'SampleInterval') when rendering the " - "trail as points.", + "points compared to normal samples (from 'SampleInterval') when rendering the " + "trail as points.", openspace::properties::Property::Visibility::AdvancedUser }; @@ -115,8 +115,8 @@ namespace { // [[codegen::verbatim(SampleIntervalInfo.description)]] // The final interval is calculated as SampleInterval/TimeStampSubsampleFactor. - // If SampleInterval is not specified, it will be automatically calculated to produce - // two samples per day between the 'StartTime' and 'EndTime'. + // If SampleInterval is not specified, it will be automatically calculated to + // produce two samples per day between the 'StartTime' and 'EndTime'. std::optional sampleInterval; // [[codegen::verbatim(TimeSubSampleInfo.description)]] @@ -192,7 +192,7 @@ RenderableTrailTrajectory::RenderableTrailTrajectory(const ghoul::Dictionary& di _timeStampSubsamplingFactor = p.timeStampSubsampleFactor.value_or(_timeStampSubsamplingFactor); - _timeStampSubsamplingFactor.onChange([this]() { reset(); }); + _timeStampSubsamplingFactor.onChange([this]() { reset(); }); addProperty(_timeStampSubsamplingFactor); // We store the vertices with ascending temporal order diff --git a/modules/globebrowsing/src/renderableglobe.cpp b/modules/globebrowsing/src/renderableglobe.cpp index 465752360e..f530203e3c 100644 --- a/modules/globebrowsing/src/renderableglobe.cpp +++ b/modules/globebrowsing/src/renderableglobe.cpp @@ -1470,7 +1470,10 @@ void RenderableGlobe::renderChunkGlobally(const Chunk& chunk, const RenderData& if (_ringsComponent->textureTransparency()) { ringTextureTransparencyUnit.activate(); _ringsComponent->textureTransparency()->bind(); - program.setUniform("ringTextureTransparency", ringTextureTransparencyUnit); + program.setUniform( + "ringTextureTransparency", + ringTextureTransparencyUnit + ); } program.setUniform("textureOffset", _ringsComponent->textureOffset()); @@ -1588,7 +1591,7 @@ void RenderableGlobe::renderChunkLocally(const Chunk& chunk, const RenderData& d if (_eclipseShadowsEnabled && !_ellipsoid.shadowConfigurationArray().empty()) { calculateEclipseShadows(program, data, ShadowCompType::LOCAL_SHADOW); } - + // Shadow Mapping if (_shadowMappingProperties.shadowMapping) { // Bind ring textures for direct projection when rings component is available @@ -1605,7 +1608,10 @@ void RenderableGlobe::renderChunkLocally(const Chunk& chunk, const RenderData& d if (_ringsComponent->textureTransparency()) { ringTextureTransparencyUnit.activate(); _ringsComponent->textureTransparency()->bind(); - program.setUniform("ringTextureTransparency", ringTextureTransparencyUnit); + program.setUniform( + "ringTextureTransparency", + ringTextureTransparencyUnit + ); } program.setUniform("textureOffset", _ringsComponent->textureOffset()); @@ -1788,9 +1794,11 @@ void RenderableGlobe::recompileShaders() { std::to_string(_shadowMappingProperties.shadowMapping && _shadowComponent) ); pairs.emplace_back( - "useRingShadows", - std::to_string(_shadowMappingProperties.shadowMapping && _ringsComponent && - _ringsComponent->isEnabled()) + "useRingShadows", + std::to_string( + _shadowMappingProperties.shadowMapping && _ringsComponent && + _ringsComponent->isEnabled() + ) ); pairs.emplace_back("showChunkEdges", std::to_string(_debugProperties.showChunkEdges)); pairs.emplace_back("showHeightResolution", "0"); diff --git a/modules/globebrowsing/src/ringscomponent.cpp b/modules/globebrowsing/src/ringscomponent.cpp index f5ae517e7d..81feb7d90c 100644 --- a/modules/globebrowsing/src/ringscomponent.cpp +++ b/modules/globebrowsing/src/ringscomponent.cpp @@ -351,7 +351,7 @@ void RingsComponent::initializeGL() { glGenBuffers(1, &_vertexPositionBuffer); createPlane(); - + // Check if readiness state has changed after shader compilation checkAndNotifyReadinessChange(); } @@ -487,9 +487,9 @@ void RingsComponent::draw(const RenderData& data, _shader->setUniform(_uniformCache.colorFilterValue, _colorFilter); _shader->setUniform(_uniformCache.nightFactor, _nightFactor); _shader->setUniform(_uniformCache.sunPosition, _sunPosition); - + _shader->setUniform(_uniformCache.sunPositionObj, sunPositionObjectSpace); - + _shader->setUniform( _uniformCache.modelViewProjectionMatrix, modelViewProjectionTransform @@ -679,7 +679,7 @@ void RingsComponent::loadTexture() { "Loaded transparency texture from '{}'", absPath(_textureTransparencyPath) )); _textureTransparency = std::move(textureTransparency); - + _textureTransparency->uploadTexture(); _textureTransparency->setFilter(Texture::FilterMode::AnisotropicMipMap); @@ -691,7 +691,7 @@ void RingsComponent::loadTexture() { } _isAdvancedTextureEnabled = _textureForwards && _textureBackwards && _textureUnlit; - + // Check if readiness state has changed after loading textures checkAndNotifyReadinessChange(); } @@ -784,7 +784,7 @@ void RingsComponent::compileShadowShader() { catch (const ghoul::RuntimeError& e) { LERROR(e.message); } - + // Check if readiness state has changed after shader compilation checkAndNotifyReadinessChange(); } diff --git a/modules/server/src/topics/downloadeventtopic.cpp b/modules/server/src/topics/downloadeventtopic.cpp index 6a7dac6494..dbfc2f5fb4 100644 --- a/modules/server/src/topics/downloadeventtopic.cpp +++ b/modules/server/src/topics/downloadeventtopic.cpp @@ -76,7 +76,7 @@ void DownloadEventTopic::handleJson(const nlohmann::json& json) { payload["totalBytes"] = event.totalBytes.value(); } - _connection->sendJson(wrappedPayload(payload)); + _connection->sendJson(wrappedPayload(payload)); }; _subscriptionID = global::downloadEventEngine->subscribe(callback); } diff --git a/modules/space/rendering/renderableorbitalkepler.cpp b/modules/space/rendering/renderableorbitalkepler.cpp index 31a7bf9578..5f24936354 100644 --- a/modules/space/rendering/renderableorbitalkepler.cpp +++ b/modules/space/rendering/renderableorbitalkepler.cpp @@ -528,9 +528,13 @@ void RenderableOrbitalKepler::render(const RenderData& data, RendererTasks&) { cameraUpDirectionWorld.x, cameraUpDirectionWorld.z ); - orthoRight = glm::normalize(glm::cross(otherVector, cameraViewDirectionWorld)); + orthoRight = glm::normalize( + glm::cross(otherVector, cameraViewDirectionWorld) + ); } - glm::vec3 orthoUp = glm::normalize(glm::cross(cameraViewDirectionWorld, orthoRight)); + glm::vec3 orthoUp = glm::normalize( + glm::cross(cameraViewDirectionWorld, orthoRight) + ); _pointProgram->activate(); _pointProgram->setUniform( @@ -721,9 +725,9 @@ void RenderableOrbitalKepler::updateBuffers() { // Trail vectors needs double length as it may use two trails per orbit _startIndexTrails.resize(_sizeRender * 2); _segmentSizeTrails.resize(_sizeRender * 2); - + double maxSemiMajorAxis = 0.0; - size_t nVerticesTotal = 0; + size_t nVerticesTotal = 0; for (unsigned int i = 0; i < _sizeRender; i++) { // For points rendering as they are always two vertices long _segmentSizePoints[i] = 2; @@ -911,7 +915,7 @@ void RenderableOrbitalKepler::threadedSegmentCalculations(int threadId, else { const int trailHead = static_cast(std::ceil(frac * nSegments)); const int headVertexIndex = startVertexIndex + trailHead + 1; - const int correctTrailLength = trailLength + 3; + const int correctTrailLength = trailLength + 3; // Need to do this due to order of vertex data in the vertex buffer int correctVertexIndex = headVertexIndex - correctTrailLength; @@ -927,7 +931,7 @@ void RenderableOrbitalKepler::threadedSegmentCalculations(int threadId, p0Start = startVertexIndex; p1Start = correctVertexIndex; - // Special check to make sure we don't end up with segment + // Special check to make sure we don't end up with segment // sections 1 vertex length. A segment must contain at least 2 // vertices or more. if (lastVertexIndex - correctVertexIndex == 1) { diff --git a/modules/sync/syncs/httpsynchronization.cpp b/modules/sync/syncs/httpsynchronization.cpp index 0481b028f0..dfe72f5218 100644 --- a/modules/sync/syncs/httpsynchronization.cpp +++ b/modules/sync/syncs/httpsynchronization.cpp @@ -476,7 +476,8 @@ HttpSynchronization::trySyncFromUrl(std::string url) { } - return failed ? SynchronizationState::FileDownloadFail : SynchronizationState::Success; + return + failed ? SynchronizationState::FileDownloadFail : SynchronizationState::Success; } } // namespace openspace diff --git a/src/engine/configuration.cpp b/src/engine/configuration.cpp index ed7efa1e79..98165633c9 100644 --- a/src/engine/configuration.cpp +++ b/src/engine/configuration.cpp @@ -89,7 +89,6 @@ namespace { // up OpenSpace. If it is not provided, it defaults to 'true', i.e., each // individual property determines whether it requires a confirmation or not. std::optional showPropertyConfirmation; - // A list of paths that are automatically registered with the file system. If a // key X is used in the table, it is then useable by referencing ${X} in all other diff --git a/src/navigation/navigationhandler_lua.inl b/src/navigation/navigationhandler_lua.inl index 327a832dca..9e2582b051 100644 --- a/src/navigation/navigationhandler_lua.inl +++ b/src/navigation/navigationhandler_lua.inl @@ -534,8 +534,8 @@ struct [[codegen::Dictionary(JoystickAxis)]] JoystickAxis { * * \param horizontal The value to add in the x-direction (a positive value rotates to the * left and a negative value to the right) - * \param vertical The value to add in the y-direction (a positive value rotates the camera - * upwards and a negative value downwards) + * \param vertical The value to add in the y-direction (a positive value rotates the + * camera upwards and a negative value downwards) */ [[codegen::luawrap]] void addLocalRotation(double horizontal, double vertical) { using namespace openspace; diff --git a/src/rendering/luaconsole.cpp b/src/rendering/luaconsole.cpp index 1fa346f3af..beee7fc4cb 100644 --- a/src/rendering/luaconsole.cpp +++ b/src/rendering/luaconsole.cpp @@ -938,7 +938,8 @@ void LuaConsole::registerKeyHandlers() { return; } - // If the next character after _inputPosition is a JumpCharacter, delete just that + // If the next character after _inputPosition is a JumpCharacter, delete just + // that if (JumpCharacters.find(command[_inputPosition]) != std::string::npos) { command.erase(_inputPosition, 1); return; diff --git a/src/util/geodetic.cpp b/src/util/geodetic.cpp index 56e47155c7..1ae39f4f1a 100644 --- a/src/util/geodetic.cpp +++ b/src/util/geodetic.cpp @@ -132,7 +132,7 @@ glm::dvec3 geoViewFromCamera() { glm::normalize(cameraPositionModelSpace), glm::normalize(glm::transpose(rotationOnly) * cameraViewDirection) ); - + const SurfacePositionHandle posHandle = n->calculateSurfacePositionHandle( cameraViewDirectionModelSpace ); From 1e05316d303f7547ecc4b7d02ed1f94f9843c4d5 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 10 Dec 2025 09:53:25 +0100 Subject: [PATCH 30/43] Fix reported compile issue --- apps/OpenSpace/ext/launcher/src/profile/scriptlogdialog.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/OpenSpace/ext/launcher/src/profile/scriptlogdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/scriptlogdialog.cpp index dd318b90c8..26865d06ac 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/scriptlogdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/scriptlogdialog.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include From 9eea142cbde0151385fb859c0988fb3b867caa57 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Wed, 10 Dec 2025 13:40:29 +0100 Subject: [PATCH 31/43] Update GUI Hash Video player + custom property owner code refactor https://github.com/OpenSpace/OpenSpace-WebGui/pull/192 --- 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 f81611e34c..1b54050910 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 UI frontend -local frontendHash = "45fbb2cf898466250c7ad4dd332ceec5a1d15c0d" +local frontendHash = "3ef4f651cd245e55ed614e6eddb1c17021a684a5" -- The name of the file to download from the server local frontendFile = "frontend.zip" From d4d323ac491d50a4c37935b5dce8688c97353930 Mon Sep 17 00:00:00 2001 From: Emma Broman Date: Thu, 11 Dec 2025 17:16:35 +0100 Subject: [PATCH 32/43] Fix broken top bar submenus on touch screens (#3867) --- 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 1b54050910..62bc8d7c35 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 UI frontend -local frontendHash = "3ef4f651cd245e55ed614e6eddb1c17021a684a5" +local frontendHash = "ab37d20255239643a91173601e0e8ea7caec7d37" -- The name of the file to download from the server local frontendFile = "frontend.zip" From 1e697caba8340331f2d1b0f223261e20ea064cb1 Mon Sep 17 00:00:00 2001 From: Andreas Engberg <48772850+engbergandreas@users.noreply.github.com> Date: Tue, 16 Dec 2025 11:09:12 +0100 Subject: [PATCH 33/43] Feature/globebrowsing (#3849) * add globebrowsing panel to WebGui --- data/web/default_ui_panels.json | 236 +++++++++--------- modules/globebrowsing/globebrowsingmodule.cpp | 4 +- .../globebrowsing/globebrowsingmodule_lua.inl | 93 +++++++ 3 files changed, 217 insertions(+), 116 deletions(-) diff --git a/data/web/default_ui_panels.json b/data/web/default_ui_panels.json index 8721e18de1..36f2b4eefe 100644 --- a/data/web/default_ui_panels.json +++ b/data/web/default_ui_panels.json @@ -1,116 +1,122 @@ { - "0": { - "id": "scene", - "visible": true, - "name": "Scene", - "isOpen": false - }, - "1": { - "id": "settings", - "visible": false, - "name": "Settings", - "isOpen": false - }, - "2": { - "id": "navigation", - "visible": true, - "name": "Navigation", - "isOpen": false - }, - "3": { - "id": "timePanel", - "visible": true, - "name": "Time Panel", - "isOpen": false - }, - "4": { - "id": "sessionRecording", - "visible": true, - "name": "Session Recording", - "isOpen": false - }, - "5": { - "id": "geoLocation", - "visible": true, - "name": "Geo Location", - "isOpen": false - }, - "6": { - "id": "screenSpaceRenderables", - "visible": true, - "name": "Screenspace Renderables", - "isOpen": false - }, - "7": { - "id": "exoplanets", - "visible": true, - "name": "Exoplanets", - "isOpen": false - }, - "8": { - "id": "userPanels", - "visible": true, - "name": "User Panels", - "isOpen": false - }, - "9": { - "id": "actions", - "visible": true, - "name": "Actions", - "isOpen": false - }, - "10": { - "id": "skyBrowser", - "visible": true, - "name": "SkyBrowser", - "isOpen": false - }, - "11": { - "id": "mission", - "visible": false, - "name": "Mission", - "isOpen": false - }, - "12": { - "id": "flightControl", - "visible": true, - "name": "Flight Control", - "isOpen": false - }, - "13": { - "id": "keybindingsLayout", - "visible": false, - "name": "Keybinds", - "isOpen": false - }, - "14": { - "id": "nightSky", - "visible": false, - "name": "Night Sky", - "isOpen": false - }, - "15": { - "id": "gettingStartedTour", - "visible": false, - "name": "Getting Started Tour", - "isOpen": false - }, - "16": { - "id": "scriptLogPanel", - "visible": false, - "name": "Script Log", - "isOpen": false - }, - "17": { - "id": "assetsFolderPanel", - "visible": false, - "name": "Assets", - "isOpen": false - }, - "18": { - "id": "devPanel", - "visible": false, - "name": "Dev Panel", - "isOpen": false - } -} \ No newline at end of file + "0": { + "id": "scene", + "visible": true, + "name": "Scene", + "isOpen": false + }, + "1": { + "id": "settings", + "visible": false, + "name": "Settings", + "isOpen": false + }, + "2": { + "id": "navigation", + "visible": true, + "name": "Navigation", + "isOpen": false + }, + "3": { + "id": "timePanel", + "visible": true, + "name": "Time Panel", + "isOpen": false + }, + "4": { + "id": "sessionRecording", + "visible": true, + "name": "Session Recording", + "isOpen": false + }, + "5": { + "id": "geoLocation", + "visible": true, + "name": "Geo Location", + "isOpen": false + }, + "6": { + "id": "screenSpaceRenderables", + "visible": true, + "name": "Screenspace Renderables", + "isOpen": false + }, + "7": { + "id": "exoplanets", + "visible": true, + "name": "Exoplanets", + "isOpen": false + }, + "8": { + "id": "userPanels", + "visible": true, + "name": "User Panels", + "isOpen": false + }, + "9": { + "id": "actions", + "visible": true, + "name": "Actions", + "isOpen": false + }, + "10": { + "id": "skyBrowser", + "visible": true, + "name": "SkyBrowser", + "isOpen": false + }, + "11": { + "id": "mission", + "visible": false, + "name": "Mission", + "isOpen": false + }, + "12": { + "id": "flightControl", + "visible": true, + "name": "Flight Control", + "isOpen": false + }, + "13": { + "id": "keybindingsLayout", + "visible": false, + "name": "Keybinds", + "isOpen": false + }, + "14": { + "id": "nightSky", + "visible": false, + "name": "Night Sky", + "isOpen": false + }, + "15": { + "id": "gettingStartedTour", + "visible": false, + "name": "Getting Started Tour", + "isOpen": false + }, + "16": { + "id": "scriptLogPanel", + "visible": false, + "name": "Script Log", + "isOpen": false + }, + "17": { + "id": "assetsFolderPanel", + "visible": false, + "name": "Assets", + "isOpen": false + }, + "18": { + "id": "globeImageryBrowserPanel", + "visible": false, + "name": "Globe Imagery Browser", + "isOpen": false + }, + "19": { + "id": "devPanel", + "visible": false, + "name": "Dev Panel", + "isOpen": false + } +} diff --git a/modules/globebrowsing/globebrowsingmodule.cpp b/modules/globebrowsing/globebrowsingmodule.cpp index ff765103a2..5109c1e1ab 100644 --- a/modules/globebrowsing/globebrowsingmodule.cpp +++ b/modules/globebrowsing/globebrowsingmodule.cpp @@ -515,7 +515,9 @@ scripting::LuaLibrary GlobeBrowsingModule::luaLibrary() const { codegen::lua::CapabilitiesWMS, codegen::lua::AddGeoJson, codegen::lua::DeleteGeoJson, - codegen::lua::AddGeoJsonFromFile + codegen::lua::AddGeoJsonFromFile, + codegen::lua::Globes, + codegen::lua::UrlInfo }, .scripts = { absPath("${MODULE_GLOBEBROWSING}/scripts/layer_support.lua"), diff --git a/modules/globebrowsing/globebrowsingmodule_lua.inl b/modules/globebrowsing/globebrowsingmodule_lua.inl index 1082128c8b..5654e717d9 100644 --- a/modules/globebrowsing/globebrowsingmodule_lua.inl +++ b/modules/globebrowsing/globebrowsingmodule_lua.inl @@ -533,6 +533,99 @@ namespace { globe->geoJsonManager().addGeoJsonLayer(d); } +/** + * Returns an object containing a list of all loaded `RenderableGlobe`s sorted first by + * the presence of WMS server info, then alphabetically. The index `firstIndexWithoutUrl` + * indicates the first item in the list that does not have WMS server info. + * + * \return Table containing a list of `renderableGlobe` identifiers, and an index + * indicating the first item in the list that does not have a WMS server + */ +[[codegen::luawrap]] ghoul::Dictionary globes() { + using namespace openspace; + using namespace globebrowsing; + GlobeBrowsingModule* module = global::moduleEngine->module(); + + std::vector nodes = + global::renderEngine->scene()->allSceneGraphNodes(); + + nodes.erase( + std::remove_if( + nodes.begin(), + nodes.end(), + [](const SceneGraphNode* n) { + const Renderable* r = n->renderable(); + const RenderableGlobe* rg = dynamic_cast(r); + return rg == nullptr; + } + ), + nodes.end() + ); + + // Sort the globes with respect to WMS server info followed by alphabetical order + std::sort( + nodes.begin(), + nodes.end(), + [module](const SceneGraphNode* lhs, const SceneGraphNode* rhs) { + const bool lhsHasUrl = module->hasUrlInfo(lhs->identifier()); + const bool rhsHasUrl = module->hasUrlInfo(rhs->identifier()); + + if (lhsHasUrl && !rhsHasUrl) { + return true; + } + if (!lhsHasUrl && rhsHasUrl) { + return false; + } + + return lhs->guiName() < rhs->guiName(); + } + ); + std::vector globeIdentifiers; + globeIdentifiers.reserve(nodes.size()); + for (const SceneGraphNode* node : nodes) { + globeIdentifiers.push_back(node->identifier()); + } + + auto firstWithoutUrl = std::find_if( + nodes.begin(), + nodes.end(), + [module](const SceneGraphNode* n) { + return !module->hasUrlInfo(n->identifier()); + } + ); + + int index = static_cast(firstWithoutUrl - nodes.begin()); + + ghoul::Dictionary e; + e.setValue("identifiers", globeIdentifiers); + e.setValue("firstIndexWithoutUrl", index); + return e; +} + +/** + * Return a list of all WMS servers associated with the `renderableGlobe` globe. + * + * \param globe The identifier of the `renderableGlobe` to fetch WMS servers for + * \return A list of WMS server info containing its name and URL + */ +[[codegen::luawrap]] std::vector urlInfo(std::string globe) { + using namespace openspace; + using namespace globebrowsing; + GlobeBrowsingModule* module = global::moduleEngine->module(); + std::vector info = module->urlInfo(globe); + + std::vector res; + for (const GlobeBrowsingModule::UrlInfo& i : info) { + ghoul::Dictionary e; + e.setValue("name", i.name); + e.setValue("url", i.url); + res.push_back(std::move(e)); + } + + return res; +} + #include "globebrowsingmodule_lua_codegen.cpp" } // namespace + From c4fe07870601b5c7f13018af39d090cdd097b0c8 Mon Sep 17 00:00:00 2001 From: Andreas Engberg Date: Tue, 16 Dec 2025 11:12:11 +0100 Subject: [PATCH 34/43] Update WebGui 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 62bc8d7c35..98a5a54119 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 UI frontend -local frontendHash = "ab37d20255239643a91173601e0e8ea7caec7d37" +local frontendHash = "dfec6044957586573048cdc91861544471fb5283" -- The name of the file to download from the server local frontendFile = "frontend.zip" From c02e59b9f8a8a7aeb13dc15ca1eb1c622790c3d3 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Tue, 16 Dec 2025 13:40:19 +0100 Subject: [PATCH 35/43] Fixing more includes and forward declarations (#3876) --- .../ext/launcher/include/backgroundimage.h | 3 + .../ext/launcher/include/filesystemaccess.h | 6 + .../ext/launcher/include/launcherwindow.h | 7 +- .../ext/launcher/include/notificationwindow.h | 2 + .../launcher/include/profile/actiondialog.h | 4 +- .../include/profile/additionalscriptsdialog.h | 5 + .../ext/launcher/include/profile/assetedit.h | 4 - .../launcher/include/profile/assetsdialog.h | 14 +- .../launcher/include/profile/assettreeitem.h | 1 + .../launcher/include/profile/assettreemodel.h | 6 + .../launcher/include/profile/cameradialog.h | 2 + .../include/profile/deltatimesdialog.h | 6 + .../launcher/include/profile/horizonsdialog.h | 4 + .../include/profile/marknodesdialog.h | 5 + .../ext/launcher/include/profile/metadialog.h | 2 +- .../launcher/include/profile/modulesdialog.h | 3 + .../launcher/include/profile/profileedit.h | 6 +- .../include/profile/propertiesdialog.h | 3 + .../include/profile/scriptlogdialog.h | 4 + .../ext/launcher/include/profile/timedialog.h | 2 + .../launcher/include/profile/uipanelsdialog.h | 4 + .../ext/launcher/include/settingsdialog.h | 1 + .../include/sgctedit/displaywindowunion.h | 2 + .../launcher/include/sgctedit/monitorbox.h | 6 +- .../ext/launcher/include/sgctedit/sgctedit.h | 1 + .../launcher/include/sgctedit/windowcontrol.h | 5 + .../ext/launcher/include/splitcombobox.h | 5 +- .../ext/launcher/src/backgroundimage.cpp | 5 + .../ext/launcher/src/filesystemaccess.cpp | 3 + .../ext/launcher/src/launcherwindow.cpp | 10 +- .../ext/launcher/src/notificationwindow.cpp | 7 + .../ext/launcher/src/profile/actiondialog.cpp | 2 + .../src/profile/additionalscriptsdialog.cpp | 1 + .../ext/launcher/src/profile/assetsdialog.cpp | 5 +- .../launcher/src/profile/assettreeitem.cpp | 4 + .../launcher/src/profile/assettreemodel.cpp | 2 + .../ext/launcher/src/profile/cameradialog.cpp | 5 + .../launcher/src/profile/deltatimesdialog.cpp | 1 - .../launcher/src/profile/horizonsdialog.cpp | 7 +- .../ext/launcher/src/profile/metadialog.cpp | 1 + .../launcher/src/profile/modulesdialog.cpp | 2 + .../ext/launcher/src/profile/profileedit.cpp | 6 +- .../launcher/src/profile/propertiesdialog.cpp | 3 + .../launcher/src/profile/scriptlogdialog.cpp | 4 +- .../launcher/src/profile/uipanelsdialog.cpp | 3 + .../ext/launcher/src/settingsdialog.cpp | 6 + .../src/sgctedit/displaywindowunion.cpp | 4 + .../ext/launcher/src/sgctedit/monitorbox.cpp | 1 + .../ext/launcher/src/sgctedit/sgctedit.cpp | 8 + .../launcher/src/sgctedit/windowcontrol.cpp | 8 +- .../ext/launcher/src/splitcombobox.cpp | 2 + apps/OpenSpace/ext/launcher/src/usericon.cpp | 3 + apps/OpenSpace/ext/sgct | 2 +- ext/ghoul | 2 +- include/openspace/camera/camera.h | 4 + include/openspace/data/csvloader.h | 3 + include/openspace/data/datamapping.h | 2 + include/openspace/data/speckloader.h | 8 +- .../documentation/documentationengine.h | 1 + include/openspace/documentation/verifier.h | 9 + include/openspace/documentation/verifier.inl | 5 +- include/openspace/engine/configuration.h | 2 +- include/openspace/engine/downloadmanager.h | 1 + include/openspace/engine/globals.h | 38 +- include/openspace/engine/moduleengine.h | 4 +- include/openspace/engine/openspaceengine.h | 9 +- include/openspace/engine/settings.h | 1 + include/openspace/engine/syncengine.h | 2 +- include/openspace/events/event.h | 20 +- include/openspace/events/eventengine.h | 8 +- include/openspace/interaction/actionmanager.h | 2 + .../openspace/interaction/delayedvariable.h | 1 + .../interaction/joystickcamerastates.h | 4 + .../interaction/joystickinputstate.h | 4 + .../openspace/interaction/keybindingmanager.h | 6 +- .../interaction/keyboardinputstate.h | 1 + .../interaction/keyframerecordinghandler.h | 4 +- .../openspace/interaction/mousecamerastates.h | 3 +- .../openspace/interaction/sessionrecording.h | 3 +- .../interaction/sessionrecordinghandler.h | 11 + .../interaction/tasks/convertrecformattask.h | 7 +- .../interaction/websocketcamerastates.h | 4 + .../interaction/websocketinputstate.h | 2 + include/openspace/mission/mission.h | 3 +- include/openspace/mission/missionmanager.h | 1 - .../openspace/navigation/keyframenavigator.h | 4 +- .../openspace/navigation/navigationhandler.h | 13 +- .../openspace/navigation/navigationstate.h | 9 +- .../openspace/navigation/orbitalnavigator.h | 6 +- include/openspace/navigation/path.h | 10 +- include/openspace/navigation/pathcurve.h | 1 + .../pathcurves/avoidcollisioncurve.h | 2 +- .../pathcurves/zoomoutoverviewcurve.h | 2 +- include/openspace/navigation/pathnavigator.h | 3 +- include/openspace/network/messagestructures.h | 435 ++---------------- .../network/messagestructureshelper.h | 6 +- .../openspace/network/parallelconnection.h | 2 + include/openspace/network/parallelpeer.h | 1 + .../properties/list/doublelistproperty.h | 2 +- .../properties/list/intlistproperty.h | 2 +- .../properties/list/stringlistproperty.h | 5 +- .../properties/matrix/dmat2property.h | 3 +- .../properties/matrix/dmat3property.h | 3 +- .../properties/matrix/dmat4property.h | 3 +- .../properties/matrix/mat2property.h | 4 +- .../properties/matrix/mat3property.h | 3 +- .../properties/matrix/mat4property.h | 2 +- .../openspace/properties/misc/listproperty.h | 4 +- .../properties/misc/optionproperty.h | 6 +- .../properties/misc/selectionproperty.h | 2 - .../properties/misc/stringproperty.h | 2 +- .../properties/misc/triggerproperty.h | 2 +- .../openspace/properties/numericalproperty.h | 3 +- include/openspace/properties/property.h | 7 + include/openspace/properties/propertyowner.h | 1 + .../properties/scalar/boolproperty.h | 2 +- .../properties/scalar/doubleproperty.h | 3 +- .../properties/scalar/floatproperty.h | 3 +- .../openspace/properties/scalar/intproperty.h | 1 + .../properties/scalar/longproperty.h | 3 +- .../properties/scalar/shortproperty.h | 3 +- .../properties/scalar/uintproperty.h | 3 +- .../properties/scalar/ulongproperty.h | 3 +- .../properties/scalar/ushortproperty.h | 3 +- .../properties/vector/dvec2property.h | 3 +- .../properties/vector/dvec3property.h | 3 +- .../properties/vector/dvec4property.h | 3 +- .../properties/vector/ivec2property.h | 2 +- .../properties/vector/ivec3property.h | 2 +- .../properties/vector/ivec4property.h | 2 +- .../properties/vector/uvec2property.h | 2 +- .../properties/vector/uvec3property.h | 2 +- .../properties/vector/uvec4property.h | 2 +- .../properties/vector/vec2property.h | 2 +- .../properties/vector/vec3property.h | 2 +- .../properties/vector/vec4property.h | 2 +- include/openspace/query/query.h | 8 +- .../rendering/colormappingcomponent.h | 7 + include/openspace/rendering/dashboard.h | 2 + include/openspace/rendering/dashboarditem.h | 1 + .../openspace/rendering/dashboardtextitem.h | 3 - include/openspace/rendering/deferredcaster.h | 15 +- .../openspace/rendering/framebufferrenderer.h | 3 - include/openspace/rendering/helper.h | 12 +- include/openspace/rendering/labelscomponent.h | 4 +- include/openspace/rendering/loadingscreen.h | 5 +- include/openspace/rendering/luaconsole.h | 2 + .../openspace/rendering/raycastermanager.h | 2 +- include/openspace/rendering/renderable.h | 18 +- include/openspace/rendering/renderengine.h | 23 +- .../rendering/screenspacerenderable.h | 3 + .../screenspacerenderableframebuffer.h | 10 +- .../rendering/screenspacerenderabletext.h | 17 +- .../openspace/rendering/texturecomponent.h | 1 + include/openspace/rendering/volumeraycaster.h | 13 +- include/openspace/scene/asset.h | 5 +- include/openspace/scene/assetmanager.h | 11 +- include/openspace/scene/lightsource.h | 1 - include/openspace/scene/profile.h | 6 +- include/openspace/scene/rotation.h | 5 +- include/openspace/scene/scale.h | 4 +- include/openspace/scene/scene.h | 27 +- include/openspace/scene/scenegraphnode.h | 13 +- include/openspace/scene/sceneinitializer.h | 3 +- include/openspace/scene/timeframe.h | 6 +- include/openspace/scene/translation.h | 4 +- include/openspace/scripting/lualibrary.h | 3 +- include/openspace/scripting/scriptengine.h | 7 +- include/openspace/scripting/scriptscheduler.h | 6 +- include/openspace/util/coordinateconversion.h | 1 + include/openspace/util/distanceconstants.h | 34 +- include/openspace/util/distanceconversion.h | 3 +- include/openspace/util/downloadeventengine.h | 3 +- .../util/dynamicfilesequencedownloader.h | 2 +- include/openspace/util/ellipsoid.h | 1 + include/openspace/util/factorymanager.h | 2 + include/openspace/util/factorymanager.inl | 1 + include/openspace/util/histogram.h | 3 +- include/openspace/util/httprequest.h | 5 +- include/openspace/util/json_helper.h | 3 +- include/openspace/util/keys.h | 2 + include/openspace/util/openspacemodule.h | 5 +- .../openspace/util/resourcesynchronization.h | 1 + include/openspace/util/syncable.h | 8 +- include/openspace/util/syncbuffer.h | 1 + include/openspace/util/task.h | 9 +- include/openspace/util/threadpool.h | 12 +- include/openspace/util/timeconversion.h | 3 + include/openspace/util/touch.h | 6 +- .../rendering/atmospheredeferredcaster.cpp | 15 + .../rendering/atmospheredeferredcaster.h | 11 +- .../rendering/renderableatmosphere.cpp | 12 +- .../rendering/renderableatmosphere.h | 18 +- modules/audio/audiomodule.cpp | 11 +- modules/audio/audiomodule.h | 6 +- modules/audio/audiomodule_lua.inl | 2 +- modules/base/basemodule.cpp | 5 +- modules/base/dashboard/dashboarditemangle.cpp | 10 +- modules/base/dashboard/dashboarditemangle.h | 2 - .../dashboarditemcameraorientation.cpp | 4 +- modules/base/dashboard/dashboarditemdate.cpp | 7 +- modules/base/dashboard/dashboarditemdate.h | 2 - .../base/dashboard/dashboarditemdistance.cpp | 9 +- .../base/dashboard/dashboarditemdistance.h | 2 - .../dashboard/dashboarditemelapsedtime.cpp | 10 +- .../base/dashboard/dashboarditemelapsedtime.h | 2 - .../base/dashboard/dashboarditemframerate.cpp | 8 +- .../base/dashboard/dashboarditemframerate.h | 4 - .../dashboard/dashboarditeminputstate.cpp | 8 +- .../base/dashboard/dashboarditeminputstate.h | 3 - .../base/dashboard/dashboarditemmission.cpp | 6 +- modules/base/dashboard/dashboarditemmission.h | 2 - .../dashboarditemparallelconnection.cpp | 7 +- .../dashboarditemparallelconnection.h | 2 - .../dashboard/dashboarditempropertyvalue.cpp | 12 +- .../dashboard/dashboarditempropertyvalue.h | 2 - .../dashboarditemsimulationincrement.cpp | 9 +- .../dashboarditemsimulationincrement.h | 2 - .../base/dashboard/dashboarditemspacing.cpp | 2 +- modules/base/dashboard/dashboarditemspacing.h | 2 - modules/base/dashboard/dashboarditemtext.cpp | 5 +- modules/base/dashboard/dashboarditemtext.h | 2 - .../dashboarditemtimevaryingtext.cpp | 11 +- .../dashboard/dashboarditemtimevaryingtext.h | 5 +- .../base/dashboard/dashboarditemvelocity.cpp | 8 +- .../base/dashboard/dashboarditemvelocity.h | 5 - .../base/lightsource/cameralightsource.cpp | 2 +- modules/base/lightsource/cameralightsource.h | 2 - .../lightsource/scenegraphlightsource.cpp | 2 +- .../base/lightsource/scenegraphlightsource.h | 2 +- .../rendering/grids/renderableboxgrid.cpp | 7 +- .../base/rendering/grids/renderableboxgrid.h | 6 - .../base/rendering/grids/renderablegrid.cpp | 6 +- modules/base/rendering/grids/renderablegrid.h | 5 +- .../rendering/grids/renderableradialgrid.cpp | 5 +- .../rendering/grids/renderableradialgrid.h | 7 +- .../grids/renderablesphericalgrid.cpp | 6 +- .../rendering/grids/renderablesphericalgrid.h | 5 +- .../renderableinterpolatedpoints.cpp | 8 +- .../pointcloud/renderableinterpolatedpoints.h | 7 +- .../pointcloud/renderablepointcloud.cpp | 23 +- .../pointcloud/renderablepointcloud.h | 18 +- .../pointcloud/renderablepolygoncloud.cpp | 7 +- .../pointcloud/renderablepolygoncloud.h | 8 +- .../pointcloud/sizemappingcomponent.cpp | 4 + .../pointcloud/sizemappingcomponent.h | 2 + .../rendering/renderablecartesianaxes.cpp | 7 +- .../base/rendering/renderablecartesianaxes.h | 8 - modules/base/rendering/renderabledisc.cpp | 5 +- modules/base/rendering/renderabledisc.h | 7 +- .../rendering/renderabledistancelabel.cpp | 5 +- .../base/rendering/renderabledistancelabel.h | 2 - modules/base/rendering/renderablelabel.cpp | 17 +- modules/base/rendering/renderablelabel.h | 16 +- modules/base/rendering/renderablemodel.cpp | 14 +- modules/base/rendering/renderablemodel.h | 27 +- .../base/rendering/renderablenodearrow.cpp | 15 +- modules/base/rendering/renderablenodearrow.h | 7 +- modules/base/rendering/renderablenodeline.cpp | 6 +- modules/base/rendering/renderablenodeline.h | 10 +- modules/base/rendering/renderableplane.cpp | 13 +- modules/base/rendering/renderableplane.h | 13 +- .../rendering/renderableplaneimagelocal.cpp | 8 +- .../rendering/renderableplaneimagelocal.h | 9 +- .../rendering/renderableplaneimageonline.cpp | 9 +- .../rendering/renderableplaneimageonline.h | 11 +- .../renderableplanetimevaryingimage.cpp | 12 +- .../renderableplanetimevaryingimage.h | 11 +- modules/base/rendering/renderableprism.cpp | 6 +- modules/base/rendering/renderableprism.h | 7 +- modules/base/rendering/renderablesphere.cpp | 9 +- modules/base/rendering/renderablesphere.h | 15 +- .../rendering/renderablesphereimagelocal.cpp | 7 +- .../rendering/renderablesphereimagelocal.h | 9 +- .../rendering/renderablesphereimageonline.cpp | 7 +- .../rendering/renderablesphereimageonline.h | 11 +- modules/base/rendering/renderableswitch.cpp | 13 +- modules/base/rendering/renderableswitch.h | 7 +- .../rendering/renderabletimevaryingsphere.cpp | 8 +- .../rendering/renderabletimevaryingsphere.h | 9 +- modules/base/rendering/renderabletrail.cpp | 7 +- modules/base/rendering/renderabletrail.h | 10 - .../base/rendering/renderabletrailorbit.cpp | 18 +- modules/base/rendering/renderabletrailorbit.h | 2 - .../rendering/renderabletrailtrajectory.cpp | 6 +- .../rendering/renderabletrailtrajectory.h | 3 - .../base/rendering/screenspacedashboard.cpp | 9 +- modules/base/rendering/screenspacedashboard.h | 6 - .../rendering/screenspacedashboard_lua.inl | 1 + modules/base/rendering/screenspacedate.cpp | 7 +- .../base/rendering/screenspaceimagelocal.cpp | 6 +- .../base/rendering/screenspaceimagelocal.h | 2 - .../base/rendering/screenspaceimageonline.cpp | 6 +- .../base/rendering/screenspaceimageonline.h | 3 +- .../rendering/screenspaceinsetblackout.cpp | 16 +- .../base/rendering/screenspaceinsetblackout.h | 7 +- .../screenspacerenderablerenderable.cpp | 6 + .../screenspacerenderablerenderable.h | 8 +- modules/base/rendering/screenspacetext.cpp | 5 +- .../screenspacetimevaryingimageonline.cpp | 9 +- .../screenspacetimevaryingimageonline.h | 3 +- modules/base/rotation/constantrotation.cpp | 2 +- modules/base/rotation/constantrotation.h | 2 - modules/base/rotation/fixedrotation.cpp | 3 +- modules/base/rotation/fixedrotation.h | 3 - modules/base/rotation/globerotation.cpp | 7 +- modules/base/rotation/luarotation.cpp | 5 +- modules/base/rotation/luarotation.h | 4 +- modules/base/rotation/multirotation.cpp | 6 +- modules/base/rotation/multirotation.h | 6 - modules/base/rotation/staticrotation.cpp | 2 +- modules/base/rotation/staticrotation.h | 2 - modules/base/rotation/timelinerotation.cpp | 3 +- modules/base/rotation/timelinerotation.h | 4 - modules/base/scale/luascale.cpp | 5 +- modules/base/scale/luascale.h | 3 +- modules/base/scale/multiscale.cpp | 6 +- modules/base/scale/multiscale.h | 2 - modules/base/scale/nonuniformstaticscale.cpp | 2 +- modules/base/scale/nonuniformstaticscale.h | 2 - modules/base/scale/staticscale.cpp | 1 - modules/base/scale/staticscale.h | 2 - modules/base/scale/timedependentscale.cpp | 3 +- modules/base/scale/timedependentscale.h | 2 - modules/base/scale/timelinescale.cpp | 3 +- modules/base/scale/timelinescale.h | 5 - modules/base/task/convertmodeltask.cpp | 2 + modules/base/task/convertmodeltask.h | 1 - modules/base/timeframe/timeframeinterval.cpp | 4 +- modules/base/timeframe/timeframeinterval.h | 6 +- modules/base/timeframe/timeframeunion.cpp | 6 +- modules/base/timeframe/timeframeunion.h | 4 - modules/base/translation/globetranslation.cpp | 7 +- modules/base/translation/luatranslation.cpp | 4 +- modules/base/translation/luatranslation.h | 2 - modules/base/translation/multitranslation.cpp | 6 +- modules/base/translation/multitranslation.h | 4 - .../base/translation/statictranslation.cpp | 1 - modules/base/translation/statictranslation.h | 4 - .../base/translation/timelinetranslation.cpp | 3 +- .../base/translation/timelinetranslation.h | 5 - modules/cefwebgui/cefwebguimodule.cpp | 1 + modules/cefwebgui/cefwebguimodule.h | 1 + modules/cefwebgui/include/guirenderhandler.h | 1 - modules/cefwebgui/src/guikeyboardhandler.cpp | 1 + modules/cefwebgui/src/guirenderhandler.cpp | 3 +- modules/debugging/debuggingmodule.cpp | 11 +- modules/debugging/debuggingmodule_lua.inl | 4 + modules/debugging/rendering/debugrenderer.cpp | 5 + .../rendering/screenspacedebugplane.cpp | 2 + .../digitaluniverse/digitaluniversemodule.cpp | 3 + .../rendering/renderabledumeshes.cpp | 20 +- .../rendering/renderabledumeshes.h | 9 +- modules/exoplanets/datastructure.cpp | 7 +- modules/exoplanets/datastructure.h | 2 +- modules/exoplanets/exoplanetshelper.cpp | 8 +- modules/exoplanets/exoplanetshelper.h | 1 - modules/exoplanets/exoplanetsmodule.cpp | 17 +- modules/exoplanets/exoplanetsmodule.h | 1 + modules/exoplanets/exoplanetsmodule_lua.inl | 3 + .../rendering/renderableorbitdisc.cpp | 9 +- .../rendering/renderableorbitdisc.h | 7 +- .../tasks/exoplanetsdatapreparationtask.cpp | 9 +- .../tasks/exoplanetsdatapreparationtask.h | 3 +- modules/fieldlines/fieldlinesmodule.cpp | 1 + .../rendering/renderablefieldlines.cpp | 7 +- .../rendering/renderablefieldlines.h | 5 +- .../fieldlinessequencemodule.cpp | 3 + .../renderablefieldlinessequence.cpp | 14 +- .../rendering/renderablefieldlinessequence.h | 6 +- .../tasks/kameleonvolumetofieldlinestask.cpp | 15 +- .../tasks/kameleonvolumetofieldlinestask.h | 2 +- .../util/fieldlinesstate.cpp | 8 + .../util/kameleonfieldlinehelper.cpp | 15 +- .../util/kameleonfieldlinehelper.h | 1 + .../fitsfilereader/fitsfilereadermodule.cpp | 2 + .../fitsfilereader/include/fitsfilereader.h | 2 - .../include/renderabletimevaryingfitssphere.h | 10 +- .../fitsfilereader/include/wsafitshelper.h | 11 +- modules/fitsfilereader/src/fitsfilereader.cpp | 9 +- .../src/renderabletimevaryingfitssphere.cpp | 18 +- modules/fitsfilereader/src/wsafitshelper.cpp | 11 +- modules/gaia/gaiamodule.cpp | 4 + modules/gaia/gaiamodule.h | 2 - modules/gaia/rendering/gaiaoptions.h | 20 +- modules/gaia/rendering/octreeculler.cpp | 2 +- modules/gaia/rendering/octreeculler.h | 1 - modules/gaia/rendering/octreemanager.cpp | 6 +- modules/gaia/rendering/octreemanager.h | 7 +- .../gaia/rendering/renderablegaiastars.cpp | 16 +- modules/gaia/rendering/renderablegaiastars.h | 12 +- modules/gaia/tasks/constructoctreetask.cpp | 8 +- modules/gaia/tasks/constructoctreetask.h | 3 +- modules/gaia/tasks/readfilejob.cpp | 7 +- modules/gaia/tasks/readfilejob.h | 5 +- modules/gaia/tasks/readfitstask.cpp | 12 +- modules/gaia/tasks/readfitstask.h | 6 +- modules/gaia/tasks/readspecktask.cpp | 4 +- modules/gaia/tasks/readspecktask.h | 3 - modules/galaxy/galaxymodule.cpp | 3 + modules/galaxy/rendering/galaxyraycaster.cpp | 6 +- modules/galaxy/rendering/galaxyraycaster.h | 14 +- modules/galaxy/rendering/renderablegalaxy.cpp | 12 +- modules/galaxy/rendering/renderablegalaxy.h | 6 +- .../galaxy/tasks/milkywayconversiontask.cpp | 1 + modules/galaxy/tasks/milkywayconversiontask.h | 3 - .../tasks/milkywaypointsconversiontask.cpp | 34 +- .../tasks/milkywaypointsconversiontask.h | 6 +- modules/globebrowsing/globebrowsingmodule.cpp | 27 +- modules/globebrowsing/globebrowsingmodule.h | 18 +- .../globebrowsing/globebrowsingmodule_lua.inl | 8 +- .../src/asynctiledataprovider.cpp | 13 +- .../globebrowsing/src/asynctiledataprovider.h | 3 +- modules/globebrowsing/src/basictypes.h | 4 +- .../src/dashboarditemglobelocation.cpp | 19 +- .../src/dashboarditemglobelocation.h | 4 - modules/globebrowsing/src/gdalwrapper.cpp | 6 +- modules/globebrowsing/src/gdalwrapper.h | 2 - modules/globebrowsing/src/geodeticpatch.cpp | 4 + modules/globebrowsing/src/geodeticpatch.h | 1 - .../src/geojson/geojsoncomponent.cpp | 19 +- .../src/geojson/geojsoncomponent.h | 24 +- .../src/geojson/geojsonmanager.cpp | 10 +- .../src/geojson/geojsonmanager.h | 9 +- .../src/geojson/geojsonproperties.cpp | 5 +- .../src/geojson/geojsonproperties.h | 1 - .../src/geojson/globegeometryfeature.cpp | 24 +- .../src/geojson/globegeometryfeature.h | 19 +- .../src/geojson/globegeometryhelper.cpp | 12 + .../src/geojson/globegeometryhelper.h | 6 +- .../src/globelabelscomponent.cpp | 16 +- .../globebrowsing/src/globelabelscomponent.h | 14 +- modules/globebrowsing/src/gpulayergroup.cpp | 9 +- modules/globebrowsing/src/gpulayergroup.h | 8 - modules/globebrowsing/src/layer.cpp | 17 +- modules/globebrowsing/src/layer.h | 8 +- modules/globebrowsing/src/layeradjustment.cpp | 3 +- modules/globebrowsing/src/layeradjustment.h | 2 + modules/globebrowsing/src/layergroup.cpp | 6 + modules/globebrowsing/src/layergroup.h | 4 +- modules/globebrowsing/src/layergroupid.cpp | 2 + modules/globebrowsing/src/layergroupid.h | 6 +- modules/globebrowsing/src/layermanager.cpp | 6 +- modules/globebrowsing/src/layermanager.h | 3 - .../globebrowsing/src/layerrendersettings.cpp | 4 + .../globebrowsing/src/layerrendersettings.h | 1 + modules/globebrowsing/src/lrucache.h | 1 + modules/globebrowsing/src/lruthreadpool.inl | 3 + .../src/memoryawaretilecache.cpp | 8 +- .../globebrowsing/src/memoryawaretilecache.h | 10 +- .../src/prioritizingconcurrentjobmanager.h | 2 + .../src/prioritizingconcurrentjobmanager.inl | 1 + modules/globebrowsing/src/rawtile.h | 3 - .../globebrowsing/src/rawtiledatareader.cpp | 334 +++++++------- modules/globebrowsing/src/rawtiledatareader.h | 21 +- modules/globebrowsing/src/renderableglobe.cpp | 24 +- modules/globebrowsing/src/renderableglobe.h | 17 +- modules/globebrowsing/src/ringscomponent.cpp | 17 +- modules/globebrowsing/src/ringscomponent.h | 11 +- modules/globebrowsing/src/shadowcomponent.cpp | 19 +- modules/globebrowsing/src/shadowcomponent.h | 24 +- modules/globebrowsing/src/skirtedgrid.cpp | 5 +- modules/globebrowsing/src/skirtedgrid.h | 2 - modules/globebrowsing/src/tileindex.cpp | 2 + modules/globebrowsing/src/tileindex.h | 2 +- modules/globebrowsing/src/tileloadjob.cpp | 1 + modules/globebrowsing/src/tileloadjob.h | 2 +- .../src/tileprovider/defaulttileprovider.cpp | 9 + .../src/tileprovider/defaulttileprovider.h | 8 +- .../imagesequencetileprovider.cpp | 5 + .../tileprovider/imagesequencetileprovider.h | 3 + .../tileprovider/singleimagetileprovider.cpp | 7 + .../tileprovider/singleimagetileprovider.h | 3 +- .../sizereferencetileprovider.cpp | 8 +- .../tileprovider/sizereferencetileprovider.h | 2 + .../src/tileprovider/spoutimageprovider.cpp | 9 +- .../src/tileprovider/spoutimageprovider.h | 8 +- .../src/tileprovider/temporaltileprovider.cpp | 15 +- .../src/tileprovider/temporaltileprovider.h | 15 +- .../src/tileprovider/texttileprovider.cpp | 6 + .../src/tileprovider/texttileprovider.h | 10 + .../tileprovider/tileindextileprovider.cpp | 7 + .../src/tileprovider/tileprovider.cpp | 27 -- .../src/tileprovider/tileprovider.h | 33 +- .../src/tileprovider/tileproviderbydate.cpp | 7 +- .../src/tileprovider/tileproviderbydate.h | 2 - .../src/tileprovider/tileproviderbyindex.cpp | 7 + .../src/tileprovider/tileproviderbyindex.h | 3 + .../src/tileprovider/tileproviderbylevel.cpp | 6 + .../globebrowsing/src/tiletextureinitdata.cpp | 116 ++--- .../globebrowsing/src/tiletextureinitdata.h | 1 + modules/globebrowsing/src/timequantizer.cpp | 6 +- modules/globebrowsing/src/timequantizer.h | 2 +- modules/imgui/imguimodule.cpp | 15 + modules/imgui/imguimodule.h | 3 + modules/imgui/include/guicomponent.h | 1 + modules/imgui/include/guigibscomponent.h | 2 - .../imgui/include/guiglobebrowsingcomponent.h | 2 - modules/imgui/include/guipropertycomponent.h | 3 - modules/imgui/include/guiscenecomponent.h | 2 - modules/imgui/include/guispacetimecomponent.h | 1 + modules/imgui/include/renderproperties.h | 53 +-- modules/imgui/src/guiactioncomponent.cpp | 4 + modules/imgui/src/guicomponent.cpp | 2 + modules/imgui/src/guigibscomponent.cpp | 2 + .../imgui/src/guiglobebrowsingcomponent.cpp | 11 + modules/imgui/src/guimemorycomponent.cpp | 1 + modules/imgui/src/guimissioncomponent.cpp | 2 + modules/imgui/src/guiparallelcomponent.cpp | 4 +- modules/imgui/src/guipropertycomponent.cpp | 4 + modules/imgui/src/guiscenecomponent.cpp | 4 +- modules/imgui/src/guispacetimecomponent.cpp | 11 +- modules/imgui/src/renderproperties.cpp | 101 ++-- modules/iswa/iswamodule.cpp | 2 +- modules/iswa/iswamodule.h | 8 +- modules/iswa/rendering/iswabasegroup.cpp | 4 +- modules/iswa/rendering/iswabasegroup.h | 6 +- modules/iswa/rendering/iswadatagroup.cpp | 3 +- modules/iswa/rendering/iswadatagroup.h | 2 + modules/iswa/rendering/iswakameleongroup.cpp | 16 +- modules/iswa/rendering/iswakameleongroup.h | 5 + .../iswa/rendering/renderabledatacygnet.cpp | 8 + modules/iswa/rendering/renderabledatacygnet.h | 2 +- modules/iswa/rendering/renderabledataplane.h | 5 - .../iswa/rendering/renderabledatasphere.cpp | 4 +- modules/iswa/rendering/renderabledatasphere.h | 4 - .../iswa/rendering/renderableiswacygnet.cpp | 8 +- modules/iswa/rendering/renderableiswacygnet.h | 7 +- .../rendering/renderablekameleonplane.cpp | 17 +- .../iswa/rendering/renderablekameleonplane.h | 7 +- .../rendering/renderabletexturecygnet.cpp | 5 + .../iswa/rendering/renderabletexturecygnet.h | 4 +- .../iswa/rendering/renderabletextureplane.cpp | 1 + .../iswa/rendering/renderabletextureplane.h | 2 - modules/iswa/rendering/screenspacecygnet.cpp | 4 + modules/iswa/rendering/screenspacecygnet.h | 3 - modules/iswa/util/dataprocessor.cpp | 4 +- modules/iswa/util/dataprocessor.h | 3 +- modules/iswa/util/dataprocessorjson.cpp | 36 +- modules/iswa/util/dataprocessorjson.h | 2 + modules/iswa/util/dataprocessorkameleon.cpp | 8 +- modules/iswa/util/dataprocessorkameleon.h | 1 + modules/iswa/util/dataprocessortext.cpp | 5 +- modules/iswa/util/dataprocessortext.h | 2 + modules/iswa/util/iswamanager.cpp | 16 +- modules/iswa/util/iswamanager.h | 3 +- modules/iswa/util/iswamanager_lua.inl | 7 + modules/kameleon/include/kameleonhelper.h | 4 +- modules/kameleon/include/kameleonwrapper.h | 2 +- modules/kameleon/src/kameleonhelper.cpp | 6 +- modules/kameleon/src/kameleonwrapper.cpp | 12 +- .../kameleonvolume/kameleonvolumemodule.cpp | 2 + modules/kameleonvolume/kameleonvolumemodule.h | 4 - .../kameleonvolume/kameleonvolumereader.cpp | 8 +- modules/kameleonvolume/kameleonvolumereader.h | 4 +- .../rendering/renderablekameleonvolume.cpp | 12 +- .../rendering/renderablekameleonvolume.h | 12 +- .../tasks/kameleondocumentationtask.cpp | 10 +- .../tasks/kameleondocumentationtask.h | 1 - .../tasks/kameleonmetadatatojsontask.cpp | 6 +- .../tasks/kameleonmetadatatojsontask.h | 1 - .../tasks/kameleonvolumetorawtask.cpp | 6 +- .../tasks/kameleonvolumetorawtask.h | 1 - modules/multiresvolume/CMakeLists.txt | 1 + .../multiresvolume/multiresvolumemodule.cpp | 1 + .../multiresvolume/rendering/atlasmanager.cpp | 3 + .../multiresvolume/rendering/atlasmanager.h | 3 +- .../multiresvolume/rendering/brickmanager.cpp | 17 +- .../multiresvolume/rendering/brickmanager.h | 13 +- .../multiresvolume/rendering/brickselection.h | 4 +- .../rendering/brickselector.cpp | 33 ++ .../multiresvolume/rendering/brickselector.h | 4 +- .../rendering/errorhistogrammanager.cpp | 37 +- .../rendering/errorhistogrammanager.h | 25 +- .../rendering/histogrammanager.cpp | 12 +- .../rendering/histogrammanager.h | 1 + .../rendering/localerrorhistogrammanager.cpp | 9 +- .../rendering/localerrorhistogrammanager.h | 23 +- .../rendering/localtfbrickselector.cpp | 5 +- .../rendering/localtfbrickselector.h | 9 +- .../rendering/multiresvolumeraycaster.cpp | 5 +- .../rendering/multiresvolumeraycaster.h | 15 +- .../rendering/renderablemultiresvolume.cpp | 11 +- .../rendering/renderablemultiresvolume.h | 16 +- .../rendering/shenbrickselector.h | 9 +- .../rendering/simpletfbrickselector.cpp | 5 +- .../rendering/simpletfbrickselector.h | 1 - .../rendering/tfbrickselector.cpp | 2 + .../rendering/tfbrickselector.h | 13 +- modules/multiresvolume/rendering/tsp.cpp | 5 +- modules/multiresvolume/rendering/tsp.h | 7 +- modules/opensoundcontrol/CMakeLists.txt | 4 +- .../include/opensoundcontrolconnection.h | 6 +- .../opensoundcontrolmodule.cpp | 1 - .../opensoundcontrol/opensoundcontrolmodule.h | 2 +- .../src/opensoundcontrolconnection.cpp | 2 + modules/server/include/connection.h | 1 + modules/server/include/connectionpool.h | 2 +- modules/server/include/jsonconverters.h | 3 +- .../server/include/logging/notificationlog.h | 1 + modules/server/include/serverinterface.h | 4 + modules/server/include/topics/bouncetopic.h | 2 - .../server/include/topics/camerapathtopic.h | 1 + modules/server/include/topics/cameratopic.h | 2 + .../include/topics/downloadeventtopic.h | 3 +- modules/server/include/topics/errorlogtopic.h | 8 +- modules/server/include/topics/eventtopic.h | 1 + .../include/topics/flightcontrollertopic.h | 25 +- modules/server/include/topics/missiontopic.h | 6 +- modules/server/include/topics/profiletopic.h | 2 - .../server/include/topics/skybrowsertopic.h | 1 + .../server/include/topics/subscriptiontopic.h | 4 +- modules/server/include/topics/timetopic.h | 2 + modules/server/include/topics/topic.h | 2 + modules/server/servermodule.cpp | 17 +- modules/server/servermodule.h | 13 +- modules/server/src/connection.cpp | 18 +- modules/server/src/connectionpool.cpp | 1 + modules/server/src/jsonconverters.cpp | 5 +- .../server/src/logging/notificationlog.cpp | 2 + modules/server/src/serverinterface.cpp | 2 + .../server/src/topics/actionkeybindtopic.cpp | 30 +- .../server/src/topics/authorizationtopic.cpp | 5 +- modules/server/src/topics/camerapathtopic.cpp | 13 +- modules/server/src/topics/cameratopic.cpp | 9 +- .../server/src/topics/documentationtopic.cpp | 7 - .../server/src/topics/downloadeventtopic.cpp | 12 +- modules/server/src/topics/enginemodetopic.cpp | 10 +- modules/server/src/topics/errorlogtopic.cpp | 4 + modules/server/src/topics/eventtopic.cpp | 13 +- .../src/topics/flightcontrollertopic.cpp | 8 +- modules/server/src/topics/luascripttopic.cpp | 7 +- modules/server/src/topics/missiontopic.cpp | 25 +- modules/server/src/topics/profiletopic.cpp | 9 +- .../src/topics/sessionrecordingtopic.cpp | 14 +- .../server/src/topics/setpropertytopic.cpp | 5 +- modules/server/src/topics/skybrowsertopic.cpp | 17 +- .../server/src/topics/subscriptiontopic.cpp | 47 +- modules/server/src/topics/timetopic.cpp | 15 +- modules/server/src/topics/topic.cpp | 3 +- .../src/topics/triggerpropertytopic.cpp | 9 +- modules/server/src/topics/versiontopic.cpp | 8 +- .../skybrowser/include/renderableskytarget.h | 8 +- .../include/screenspaceskybrowser.h | 10 +- .../skybrowser/include/targetbrowserpair.h | 8 +- modules/skybrowser/include/utility.h | 4 +- modules/skybrowser/include/wwtcommunicator.h | 18 +- modules/skybrowser/include/wwtdatahandler.h | 6 +- modules/skybrowser/skybrowsermodule.cpp | 20 +- modules/skybrowser/skybrowsermodule.h | 3 +- modules/skybrowser/skybrowsermodule_lua.inl | 4 - .../skybrowser/src/renderableskytarget.cpp | 14 +- .../skybrowser/src/screenspaceskybrowser.cpp | 16 +- modules/skybrowser/src/targetbrowserpair.cpp | 8 +- modules/skybrowser/src/utility.cpp | 2 + modules/skybrowser/src/wwtcommunicator.cpp | 13 +- modules/skybrowser/src/wwtdatahandler.cpp | 11 +- modules/space/horizonsfile.cpp | 17 +- modules/space/horizonsfile.h | 8 +- modules/space/kepler.h | 1 + .../renderableconstellationbounds.cpp | 11 +- .../rendering/renderableconstellationbounds.h | 7 +- .../renderableconstellationlines.cpp | 10 +- .../rendering/renderableconstellationlines.h | 13 +- .../renderableconstellationsbase.cpp | 12 +- .../rendering/renderableconstellationsbase.h | 15 +- .../space/rendering/renderableeclipsecone.cpp | 7 +- .../space/rendering/renderableeclipsecone.h | 11 +- .../space/rendering/renderablefluxnodes.cpp | 23 +- modules/space/rendering/renderablefluxnodes.h | 36 +- .../rendering/renderablehabitablezone.cpp | 7 +- .../space/rendering/renderablehabitablezone.h | 4 +- .../rendering/renderableorbitalkepler.cpp | 27 +- .../space/rendering/renderableorbitalkepler.h | 12 +- modules/space/rendering/renderablerings.cpp | 8 +- modules/space/rendering/renderablerings.h | 11 +- modules/space/rendering/renderablestars.cpp | 14 +- modules/space/rendering/renderablestars.h | 12 +- .../space/rendering/renderabletravelspeed.cpp | 5 + .../space/rendering/renderabletravelspeed.h | 6 +- modules/space/rotation/spicerotation.cpp | 3 +- modules/space/rotation/spicerotation.h | 2 - modules/space/spacemodule.cpp | 9 +- modules/space/spacemodule_lua.inl | 1 + modules/space/timeframe/timeframekernel.cpp | 11 +- modules/space/timeframe/timeframekernel.h | 1 + modules/space/translation/gptranslation.cpp | 5 +- .../space/translation/horizonstranslation.cpp | 12 +- .../space/translation/horizonstranslation.h | 12 +- .../space/translation/keplertranslation.cpp | 9 +- modules/space/translation/keplertranslation.h | 17 +- .../space/translation/spicetranslation.cpp | 6 +- .../dashboard/dashboarditeminstruments.cpp | 8 +- .../dashboard/dashboarditeminstruments.h | 2 - .../rendering/renderablecrawlingline.cpp | 5 +- .../rendering/renderablecrawlingline.h | 3 +- .../rendering/renderablefov.cpp | 52 ++- .../rendering/renderablefov.h | 10 +- .../rendering/renderablemodelprojection.cpp | 11 +- .../rendering/renderablemodelprojection.h | 14 +- .../rendering/renderableplaneprojection.cpp | 9 +- .../rendering/renderableplaneprojection.h | 7 - .../rendering/renderableplanetprojection.cpp | 9 +- .../rendering/renderableplanetprojection.h | 14 +- .../rendering/renderableshadowcylinder.cpp | 6 +- .../rendering/renderableshadowcylinder.h | 7 - .../spacecraftinstrumentsmodule.cpp | 10 + .../spacecraftinstrumentsmodule.h | 1 + .../util/hongkangparser.cpp | 8 +- .../util/hongkangparser.h | 2 + modules/spacecraftinstruments/util/image.h | 2 +- .../util/imagesequencer.cpp | 9 +- .../util/imagesequencer.h | 9 +- .../util/instrumentdecoder.cpp | 2 - .../util/instrumenttimesparser.cpp | 7 +- .../util/instrumenttimesparser.h | 2 + .../util/labelparser.cpp | 7 +- .../spacecraftinstruments/util/labelparser.h | 2 + .../util/projectioncomponent.cpp | 9 +- .../util/projectioncomponent.h | 2 + .../util/scannerdecoder.cpp | 1 + .../util/scannerdecoder.h | 2 - .../util/sequenceparser.cpp | 4 - .../util/sequenceparser.h | 1 + modules/spout/renderableplanespout.cpp | 8 +- modules/spout/renderableplanespout.h | 2 - modules/spout/renderablespherespout.cpp | 7 +- modules/spout/renderablespherespout.h | 2 - modules/spout/screenspacespout.cpp | 4 +- modules/spout/screenspacespout.h | 2 - modules/spout/spoutmodule.cpp | 7 +- modules/spout/spoutwrapper.cpp | 7 + modules/spout/spoutwrapper.h | 10 +- modules/statemachine/include/state.h | 3 +- modules/statemachine/include/statemachine.h | 4 + modules/statemachine/include/transition.h | 3 +- modules/statemachine/src/state.cpp | 2 + modules/statemachine/src/statemachine.cpp | 2 + modules/statemachine/src/transition.cpp | 2 + modules/statemachine/statemachinemodule.cpp | 12 +- .../statemachine/statemachinemodule_lua.inl | 5 + modules/sync/syncmodule.cpp | 11 +- modules/sync/syncmodule_lua.inl | 3 + modules/sync/syncs/httpsynchronization.cpp | 13 +- modules/sync/syncs/urlsynchronization.cpp | 15 +- modules/sync/syncs/urlsynchronization.h | 4 +- .../include/general/anglemodetelemetry.h | 2 + .../include/general/cameratelemetry.h | 2 + .../include/general/focustelemetry.h | 4 +- .../include/general/nodestelemetry.h | 2 + .../telemetry/include/general/timetelemetry.h | 2 + .../specific/planetscomparesonification.h | 3 + .../specific/planetsoverviewsonification.h | 4 + .../include/specific/planetssonification.h | 4 + modules/telemetry/include/telemetrybase.h | 5 +- modules/telemetry/include/util.h | 270 +++++------ .../src/general/anglemodetelemetry.cpp | 1 + .../telemetry/src/general/cameratelemetry.cpp | 4 + .../telemetry/src/general/focustelemetry.cpp | 1 + .../telemetry/src/general/nodestelemetry.cpp | 6 + .../telemetry/src/general/timetelemetry.cpp | 3 + .../specific/planetscomparesonification.cpp | 7 +- .../specific/planetsoverviewsonification.cpp | 3 + .../src/specific/planetssonification.cpp | 12 + modules/telemetry/src/telemetrybase.cpp | 5 +- modules/telemetry/src/util.cpp | 5 +- modules/telemetry/telemetrymodule.cpp | 7 +- modules/telemetry/telemetrymodule.h | 4 +- modules/touch/include/directinputsolver.h | 3 +- modules/touch/include/touchinteraction.h | 10 +- modules/touch/include/touchmarker.h | 9 +- modules/touch/include/tuioear.h | 13 +- modules/touch/include/win32_touch.h | 1 + modules/touch/src/directinputsolver.cpp | 6 + modules/touch/src/touchinteraction.cpp | 15 +- modules/touch/src/touchmarker.cpp | 1 - modules/touch/src/tuioear.cpp | 9 +- modules/touch/src/win32_touch.cpp | 15 +- modules/touch/touchmodule.cpp | 10 + modules/touch/touchmodule.h | 3 +- .../rendering/renderabletoyvolume.cpp | 13 +- .../toyvolume/rendering/renderabletoyvolume.h | 8 +- .../rendering/toyvolumeraycaster.cpp | 7 +- .../toyvolume/rendering/toyvolumeraycaster.h | 10 +- modules/toyvolume/toyvolumemodule.cpp | 9 + modules/toyvolume/toyvolumemodule.h | 2 + modules/video/include/renderablevideoplane.h | 3 +- modules/video/include/renderablevideosphere.h | 2 - modules/video/include/screenspacevideo.h | 5 - modules/video/include/videoplayer.h | 14 +- modules/video/include/videotileprovider.h | 15 +- modules/video/src/renderablevideoplane.cpp | 5 +- modules/video/src/renderablevideosphere.cpp | 4 +- modules/video/src/screenspacevideo.cpp | 8 +- modules/video/src/videoplayer.cpp | 14 +- modules/video/src/videotileprovider.cpp | 17 +- modules/video/videomodule.cpp | 6 +- modules/video/videomodule.h | 2 - modules/volume/envelope.cpp | 13 +- modules/volume/envelope.h | 3 + modules/volume/linearlrucache.h | 4 +- modules/volume/linearlrucache.inl | 2 +- modules/volume/lrucache.h | 4 +- modules/volume/rawvolume.inl | 1 + modules/volume/rawvolumemetadata.cpp | 2 +- modules/volume/rawvolumemetadata.h | 3 +- modules/volume/rawvolumereader.h | 2 +- modules/volume/rawvolumewriter.h | 5 +- modules/volume/rawvolumewriter.inl | 8 +- .../volume/rendering/basicvolumeraycaster.cpp | 8 +- .../volume/rendering/basicvolumeraycaster.h | 15 +- .../rendering/renderabletimevaryingvolume.cpp | 14 +- .../rendering/renderabletimevaryingvolume.h | 7 +- modules/volume/rendering/volumeclipplane.cpp | 1 + modules/volume/rendering/volumeclipplane.h | 1 + modules/volume/rendering/volumeclipplanes.cpp | 1 + modules/volume/rendering/volumeclipplanes.h | 4 +- .../tasks/generaterawvolumefromfiletask.cpp | 11 +- .../tasks/generaterawvolumefromfiletask.h | 1 - .../volume/tasks/generaterawvolumetask.cpp | 12 +- modules/volume/tasks/generaterawvolumetask.h | 1 - modules/volume/textureslicevolumereader.h | 1 + modules/volume/textureslicevolumereader.inl | 2 + modules/volume/transferfunction.cpp | 24 +- modules/volume/transferfunction.h | 11 +- modules/volume/transferfunctionhandler.cpp | 2 +- modules/volume/transferfunctionhandler.h | 7 +- modules/volume/transferfunctionproperty.cpp | 4 +- modules/volume/volumegridtype.cpp | 5 +- modules/volume/volumegridtype.h | 3 +- modules/volume/volumemodule.cpp | 3 +- modules/webbrowser/include/browserclient.h | 2 +- modules/webbrowser/include/browserinstance.h | 8 +- modules/webbrowser/include/cefhost.h | 14 - .../include/defaultbrowserlauncher.h | 18 +- .../webbrowser/include/screenspacebrowser.h | 4 +- .../webbrowser/include/webkeyboardhandler.h | 1 - modules/webbrowser/include/webrenderhandler.h | 14 +- modules/webbrowser/src/browserinstance.cpp | 4 +- modules/webbrowser/src/cefhost.cpp | 22 +- modules/webbrowser/src/eventhandler.cpp | 11 + modules/webbrowser/src/screenspacebrowser.cpp | 6 +- modules/webbrowser/src/webrenderhandler.cpp | 5 +- modules/webbrowser/webbrowsermodule.cpp | 10 +- modules/webbrowser/webbrowsermodule.h | 15 +- modules/webgui/webguimodule.cpp | 4 +- modules/webgui/webguimodule.h | 3 + src/CMakeLists.txt | 3 + src/camera/camera.cpp | 3 + src/data/csvloader.cpp | 8 +- src/data/dataloader.cpp | 13 + src/data/datamapping.cpp | 9 +- src/data/speckloader.cpp | 10 + src/documentation/core_registration.cpp | 2 + src/documentation/documentation.cpp | 4 + src/documentation/documentationengine.cpp | 19 + src/documentation/verifier.cpp | 20 +- src/engine/configuration.cpp | 9 +- src/engine/downloadmanager.cpp | 7 + src/engine/globals.cpp | 3 +- src/engine/globalscallbacks.cpp | 1 + src/engine/logfactory.cpp | 4 + src/engine/moduleengine.cpp | 9 +- src/engine/openspaceengine.cpp | 33 +- src/engine/openspaceengine_lua.inl | 11 +- src/engine/settings.cpp | 2 + src/engine/syncengine.cpp | 1 + src/events/event.cpp | 8 +- src/events/eventengine.cpp | 7 + src/events/eventengine_lua.inl | 6 +- src/interaction/actionmanager.cpp | 9 +- src/interaction/actionmanager_lua.inl | 4 +- src/interaction/joystickcamerastates.cpp | 3 +- src/interaction/keybindingmanager.cpp | 3 + src/interaction/keybindingmanager_lua.inl | 7 + src/interaction/keyframerecordinghandler.cpp | 16 + .../keyframerecordinghandler_lua.inl | 2 +- src/interaction/mousecamerastates.cpp | 4 + src/interaction/sessionrecording.cpp | 17 +- src/interaction/sessionrecordinghandler.cpp | 25 + .../sessionrecordinghandler_lua.inl | 6 + .../tasks/convertrecformattask.cpp | 13 +- src/interaction/websocketcamerastates.cpp | 1 + src/mission/mission.cpp | 11 +- src/mission/missionmanager.cpp | 5 + src/mission/missionmanager_lua.inl | 4 +- src/navigation/keyframenavigator.cpp | 4 + src/navigation/navigationhandler.cpp | 19 +- src/navigation/navigationhandler_lua.inl | 25 +- src/navigation/navigationstate.cpp | 8 +- src/navigation/orbitalnavigator.cpp | 16 +- src/navigation/orbitalnavigator_lua.inl | 3 + src/navigation/path.cpp | 18 +- src/navigation/pathcurve.cpp | 7 + .../pathcurves/avoidcollisioncurve.cpp | 7 +- .../pathcurves/zoomoutoverviewcurve.cpp | 3 +- src/navigation/pathnavigator.cpp | 8 +- src/navigation/pathnavigator_lua.inl | 2 +- src/navigation/waypoint.cpp | 114 ++--- src/network/messagestructures.cpp | 431 +++++++++++++++++ src/network/messagestructureshelper.cpp | 2 + src/network/parallelconnection.cpp | 2 + src/network/parallelpeer.cpp | 13 +- src/network/parallelpeer_lua.inl | 2 +- src/properties/matrix/dmat2property.cpp | 1 - src/properties/matrix/dmat3property.cpp | 1 - src/properties/matrix/dmat4property.cpp | 1 - src/properties/matrix/mat2property.cpp | 1 - src/properties/matrix/mat3property.cpp | 1 - src/properties/matrix/mat4property.cpp | 1 - src/properties/misc/optionproperty.cpp | 1 - src/properties/misc/selectionproperty.cpp | 2 +- src/properties/property.cpp | 4 +- src/properties/propertyowner.cpp | 6 +- src/properties/scalar/doubleproperty.cpp | 1 - src/properties/scalar/floatproperty.cpp | 1 - src/properties/scalar/intproperty.cpp | 1 - src/properties/scalar/longproperty.cpp | 1 - src/properties/scalar/shortproperty.cpp | 1 - src/properties/scalar/uintproperty.cpp | 1 - src/properties/scalar/ulongproperty.cpp | 1 - src/properties/scalar/ushortproperty.cpp | 1 - src/properties/vector/dvec2property.cpp | 1 - src/properties/vector/dvec3property.cpp | 1 - src/properties/vector/dvec4property.cpp | 1 - src/properties/vector/ivec2property.cpp | 1 - src/properties/vector/ivec3property.cpp | 1 - src/properties/vector/ivec4property.cpp | 1 - src/properties/vector/uvec2property.cpp | 1 - src/properties/vector/uvec3property.cpp | 1 - src/properties/vector/uvec4property.cpp | 1 - src/properties/vector/vec2property.cpp | 1 - src/properties/vector/vec3property.cpp | 1 - src/properties/vector/vec4property.cpp | 1 - src/query/query.cpp | 3 + src/rendering/colormappingcomponent.cpp | 5 + src/rendering/dashboard.cpp | 3 +- src/rendering/dashboard_lua.inl | 5 + src/rendering/dashboarditem.cpp | 4 + src/rendering/dashboardtextitem.cpp | 2 + src/rendering/deferredcaster.cpp | 37 ++ src/rendering/framebufferrenderer.cpp | 12 +- src/rendering/helper.cpp | 18 +- src/rendering/labelscomponent.cpp | 2 + src/rendering/loadingscreen.cpp | 6 +- src/rendering/luaconsole.cpp | 9 +- src/rendering/renderable.cpp | 11 +- src/rendering/renderengine.cpp | 18 +- src/rendering/renderengine_lua.inl | 3 + src/rendering/screenspacerenderable.cpp | 8 +- .../screenspacerenderableframebuffer.cpp | 4 + src/rendering/screenspacerenderabletext.cpp | 3 +- src/rendering/texturecomponent.cpp | 3 + src/rendering/transferfunction.cpp | 5 + src/scene/asset.cpp | 9 +- src/scene/assetmanager.cpp | 8 + src/scene/assetmanager_lua.inl | 1 + src/scene/lightsource.cpp | 5 +- src/scene/profile.cpp | 68 +-- src/scene/profile_lua.inl | 2 + src/scene/rotation.cpp | 3 +- src/scene/scale.cpp | 3 +- src/scene/scene.cpp | 22 +- src/scene/scene_lua.inl | 11 +- src/scene/scenegraphnode.cpp | 14 +- src/scene/sceneinitializer.cpp | 5 + src/scene/timeframe.cpp | 3 +- src/scene/translation.cpp | 8 +- src/scripting/lualibrary.cpp | 3 + src/scripting/scriptengine.cpp | 8 +- src/scripting/scriptengine_lua.inl | 4 + src/scripting/scriptscheduler.cpp | 7 +- .../systemcapabilitiesbinding_lua.inl | 5 + src/util/blockplaneintersectiongeometry.cpp | 4 +- src/util/boxgeometry.cpp | 3 +- src/util/collisionhelper.cpp | 3 + src/util/coordinateconversion.cpp | 4 + src/util/distanceconversion.cpp | 3 +- src/util/downloadeventengine.cpp | 2 + src/util/dynamicfilesequencedownloader.cpp | 16 +- src/util/ellipsoid.cpp | 4 +- src/util/factorymanager.cpp | 4 +- src/util/geodetic.cpp | 3 + src/util/histogram.cpp | 5 +- src/util/httprequest.cpp | 7 +- src/util/json_helper.cpp | 5 + src/util/openspacemodule.cpp | 2 + src/util/planegeometry.cpp | 4 +- src/util/progressbar.cpp | 1 + src/util/resourcesynchronization.cpp | 4 +- src/util/sphere.cpp | 5 +- src/util/spicemanager.cpp | 43 +- src/util/spicemanager_lua.inl | 7 + src/util/syncable.cpp | 33 ++ src/util/syncbuffer.cpp | 8 +- src/util/task.cpp | 2 +- src/util/taskloader.cpp | 4 + src/util/threadpool.cpp | 42 +- src/util/time.cpp | 6 +- src/util/time_lua.inl | 10 + src/util/timeconversion.cpp | 5 +- src/util/timemanager.cpp | 13 + src/util/timerange.cpp | 2 +- src/util/touch.cpp | 1 + src/util/transformationmanager.cpp | 20 +- src/util/tstring.cpp | 1 + src/util/universalhelpers.cpp | 3 + src/util/versionchecker.cpp | 110 +++-- support/coding/codegen | 2 +- 1009 files changed, 5216 insertions(+), 3589 deletions(-) create mode 100644 modules/multiresvolume/rendering/brickselector.cpp create mode 100644 src/network/messagestructures.cpp create mode 100644 src/rendering/deferredcaster.cpp create mode 100644 src/util/syncable.cpp diff --git a/apps/OpenSpace/ext/launcher/include/backgroundimage.h b/apps/OpenSpace/ext/launcher/include/backgroundimage.h index dbfb3ee26c..062c8cefac 100644 --- a/apps/OpenSpace/ext/launcher/include/backgroundimage.h +++ b/apps/OpenSpace/ext/launcher/include/backgroundimage.h @@ -27,8 +27,11 @@ #include +#include #include +class QWidget; + class BackgroundImage final : public QLabel { Q_OBJECT public: diff --git a/apps/OpenSpace/ext/launcher/include/filesystemaccess.h b/apps/OpenSpace/ext/launcher/include/filesystemaccess.h index 0817c93efc..f49927c0de 100644 --- a/apps/OpenSpace/ext/launcher/include/filesystemaccess.h +++ b/apps/OpenSpace/ext/launcher/include/filesystemaccess.h @@ -25,8 +25,14 @@ #ifndef __OPENSPACE_UI_LAUNCHER___FILESYSTEMACCESS___H__ #define __OPENSPACE_UI_LAUNCHER___FILESYSTEMACCESS___H__ +#include #include +#include +#include + +class QFileInfo; + class FileSystemAccess { public: /** diff --git a/apps/OpenSpace/ext/launcher/include/launcherwindow.h b/apps/OpenSpace/ext/launcher/include/launcherwindow.h index c8b63783de..5a49a24ba1 100644 --- a/apps/OpenSpace/ext/launcher/include/launcherwindow.h +++ b/apps/OpenSpace/ext/launcher/include/launcherwindow.h @@ -27,14 +27,13 @@ #include -#include "sgctedit/sgctedit.h" #include -#include -#include -#include #include #include +#include +class QKeyEvent; +class QPushButton; class SplitComboBox; namespace openspace { struct Configuration; } diff --git a/apps/OpenSpace/ext/launcher/include/notificationwindow.h b/apps/OpenSpace/ext/launcher/include/notificationwindow.h index fd7007c88f..9ff164d812 100644 --- a/apps/OpenSpace/ext/launcher/include/notificationwindow.h +++ b/apps/OpenSpace/ext/launcher/include/notificationwindow.h @@ -30,6 +30,8 @@ #include #include +class QWidget; + class NotificationWindow final : public QTextEdit { Q_OBJECT public: diff --git a/apps/OpenSpace/ext/launcher/include/profile/actiondialog.h b/apps/OpenSpace/ext/launcher/include/profile/actiondialog.h index 7ccb610590..b4039f1715 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/actiondialog.h +++ b/apps/OpenSpace/ext/launcher/include/profile/actiondialog.h @@ -28,6 +28,8 @@ #include #include +#include +#include class QCheckBox; class QComboBox; @@ -39,6 +41,7 @@ class QLineEdit; class QListWidget; class QPushButton; class QTextEdit; +class QWidget; class ActionDialog final : public QDialog { Q_OBJECT @@ -50,7 +53,6 @@ private: void createWidgets(); void createActionWidgets(QGridLayout* layout); void createKeyboardWidgets(QGridLayout* layout); - void applyChanges(); openspace::Profile::Action* selectedAction(); void actionAdd(); diff --git a/apps/OpenSpace/ext/launcher/include/profile/additionalscriptsdialog.h b/apps/OpenSpace/ext/launcher/include/profile/additionalscriptsdialog.h index 031e364f3e..c7c6180beb 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/additionalscriptsdialog.h +++ b/apps/OpenSpace/ext/launcher/include/profile/additionalscriptsdialog.h @@ -27,7 +27,12 @@ #include +#include +#include + +class QPushButton; class QTextEdit; +class QWidget; class AdditionalScriptsDialog final : public QDialog { Q_OBJECT diff --git a/apps/OpenSpace/ext/launcher/include/profile/assetedit.h b/apps/OpenSpace/ext/launcher/include/profile/assetedit.h index a41b019d48..2afae40b94 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/assetedit.h +++ b/apps/OpenSpace/ext/launcher/include/profile/assetedit.h @@ -27,11 +27,7 @@ #include -namespace openspace { class Asset; } - class QBoxLayout; -class QComboBox; -class QLabel; class QLineEdit; class QWidget; diff --git a/apps/OpenSpace/ext/launcher/include/profile/assetsdialog.h b/apps/OpenSpace/ext/launcher/include/profile/assetsdialog.h index 4b4cf20f48..937ac49a4b 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/assetsdialog.h +++ b/apps/OpenSpace/ext/launcher/include/profile/assetsdialog.h @@ -26,12 +26,21 @@ #define __OPENSPACE_UI_LAUNCHER___ASSETSDIALOG___H__ #include -#include #include -#include "assettreemodel.h" +#include "assettreemodel.h" +#include + +class QObject; +class QString; +class QLineEdit; +class QModelIndex; +class QRegularExpression; class QTextEdit; class QTreeView; +class QWidget; + +namespace openspace { class Profile; } class SearchProxyModel : public QSortFilterProxyModel { Q_OBJECT @@ -81,7 +90,6 @@ private slots: void searchTextChanged(const QString& text); private: - void createWidgets(); void setViewToBaseModel(); void parseSelections(); void selected(const QModelIndex&); diff --git a/apps/OpenSpace/ext/launcher/include/profile/assettreeitem.h b/apps/OpenSpace/ext/launcher/include/profile/assettreeitem.h index a4100b9e3b..cd233d8b79 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/assettreeitem.h +++ b/apps/OpenSpace/ext/launcher/include/profile/assettreeitem.h @@ -25,6 +25,7 @@ #ifndef __OPENSPACE_UI_LAUNCHER___ASSETTREEITEM___H__ #define __OPENSPACE_UI_LAUNCHER___ASSETTREEITEM___H__ +#include #include #include diff --git a/apps/OpenSpace/ext/launcher/include/profile/assettreemodel.h b/apps/OpenSpace/ext/launcher/include/profile/assettreemodel.h index 7409a34a31..69327691b1 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/assettreemodel.h +++ b/apps/OpenSpace/ext/launcher/include/profile/assettreemodel.h @@ -29,7 +29,13 @@ #include "assettreeitem.h" #include "openspace/scene/profile.h" +#include +#include #include +#include +#include + +class QObject; class AssetTreeModel final : public QAbstractItemModel { Q_OBJECT diff --git a/apps/OpenSpace/ext/launcher/include/profile/cameradialog.h b/apps/OpenSpace/ext/launcher/include/profile/cameradialog.h index ae86162acb..1ddbde1bba 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/cameradialog.h +++ b/apps/OpenSpace/ext/launcher/include/profile/cameradialog.h @@ -33,7 +33,9 @@ class QLabel; class QLineEdit; class QMessageBox; +class QString; class QTabWidget; +class QWidget; class CameraDialog final : public QDialog { Q_OBJECT diff --git a/apps/OpenSpace/ext/launcher/include/profile/deltatimesdialog.h b/apps/OpenSpace/ext/launcher/include/profile/deltatimesdialog.h index b27201888d..7858e5b17a 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/deltatimesdialog.h +++ b/apps/OpenSpace/ext/launcher/include/profile/deltatimesdialog.h @@ -27,12 +27,18 @@ #include +#include +#include +#include + class QComboBox; class QDialogButtonBox; +class QKeyEvent; class QLabel; class QListWidget; class QLineEdit; class QPushButton; +class QWidget; class DeltaTimesDialog final : public QDialog { Q_OBJECT diff --git a/apps/OpenSpace/ext/launcher/include/profile/horizonsdialog.h b/apps/OpenSpace/ext/launcher/include/profile/horizonsdialog.h index f1cee0e0ea..7f5f58767b 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/horizonsdialog.h +++ b/apps/OpenSpace/ext/launcher/include/profile/horizonsdialog.h @@ -30,6 +30,7 @@ #include #include #include +#include #ifdef OPENSPACE_MODULE_SPACE_ENABLED #include @@ -43,6 +44,9 @@ class QNetworkAccessManager; class QNetworkReply; class QPlainTextEdit; class QProgressBar; +class QPushButton; +class QVariant; +class QWidget; class HorizonsDialog final : public QDialog { Q_OBJECT diff --git a/apps/OpenSpace/ext/launcher/include/profile/marknodesdialog.h b/apps/OpenSpace/ext/launcher/include/profile/marknodesdialog.h index 3ddf7aceac..955a2821a3 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/marknodesdialog.h +++ b/apps/OpenSpace/ext/launcher/include/profile/marknodesdialog.h @@ -27,10 +27,15 @@ #include +#include +#include + +class QKeyEvent; class QLineEdit; class QListWidget; class QListWidgetItem; class QPushButton; +class QWidget; class MarkNodesDialog final : public QDialog { Q_OBJECT diff --git a/apps/OpenSpace/ext/launcher/include/profile/metadialog.h b/apps/OpenSpace/ext/launcher/include/profile/metadialog.h index 25268a5c8e..132f0e1a4b 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/metadialog.h +++ b/apps/OpenSpace/ext/launcher/include/profile/metadialog.h @@ -32,6 +32,7 @@ class QLineEdit; class QTextEdit; +class QWidget; class MetaDialog final : public QDialog { Q_OBJECT @@ -47,7 +48,6 @@ public: private: void createWidgets(); - void save(); std::optional* _meta = nullptr; diff --git a/apps/OpenSpace/ext/launcher/include/profile/modulesdialog.h b/apps/OpenSpace/ext/launcher/include/profile/modulesdialog.h index 96a961023b..39670c2b62 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/modulesdialog.h +++ b/apps/OpenSpace/ext/launcher/include/profile/modulesdialog.h @@ -28,12 +28,15 @@ #include #include +#include class QDialogButtonBox; +class QKeyEvent; class QLabel; class QLineEdit; class QListWidget; class QPushButton; +class QWidget; class ModulesDialog final : public QDialog { Q_OBJECT diff --git a/apps/OpenSpace/ext/launcher/include/profile/profileedit.h b/apps/OpenSpace/ext/launcher/include/profile/profileedit.h index 59dfa6ae69..c54f85f63b 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/profileedit.h +++ b/apps/OpenSpace/ext/launcher/include/profile/profileedit.h @@ -26,15 +26,17 @@ #define __OPENSPACE_UI_LAUNCHER___PROFILEEDIT___H__ #include + +#include #include -#include namespace openspace { class Profile; } -class QWidget; +class QKeyEvent; class QLabel; class QLineEdit; class QTextEdit; +class QWidget; class ProfileEdit final : public QDialog { Q_OBJECT diff --git a/apps/OpenSpace/ext/launcher/include/profile/propertiesdialog.h b/apps/OpenSpace/ext/launcher/include/profile/propertiesdialog.h index 99f6cac5b1..2a1b1a484e 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/propertiesdialog.h +++ b/apps/OpenSpace/ext/launcher/include/profile/propertiesdialog.h @@ -28,14 +28,17 @@ #include #include +#include class QComboBox; class QDialogButtonBox; +class QKeyEvent; class QLabel; class QLineEdit; class QListWidget; class QMessageBox; class QPushButton; +class QWidget; class PropertiesDialog final : public QDialog { Q_OBJECT diff --git a/apps/OpenSpace/ext/launcher/include/profile/scriptlogdialog.h b/apps/OpenSpace/ext/launcher/include/profile/scriptlogdialog.h index 582741433d..a34b1f4d7c 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/scriptlogdialog.h +++ b/apps/OpenSpace/ext/launcher/include/profile/scriptlogdialog.h @@ -27,9 +27,13 @@ #include +#include +#include + class QLineEdit; class QListWidget; class QPushButton; +class QWidget; class ScriptLogDialog final : public QDialog { Q_OBJECT diff --git a/apps/OpenSpace/ext/launcher/include/profile/timedialog.h b/apps/OpenSpace/ext/launcher/include/profile/timedialog.h index cb08267e1b..49717b80f4 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/timedialog.h +++ b/apps/OpenSpace/ext/launcher/include/profile/timedialog.h @@ -28,12 +28,14 @@ #include #include +#include class QCheckBox; class QDateTimeEdit; class QLabel; class QLineEdit; class QTabWidget; +class QWidget; class TimeDialog final : public QDialog { Q_OBJECT diff --git a/apps/OpenSpace/ext/launcher/include/profile/uipanelsdialog.h b/apps/OpenSpace/ext/launcher/include/profile/uipanelsdialog.h index d6ea979a74..eae8b1a0b2 100644 --- a/apps/OpenSpace/ext/launcher/include/profile/uipanelsdialog.h +++ b/apps/OpenSpace/ext/launcher/include/profile/uipanelsdialog.h @@ -27,7 +27,11 @@ #include +#include +#include + class QCheckBox; +class QWidget; class UiPanelsDialog final : public QDialog { Q_OBJECT diff --git a/apps/OpenSpace/ext/launcher/include/settingsdialog.h b/apps/OpenSpace/ext/launcher/include/settingsdialog.h index 8180b5d2d9..731fe9f623 100644 --- a/apps/OpenSpace/ext/launcher/include/settingsdialog.h +++ b/apps/OpenSpace/ext/launcher/include/settingsdialog.h @@ -34,6 +34,7 @@ class QComboBox; class QDialogButtonBox; class QLabel; class QLineEdit; +class QWidget; class SettingsDialog : public QDialog { Q_OBJECT diff --git a/apps/OpenSpace/ext/launcher/include/sgctedit/displaywindowunion.h b/apps/OpenSpace/ext/launcher/include/sgctedit/displaywindowunion.h index 53d3f9f54a..e0341f7652 100644 --- a/apps/OpenSpace/ext/launcher/include/sgctedit/displaywindowunion.h +++ b/apps/OpenSpace/ext/launcher/include/sgctedit/displaywindowunion.h @@ -32,6 +32,8 @@ class QFrame; class QPushButton; +class QRect; +class QRectF; class QVBoxLayout; class WindowControl; diff --git a/apps/OpenSpace/ext/launcher/include/sgctedit/monitorbox.h b/apps/OpenSpace/ext/launcher/include/sgctedit/monitorbox.h index 5347e9c88e..b008d022fb 100644 --- a/apps/OpenSpace/ext/launcher/include/sgctedit/monitorbox.h +++ b/apps/OpenSpace/ext/launcher/include/sgctedit/monitorbox.h @@ -27,10 +27,12 @@ #include -#include -#include #include +class QPaintEvent; +class QRect; +class QRectF; + class MonitorBox final : public QWidget { Q_OBJECT public: diff --git a/apps/OpenSpace/ext/launcher/include/sgctedit/sgctedit.h b/apps/OpenSpace/ext/launcher/include/sgctedit/sgctedit.h index 6bb4201c41..82e41a0d6d 100644 --- a/apps/OpenSpace/ext/launcher/include/sgctedit/sgctedit.h +++ b/apps/OpenSpace/ext/launcher/include/sgctedit/sgctedit.h @@ -35,6 +35,7 @@ class DisplayWindowUnion; class QCheckBox; class QComboBox; class QLineEdit; +class QWidget; const sgct::config::GeneratorVersion VersionMin { "SgctWindowConfig", 1, 1 }; const sgct::config::GeneratorVersion VersionLegacy18 { "OpenSpace", 0, 18 }; diff --git a/apps/OpenSpace/ext/launcher/include/sgctedit/windowcontrol.h b/apps/OpenSpace/ext/launcher/include/sgctedit/windowcontrol.h index fccf2d45cc..0faf72d7e2 100644 --- a/apps/OpenSpace/ext/launcher/include/sgctedit/windowcontrol.h +++ b/apps/OpenSpace/ext/launcher/include/sgctedit/windowcontrol.h @@ -29,13 +29,18 @@ #include #include +#include #include class QCheckBox; class QComboBox; class QDoubleSpinBox; +class QFrame; class QLabel; class QLineEdit; +class QPushButton; +class QRect; +class QRectF; class QSpinBox; class WindowControl final : public QWidget { diff --git a/apps/OpenSpace/ext/launcher/include/splitcombobox.h b/apps/OpenSpace/ext/launcher/include/splitcombobox.h index e1420356c6..0f2b8202ff 100644 --- a/apps/OpenSpace/ext/launcher/include/splitcombobox.h +++ b/apps/OpenSpace/ext/launcher/include/splitcombobox.h @@ -28,9 +28,12 @@ #include #include +#include #include #include -#include +#include + +class QWidget; class SplitComboBox final : public QComboBox { Q_OBJECT diff --git a/apps/OpenSpace/ext/launcher/src/backgroundimage.cpp b/apps/OpenSpace/ext/launcher/src/backgroundimage.cpp index 91868b8fbe..670bbe6d41 100644 --- a/apps/OpenSpace/ext/launcher/src/backgroundimage.cpp +++ b/apps/OpenSpace/ext/launcher/src/backgroundimage.cpp @@ -25,8 +25,13 @@ #include "backgroundimage.h" #include +#include #include +#include #include +#include +#include +#include BackgroundImage::BackgroundImage(QRect size, const std::filesystem::path& syncFolder, QWidget* parent) diff --git a/apps/OpenSpace/ext/launcher/src/filesystemaccess.cpp b/apps/OpenSpace/ext/launcher/src/filesystemaccess.cpp index 858570061e..1caf5d46ec 100644 --- a/apps/OpenSpace/ext/launcher/src/filesystemaccess.cpp +++ b/apps/OpenSpace/ext/launcher/src/filesystemaccess.cpp @@ -24,6 +24,9 @@ #include "filesystemaccess.h" +#include +#include + FileSystemAccess::FileSystemAccess(std::string fileExtension, bool hideFileExtensions, bool useCheckboxes) : _fileExtension(std::move(fileExtension)) diff --git a/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp b/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp index b6ca263267..7e7cc0a79d 100644 --- a/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp +++ b/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp @@ -25,21 +25,29 @@ #include "launcherwindow.h" #include "profile/profileedit.h" +#include "sgctedit/sgctedit.h" #include "backgroundimage.h" #include "notificationwindow.h" #include "settingsdialog.h" #include "splitcombobox.h" +#include +#include #include +#include #include +#include #include +#include #include #include #include #include #include #include -#include #include +#include +#include +#include using namespace openspace; diff --git a/apps/OpenSpace/ext/launcher/src/notificationwindow.cpp b/apps/OpenSpace/ext/launcher/src/notificationwindow.cpp index a50dd9ffd9..648b27d926 100644 --- a/apps/OpenSpace/ext/launcher/src/notificationwindow.cpp +++ b/apps/OpenSpace/ext/launcher/src/notificationwindow.cpp @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include #include #include @@ -34,6 +36,11 @@ #include #include #include +#include +#include +#include +#include +#include #include using namespace openspace; diff --git a/apps/OpenSpace/ext/launcher/src/profile/actiondialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/actiondialog.cpp index c4174d2794..9665179a5b 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/actiondialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/actiondialog.cpp @@ -27,7 +27,9 @@ #include "profile/line.h" #include "profile/scriptlogdialog.h" #include +#include #include +#include #include #include #include diff --git a/apps/OpenSpace/ext/launcher/src/profile/additionalscriptsdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/additionalscriptsdialog.cpp index 8cfcb05c9a..f17cbb483c 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/additionalscriptsdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/additionalscriptsdialog.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include diff --git a/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp index b11ca492fc..415a7eac72 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/assetsdialog.cpp @@ -25,8 +25,10 @@ #include "profile/assetsdialog.h" #include "profile/assetedit.h" +#include #include "profile/line.h" #include +#include #include #include #include @@ -34,7 +36,8 @@ #include #include #include -#include +#include +#include namespace { bool traverseToExpandSelectedItems(QTreeView& tree, AssetTreeModel& model, int rows, diff --git a/apps/OpenSpace/ext/launcher/src/profile/assettreeitem.cpp b/apps/OpenSpace/ext/launcher/src/profile/assettreeitem.cpp index 1e4ec6e347..0c0f5d326d 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/assettreeitem.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/assettreeitem.cpp @@ -24,6 +24,10 @@ #include "profile/assettreeitem.h" +#include +#include +#include + AssetTreeItem::AssetTreeItem(std::vector data, AssetTreeItem* parentItem) : _itemData(std::move(data)) , _parentItem(parentItem) diff --git a/apps/OpenSpace/ext/launcher/src/profile/assettreemodel.cpp b/apps/OpenSpace/ext/launcher/src/profile/assettreemodel.cpp index 9eab2845e0..4d38c1be55 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/assettreemodel.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/assettreemodel.cpp @@ -28,6 +28,8 @@ #include "filesystemaccess.h" #include #include +#include +#include namespace { constexpr std::string_view Header1 = "Asset"; diff --git a/apps/OpenSpace/ext/launcher/src/profile/cameradialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/cameradialog.cpp index 1b6930c151..1dd1824a1b 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/cameradialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/cameradialog.cpp @@ -33,6 +33,11 @@ #include #include #include +#include +#include +#include +#include +#include namespace { constexpr int CameraTypeNode = 0; diff --git a/apps/OpenSpace/ext/launcher/src/profile/deltatimesdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/deltatimesdialog.cpp index b901ed4032..f7b69df523 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/deltatimesdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/deltatimesdialog.cpp @@ -37,7 +37,6 @@ #include #include #include -#include #include #include #include diff --git a/apps/OpenSpace/ext/launcher/src/profile/horizonsdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/horizonsdialog.cpp index 0d2d7bcf24..60a96d2f03 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/horizonsdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/horizonsdialog.cpp @@ -25,7 +25,9 @@ #include "profile/horizonsdialog.h" #include "profile/line.h" +#include #include +#include #include #include #include @@ -41,9 +43,12 @@ #include #include #include -#include +#include #include +#include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "HorizonsDialog"; diff --git a/apps/OpenSpace/ext/launcher/src/profile/metadialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/metadialog.cpp index c1d60ca3e8..bdf1bc78ea 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/metadialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/metadialog.cpp @@ -31,6 +31,7 @@ #include #include #include +#include MetaDialog::MetaDialog(QWidget* parent, std::optional* meta) : QDialog(parent) diff --git a/apps/OpenSpace/ext/launcher/src/profile/modulesdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/modulesdialog.cpp index 1b7588b5e3..c37d3991ac 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/modulesdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/modulesdialog.cpp @@ -32,6 +32,8 @@ #include #include #include +#include +#include using namespace openspace; diff --git a/apps/OpenSpace/ext/launcher/src/profile/profileedit.cpp b/apps/OpenSpace/ext/launcher/src/profile/profileedit.cpp index ce3ec6f5d4..185e717f4e 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/profileedit.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/profileedit.cpp @@ -37,6 +37,9 @@ #include "profile/timedialog.h" #include "profile/uipanelsdialog.h" #include +#include +#include +#include #include #include #include @@ -47,9 +50,10 @@ #include #include #include -#include #include #include +#include +#include #ifdef WIN32 #include diff --git a/apps/OpenSpace/ext/launcher/src/profile/propertiesdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/propertiesdialog.cpp index 4602f71e38..8b4061bfbd 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/propertiesdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/propertiesdialog.cpp @@ -34,6 +34,9 @@ #include #include #include +#include +#include +#include using namespace openspace; diff --git a/apps/OpenSpace/ext/launcher/src/profile/scriptlogdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/scriptlogdialog.cpp index 26865d06ac..6e88076d55 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/scriptlogdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/scriptlogdialog.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -38,11 +39,8 @@ #include #include #include -#include #include -#include #include -#include ScriptLogDialog::ScriptLogDialog(QWidget* parent, std::string filter) : QDialog(parent) diff --git a/apps/OpenSpace/ext/launcher/src/profile/uipanelsdialog.cpp b/apps/OpenSpace/ext/launcher/src/profile/uipanelsdialog.cpp index 38d3f38e04..eed363fc5c 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/uipanelsdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/uipanelsdialog.cpp @@ -31,8 +31,11 @@ #include #include #include +#include #include +#include #include +#include namespace { constexpr std::string_view DefaultPanelPath = "${DATA}/web/default_ui_panels.json"; diff --git a/apps/OpenSpace/ext/launcher/src/settingsdialog.cpp b/apps/OpenSpace/ext/launcher/src/settingsdialog.cpp index 11508a9004..dec8791b3c 100644 --- a/apps/OpenSpace/ext/launcher/src/settingsdialog.cpp +++ b/apps/OpenSpace/ext/launcher/src/settingsdialog.cpp @@ -25,12 +25,18 @@ #include "settingsdialog.h" #include "profile/line.h" +#include +#include +#include #include #include #include #include #include #include +#include +#include +#include SettingsDialog::SettingsDialog(openspace::Settings settings, QWidget* parent) : QDialog(parent) diff --git a/apps/OpenSpace/ext/launcher/src/sgctedit/displaywindowunion.cpp b/apps/OpenSpace/ext/launcher/src/sgctedit/displaywindowunion.cpp index 92d26a3018..03769d131d 100644 --- a/apps/OpenSpace/ext/launcher/src/sgctedit/displaywindowunion.cpp +++ b/apps/OpenSpace/ext/launcher/src/sgctedit/displaywindowunion.cpp @@ -25,11 +25,15 @@ #include "sgctedit/displaywindowunion.h" #include "sgctedit/windowcontrol.h" +#include #include #include #include #include #include +#include +#include +#include namespace { template struct overloaded : Ts... { using Ts::operator()...; }; diff --git a/apps/OpenSpace/ext/launcher/src/sgctedit/monitorbox.cpp b/apps/OpenSpace/ext/launcher/src/sgctedit/monitorbox.cpp index 930c83dc0a..e0d7922e36 100644 --- a/apps/OpenSpace/ext/launcher/src/sgctedit/monitorbox.cpp +++ b/apps/OpenSpace/ext/launcher/src/sgctedit/monitorbox.cpp @@ -26,6 +26,7 @@ #include "windowcolors.h" #include +#include MonitorBox::MonitorBox(QRect widgetSize, const std::vector& monitorResolutions, QWidget* parent) diff --git a/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp b/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp index 5e7e65dfe8..938df0a13e 100644 --- a/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp +++ b/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp @@ -26,7 +26,9 @@ #include #include +#include #include +#include #include #include #include @@ -36,7 +38,13 @@ #include #include #include +#include +#include #include +#include +#include +#include +#include namespace { constexpr int MaxNumberWindows = 4; diff --git a/apps/OpenSpace/ext/launcher/src/sgctedit/windowcontrol.cpp b/apps/OpenSpace/ext/launcher/src/sgctedit/windowcontrol.cpp index f671b2326a..5f920a7ed4 100644 --- a/apps/OpenSpace/ext/launcher/src/sgctedit/windowcontrol.cpp +++ b/apps/OpenSpace/ext/launcher/src/sgctedit/windowcontrol.cpp @@ -24,18 +24,24 @@ #include "sgctedit/windowcontrol.h" +#include #include +#include +#include #include "windowcolors.h" #include #include #include #include -#include #include #include #include #include #include +#include +#include +#include +#include namespace { std::array, 10> Quality = { diff --git a/apps/OpenSpace/ext/launcher/src/splitcombobox.cpp b/apps/OpenSpace/ext/launcher/src/splitcombobox.cpp index d34f6865ca..b14196c760 100644 --- a/apps/OpenSpace/ext/launcher/src/splitcombobox.cpp +++ b/apps/OpenSpace/ext/launcher/src/splitcombobox.cpp @@ -26,7 +26,9 @@ #include "usericon.h" #include +#include #include +#include SplitComboBox::SplitComboBox(QWidget* parent, std::filesystem::path userPath, std::string userHeader, std::filesystem::path hardcodedPath, diff --git a/apps/OpenSpace/ext/launcher/src/usericon.cpp b/apps/OpenSpace/ext/launcher/src/usericon.cpp index 2374c39e4a..5dab7f8936 100644 --- a/apps/OpenSpace/ext/launcher/src/usericon.cpp +++ b/apps/OpenSpace/ext/launcher/src/usericon.cpp @@ -24,7 +24,10 @@ #include "usericon.h" +#include +#include #include +#include QIcon userIcon() { QPixmap px = QPixmap(40, 50); diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index c3ae514b21..58640fcd78 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit c3ae514b21e97e74c7dc36597a3ac65a785cc987 +Subproject commit 58640fcd780a542a515adfae13f0915006e18210 diff --git a/ext/ghoul b/ext/ghoul index 570de399b4..524a5760d9 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit 570de399b4e2cbc84434d0495bb69877e46c0959 +Subproject commit 524a5760d993df75a935418722faee960ceb8f7d diff --git a/include/openspace/camera/camera.h b/include/openspace/camera/camera.h index bb1424d488..a19e114561 100644 --- a/include/openspace/camera/camera.h +++ b/include/openspace/camera/camera.h @@ -27,12 +27,16 @@ #include #include +#include #include +#include +#include namespace openspace { struct CameraPose; class SceneGraphNode; +class Syncable; /** * This class still needs some more love. Suggested improvements: diff --git a/include/openspace/data/csvloader.h b/include/openspace/data/csvloader.h index ad4b6c297c..d1a2da683c 100644 --- a/include/openspace/data/csvloader.h +++ b/include/openspace/data/csvloader.h @@ -26,8 +26,11 @@ #define __OPENSPACE_CORE___CSVLOADER___H__ #include +#include #include #include +#include +#include namespace openspace::dataloader::csv { diff --git a/include/openspace/data/datamapping.h b/include/openspace/data/datamapping.h index da203e690d..1777b1ac04 100644 --- a/include/openspace/data/datamapping.h +++ b/include/openspace/data/datamapping.h @@ -25,8 +25,10 @@ #ifndef __OPENSPACE_CORE___DATAMAPPING___H__ #define __OPENSPACE_CORE___DATAMAPPING___H__ +#include #include #include +#include #include namespace ghoul { class Dictionary; } diff --git a/include/openspace/data/speckloader.h b/include/openspace/data/speckloader.h index fe4175f9f4..3419350253 100644 --- a/include/openspace/data/speckloader.h +++ b/include/openspace/data/speckloader.h @@ -25,10 +25,16 @@ #ifndef __OPENSPACE_CORE___SPECKLOADER___H__ #define __OPENSPACE_CORE___SPECKLOADER___H__ -#include +#include #include #include +namespace openspace::dataloader { + struct ColorMap; + struct Dataset; + struct Labelset; +} // namespace openspace::dataloader + namespace openspace::dataloader::speck { Dataset loadSpeckFile(std::filesystem::path path, diff --git a/include/openspace/documentation/documentationengine.h b/include/openspace/documentation/documentationengine.h index 25690c4778..38b538e961 100644 --- a/include/openspace/documentation/documentationengine.h +++ b/include/openspace/documentation/documentationengine.h @@ -28,6 +28,7 @@ #include #include #include +#include namespace openspace::documentation { diff --git a/include/openspace/documentation/verifier.h b/include/openspace/documentation/verifier.h index ce5610db4c..f6aaa0e214 100644 --- a/include/openspace/documentation/verifier.h +++ b/include/openspace/documentation/verifier.h @@ -27,7 +27,16 @@ #include #include +#include +#include +#include +#include +#include #include +#include +#include + +namespace ghoul { class Dictionary; } namespace openspace::documentation { diff --git a/include/openspace/documentation/verifier.inl b/include/openspace/documentation/verifier.inl index 61aa451861..635443af72 100644 --- a/include/openspace/documentation/verifier.inl +++ b/include/openspace/documentation/verifier.inl @@ -24,9 +24,10 @@ #include #include -#include +#include #include #include +#include namespace openspace::documentation { @@ -254,7 +255,7 @@ TestResult OperatorVerifier::operator()(const ghoul::Dictionary& di else if constexpr (std::is_same_v) { const double d = dict.value(key); double intPart; - bool isInt = modf(d, &intPart) == 0.0; + bool isInt = std::modf(d, &intPart) == 0.0; if (isInt) { val = static_cast(d); } diff --git a/include/openspace/engine/configuration.h b/include/openspace/engine/configuration.h index 920b6b51b6..eb566f686d 100644 --- a/include/openspace/engine/configuration.h +++ b/include/openspace/engine/configuration.h @@ -25,9 +25,9 @@ #ifndef __OPENSPACE_CORE___CONFIGURATION___H__ #define __OPENSPACE_CORE___CONFIGURATION___H__ -#include #include #include +#include #include #include #include diff --git a/include/openspace/engine/downloadmanager.h b/include/openspace/engine/downloadmanager.h index 54519e4c71..243a4c3de6 100644 --- a/include/openspace/engine/downloadmanager.h +++ b/include/openspace/engine/downloadmanager.h @@ -26,6 +26,7 @@ #define __OPENSPACE_CORE___DOWNLOADMANAGER___H__ #include +#include #include #include #include diff --git a/include/openspace/engine/globals.h b/include/openspace/engine/globals.h index 380165f991..942422fc99 100644 --- a/include/openspace/engine/globals.h +++ b/include/openspace/engine/globals.h @@ -32,25 +32,6 @@ namespace ghoul::fontrendering { class FontManager; } namespace openspace { -struct Configuration; -class Dashboard; -class DeferredcasterManager; -class DownloadEventEngine; -class DownloadManager; -class EventEngine; -class LuaConsole; -class MemoryManager; -class MissionManager; -class ModuleEngine; -class OpenSpaceEngine; -class ParallelPeer; -class RaycasterManager; -class RenderEngine; -class ScreenSpaceRenderable; -class SyncEngine; -class TimeManager; -class VersionChecker; -struct WindowDelegate; namespace interaction { struct JoystickInputStates; struct WebsocketInputStates; @@ -66,7 +47,26 @@ namespace scripting { class ScriptEngine; class ScriptScheduler; } // namespace scripting +struct Configuration; +class Dashboard; +class DeferredcasterManager; +class DownloadEventEngine; +class DownloadManager; +class EventEngine; +class LuaConsole; +class MemoryManager; +class MissionManager; +class ModuleEngine; +class OpenSpaceEngine; +class ParallelPeer; class Profile; +class RaycasterManager; +class RenderEngine; +class ScreenSpaceRenderable; +class SyncEngine; +class TimeManager; +class VersionChecker; +struct WindowDelegate; namespace global { diff --git a/include/openspace/engine/moduleengine.h b/include/openspace/engine/moduleengine.h index 9cb789dc81..e9413d55de 100644 --- a/include/openspace/engine/moduleengine.h +++ b/include/openspace/engine/moduleengine.h @@ -30,6 +30,7 @@ #include #include #include +#include #include namespace ghoul { class Dictionary; } @@ -37,10 +38,9 @@ namespace ghoul::systemcapabilities { struct Version; } namespace openspace { -class OpenSpaceModule; - namespace documentation { struct Documentation; } namespace scripting { struct LuaLibrary; } +class OpenSpaceModule; /** * The ModuleEngine is the central repository for registering and accessing diff --git a/include/openspace/engine/openspaceengine.h b/include/openspace/engine/openspaceengine.h index a9cc5400e4..50515a8db5 100644 --- a/include/openspace/engine/openspaceengine.h +++ b/include/openspace/engine/openspaceengine.h @@ -37,19 +37,24 @@ #include #include #include +#include +#include +#include +#include #include #include +#include #include +#include #include namespace openspace { +namespace scripting { struct LuaLibrary; } class AssetManager; class LoadingScreen; class Scene; -namespace scripting { struct LuaLibrary; } - /** * Structure that is responsible for the delayed shutdown of the application. */ diff --git a/include/openspace/engine/settings.h b/include/openspace/engine/settings.h index e549fc57a0..ee51f2b51e 100644 --- a/include/openspace/engine/settings.h +++ b/include/openspace/engine/settings.h @@ -29,6 +29,7 @@ #include #include #include +#include namespace openspace { diff --git a/include/openspace/engine/syncengine.h b/include/openspace/engine/syncengine.h index 3da9fbea23..f2cfc395fe 100644 --- a/include/openspace/engine/syncengine.h +++ b/include/openspace/engine/syncengine.h @@ -26,8 +26,8 @@ #define __OPENSPACE_CORE___SYNCENGINE___H__ #include - #include +#include #include namespace openspace { diff --git a/include/openspace/events/event.h b/include/openspace/events/event.h index 20b2754cc6..585d3c6d1e 100644 --- a/include/openspace/events/event.h +++ b/include/openspace/events/event.h @@ -28,17 +28,19 @@ #include #include #include +#include +#include +#include namespace openspace { -namespace properties { class Property; } - -class Camera; -class Layer; -class Profile; -class Renderable; -class SceneGraphNode; -class ScreenSpaceRenderable; -class Time; + namespace properties { class Property; } + class Camera; + class Layer; + class Profile; + class Renderable; + class SceneGraphNode; + class ScreenSpaceRenderable; + class Time; } // namespace openspace namespace openspace::events { diff --git a/include/openspace/events/eventengine.h b/include/openspace/events/eventengine.h index 1c3d484cd0..1aa671dd1a 100644 --- a/include/openspace/events/eventengine.h +++ b/include/openspace/events/eventengine.h @@ -26,13 +26,17 @@ #define __OPENSPACE_CORE___EVENTENGINE___H__ #include -#include +#include #include +#include +#include +#include #include +#include namespace openspace { -namespace events { struct Event; } +namespace scripting { struct LuaLibrary; } class EventEngine { public: diff --git a/include/openspace/interaction/actionmanager.h b/include/openspace/interaction/actionmanager.h index ef139163f3..aa43fcfdbd 100644 --- a/include/openspace/interaction/actionmanager.h +++ b/include/openspace/interaction/actionmanager.h @@ -26,7 +26,9 @@ #define __OPENSPACE_CORE___ACTIONMANAGER___H__ #include +#include #include +#include namespace ghoul { class Dictionary; } namespace openspace::scripting { struct LuaLibrary; } diff --git a/include/openspace/interaction/delayedvariable.h b/include/openspace/interaction/delayedvariable.h index 790e0d5ac5..0b284fb1e1 100644 --- a/include/openspace/interaction/delayedvariable.h +++ b/include/openspace/interaction/delayedvariable.h @@ -36,6 +36,7 @@ template class DelayedVariable { public: DelayedVariable(ScaleType scaleFactor, ScaleType friction); + void set(T value, double dt); void decelerate(double dt); void setHard(T value); diff --git a/include/openspace/interaction/joystickcamerastates.h b/include/openspace/interaction/joystickcamerastates.h index f2c0adaa73..b32dc8b70b 100644 --- a/include/openspace/interaction/joystickcamerastates.h +++ b/include/openspace/interaction/joystickcamerastates.h @@ -28,8 +28,12 @@ #include #include +#include #include +#include #include +#include +#include #include namespace openspace::interaction { diff --git a/include/openspace/interaction/joystickinputstate.h b/include/openspace/interaction/joystickinputstate.h index eee1e65bd0..2b4e8bb376 100644 --- a/include/openspace/interaction/joystickinputstate.h +++ b/include/openspace/interaction/joystickinputstate.h @@ -25,10 +25,14 @@ #ifndef __OPENSPACE_CORE___JOYSTICKINPUTSTATE___H__ #define __OPENSPACE_CORE___JOYSTICKINPUTSTATE___H__ +#include #include #include #include +#include #include +#include +#include namespace openspace::interaction { diff --git a/include/openspace/interaction/keybindingmanager.h b/include/openspace/interaction/keybindingmanager.h index 94707e68e4..5e89f8172f 100644 --- a/include/openspace/interaction/keybindingmanager.h +++ b/include/openspace/interaction/keybindingmanager.h @@ -26,14 +26,16 @@ #define __OPENSPACE_CORE___KEYBINDINGMANAGER___H__ #include +#include +#include +#include namespace openspace { + namespace scripting { struct LuaLibrary; } class Camera; class SceneGraphNode; } // namespace openspace -namespace openspace::scripting { struct LuaLibrary; } - namespace openspace::interaction { class KeybindingManager { diff --git a/include/openspace/interaction/keyboardinputstate.h b/include/openspace/interaction/keyboardinputstate.h index 481ebae77c..8ea75ab294 100644 --- a/include/openspace/interaction/keyboardinputstate.h +++ b/include/openspace/interaction/keyboardinputstate.h @@ -26,6 +26,7 @@ #define __OPENSPACE_CORE___KEYBOARDINPUTSTATE___H__ #include +#include #include namespace openspace::interaction { diff --git a/include/openspace/interaction/keyframerecordinghandler.h b/include/openspace/interaction/keyframerecordinghandler.h index 64e96ed3b1..807a3b7956 100644 --- a/include/openspace/interaction/keyframerecordinghandler.h +++ b/include/openspace/interaction/keyframerecordinghandler.h @@ -28,11 +28,13 @@ #include #include -#include #include #include #include +namespace ghoul { class Dictionary; } +namespace openspace::scripting { struct LuaLibrary; } + namespace openspace::interaction { class KeyframeRecordingHandler : public properties::PropertyOwner { diff --git a/include/openspace/interaction/mousecamerastates.h b/include/openspace/interaction/mousecamerastates.h index dcffb435bc..36d0d786e7 100644 --- a/include/openspace/interaction/mousecamerastates.h +++ b/include/openspace/interaction/mousecamerastates.h @@ -29,8 +29,8 @@ namespace openspace::interaction { -class MouseInputState; class KeyboardInputState; +class MouseInputState; class MouseCameraStates : public CameraInteractionStates { public: @@ -43,7 +43,6 @@ public: private: bool _isMouseButtonInverted = false; - double _currentSensitivityRamp = 1.0; }; diff --git a/include/openspace/interaction/sessionrecording.h b/include/openspace/interaction/sessionrecording.h index 2eee114608..42ce14fa28 100644 --- a/include/openspace/interaction/sessionrecording.h +++ b/include/openspace/interaction/sessionrecording.h @@ -26,13 +26,14 @@ #define __OPENSPACE_CORE___SESSIONRECORDING___H__ #include -#include #include #include #include #include #include +namespace ghoul { class Dictionary; } + namespace openspace::interaction { enum class DataMode { diff --git a/include/openspace/interaction/sessionrecordinghandler.h b/include/openspace/interaction/sessionrecordinghandler.h index 1e2114a21d..a511a2b8dc 100644 --- a/include/openspace/interaction/sessionrecordinghandler.h +++ b/include/openspace/interaction/sessionrecordinghandler.h @@ -30,6 +30,17 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace openspace::properties { class Property; } namespace openspace::interaction { diff --git a/include/openspace/interaction/tasks/convertrecformattask.h b/include/openspace/interaction/tasks/convertrecformattask.h index 2f8ae62366..530a210bb4 100644 --- a/include/openspace/interaction/tasks/convertrecformattask.h +++ b/include/openspace/interaction/tasks/convertrecformattask.h @@ -26,11 +26,12 @@ #define __OPENSPACE_CORE___CONVERTRECFORMATTASK___H__ #include -#include -#include +#include #include -#include + +namespace ghoul { class Dictionary; } +namespace openspace::documentation { struct Documentation; } namespace openspace::interaction { diff --git a/include/openspace/interaction/websocketcamerastates.h b/include/openspace/interaction/websocketcamerastates.h index 3e5c80ce92..79d0bb4cc8 100644 --- a/include/openspace/interaction/websocketcamerastates.h +++ b/include/openspace/interaction/websocketcamerastates.h @@ -29,7 +29,11 @@ #include #include +#include +#include #include +#include +#include #include namespace openspace::interaction { diff --git a/include/openspace/interaction/websocketinputstate.h b/include/openspace/interaction/websocketinputstate.h index 1251948ba4..6d7bce59bc 100644 --- a/include/openspace/interaction/websocketinputstate.h +++ b/include/openspace/interaction/websocketinputstate.h @@ -28,8 +28,10 @@ #include #include #include +#include #include #include +#include namespace openspace::interaction { diff --git a/include/openspace/mission/mission.h b/include/openspace/mission/mission.h index 0258bec3e1..7ae028c18a 100644 --- a/include/openspace/mission/mission.h +++ b/include/openspace/mission/mission.h @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -121,7 +122,6 @@ public: */ const std::vector& phases() const; - /** * Returns all important dates. * @@ -129,7 +129,6 @@ public: */ const std::vector& milestones() const; - /** * Returns all actions. * diff --git a/include/openspace/mission/missionmanager.h b/include/openspace/mission/missionmanager.h index b6200d67ac..f61e1350ad 100644 --- a/include/openspace/mission/missionmanager.h +++ b/include/openspace/mission/missionmanager.h @@ -26,7 +26,6 @@ #define __OPENSPACE_CORE___MISSIONMANAGER___H__ #include - #include #include diff --git a/include/openspace/navigation/keyframenavigator.h b/include/openspace/navigation/keyframenavigator.h index dd946f3125..516ee42a1e 100644 --- a/include/openspace/navigation/keyframenavigator.h +++ b/include/openspace/navigation/keyframenavigator.h @@ -25,13 +25,13 @@ #ifndef __OPENSPACE_CORE___KEYFRAMENAVIGATOR___H__ #define __OPENSPACE_CORE___KEYFRAMENAVIGATOR___H__ -#include #include #include #include -#include +#include namespace openspace { + namespace datamessagestructures { struct CameraKeyframe; } class Camera; class TimeManager; } // namespace openspace diff --git a/include/openspace/navigation/navigationhandler.h b/include/openspace/navigation/navigationhandler.h index 053f6526b4..41a8320745 100644 --- a/include/openspace/navigation/navigationhandler.h +++ b/include/openspace/navigation/navigationhandler.h @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -38,16 +39,22 @@ #include #include #include -#include #include +#include +#include +#include +#include +#include +#include +#include +#include namespace openspace { + namespace scripting { struct LuaLibrary; } class Camera; class SceneGraphNode; } // namespace openspace -namespace openspace::scripting { struct LuaLibrary; } - namespace openspace::interaction { struct JoystickInputStates; diff --git a/include/openspace/navigation/navigationstate.h b/include/openspace/navigation/navigationstate.h index fec5b79d04..78dffabfcf 100644 --- a/include/openspace/navigation/navigationstate.h +++ b/include/openspace/navigation/navigationstate.h @@ -25,11 +25,16 @@ #ifndef __OPENSPACE_CORE___NAVIGATIONSTATE___H__ #define __OPENSPACE_CORE___NAVIGATIONSTATE___H__ -#include #include +#include #include +#include -namespace openspace { struct CameraPose; } +namespace ghoul { class Dictionary; } +namespace openspace { + namespace documentation { struct Documentation; } + struct CameraPose; +} // namespace openspace namespace openspace::interaction { diff --git a/include/openspace/navigation/orbitalnavigator.h b/include/openspace/navigation/orbitalnavigator.h index 37061bbbc3..bd968b2035 100644 --- a/include/openspace/navigation/orbitalnavigator.h +++ b/include/openspace/navigation/orbitalnavigator.h @@ -39,18 +39,18 @@ #include #include #include -#include #include +#include namespace openspace { + namespace scripting { struct LuaLibrary; } class Camera; struct CameraPose; class SceneGraphNode; struct SurfacePositionHandle; + class Syncable; } // namespace -namespace openspace::scripting { struct LuaLibrary; } - namespace openspace::interaction { class MouseInputState; diff --git a/include/openspace/navigation/path.h b/include/openspace/navigation/path.h index 2b3680f677..59a650a837 100644 --- a/include/openspace/navigation/path.h +++ b/include/openspace/navigation/path.h @@ -25,14 +25,18 @@ #ifndef __OPENSPACE_CORE___PATH___H__ #define __OPENSPACE_CORE___PATH___H__ -#include #include #include -#include +#include #include +#include #include -namespace openspace { struct CameraPose; } +namespace ghoul { class Dictionary; } +namespace openspace { + namespace documentation { struct Documentation; } + struct CameraPose; +} // namespace openspace namespace openspace::interaction { diff --git a/include/openspace/navigation/pathcurve.h b/include/openspace/navigation/pathcurve.h index 3b5e312b2f..6748e45718 100644 --- a/include/openspace/navigation/pathcurve.h +++ b/include/openspace/navigation/pathcurve.h @@ -28,6 +28,7 @@ #include #include #include +#include namespace openspace::interaction { diff --git a/include/openspace/navigation/pathcurves/avoidcollisioncurve.h b/include/openspace/navigation/pathcurves/avoidcollisioncurve.h index 034a6f926c..ee384e0b36 100644 --- a/include/openspace/navigation/pathcurves/avoidcollisioncurve.h +++ b/include/openspace/navigation/pathcurves/avoidcollisioncurve.h @@ -33,7 +33,7 @@ namespace openspace { class SceneGraphNode; } namespace openspace::interaction { -class WayPoint; +class Waypoint; class AvoidCollisionCurve : public PathCurve { public: diff --git a/include/openspace/navigation/pathcurves/zoomoutoverviewcurve.h b/include/openspace/navigation/pathcurves/zoomoutoverviewcurve.h index 32ee9ee5d8..756d71de9a 100644 --- a/include/openspace/navigation/pathcurves/zoomoutoverviewcurve.h +++ b/include/openspace/navigation/pathcurves/zoomoutoverviewcurve.h @@ -29,7 +29,7 @@ namespace openspace::interaction { -class WayPoint; +class Waypoint; class ZoomOutOverviewCurve : public PathCurve { public: diff --git a/include/openspace/navigation/pathnavigator.h b/include/openspace/navigation/pathnavigator.h index 8f157dd7e9..15aa10e777 100644 --- a/include/openspace/navigation/pathnavigator.h +++ b/include/openspace/navigation/pathnavigator.h @@ -36,13 +36,12 @@ #include namespace openspace { + namespace scripting { struct LuaLibrary; } class Camera; struct CameraPose; class SceneGraphNode; } // namespace openspace -namespace openspace::scripting { struct LuaLibrary; } - namespace openspace::interaction { class Path; diff --git a/include/openspace/network/messagestructures.h b/include/openspace/network/messagestructures.h index bf6b50b94d..fb0794a36b 100644 --- a/include/openspace/network/messagestructures.h +++ b/include/openspace/network/messagestructures.h @@ -25,12 +25,8 @@ #ifndef __OPENSPACE_CORE___MESSAGESTRUCTURES___H__ #define __OPENSPACE_CORE___MESSAGESTRUCTURES___H__ -#include #include -#include -#include -#include -#include +#include #include #include #include @@ -47,17 +43,18 @@ enum class Type : uint32_t { struct CameraKeyframe { CameraKeyframe() = default; - explicit CameraKeyframe(const std::vector& buffer) { - deserialize(buffer); - } + explicit CameraKeyframe(const std::vector& buffer); CameraKeyframe(glm::dvec3 pos, glm::dquat rot, std::string focusNode, - bool followNodeRot, float scale) - : _position(pos) - , _rotation(rot) - , _followNodeRotation(followNodeRot) - , _focusNode(focusNode) - , _scale(scale) - {} + bool followNodeRot, float scale); + + void serialize(std::vector& buffer) const; + size_t deserialize(const std::vector& buffer, size_t offset = 0); + + void write(std::ostream& out) const; + void write(std::stringstream& out) const; + + void read(std::istream* in); + void read(std::istringstream& iss); glm::dvec3 _position = glm::dvec3(0.0); glm::dquat _rotation = glm::dquat(1.0, 0.0, 0.0, 0.0); @@ -66,411 +63,57 @@ struct CameraKeyframe { float _scale = 0.f; double _timestamp = 0.0; - - void serialize(std::vector& buffer) const { - // Add position - buffer.insert( - buffer.end(), - reinterpret_cast(&_position), - reinterpret_cast(&_position) + sizeof(_position) - ); - - // Add orientation - buffer.insert( - buffer.end(), - reinterpret_cast(&_rotation), - reinterpret_cast(&_rotation) + sizeof(_rotation) - ); - - // Follow focus node rotation? - buffer.insert( - buffer.end(), - reinterpret_cast(&_followNodeRotation), - reinterpret_cast(&_followNodeRotation) + - sizeof(_followNodeRotation) - ); - - uint32_t nodeNameLength = static_cast(_focusNode.size()); - - // Add focus node - buffer.insert( - buffer.end(), - reinterpret_cast(&nodeNameLength), - reinterpret_cast(&nodeNameLength) + sizeof(uint32_t) - ); - buffer.insert( - buffer.end(), - _focusNode.data(), - _focusNode.data() + nodeNameLength - ); - - buffer.insert( - buffer.end(), - reinterpret_cast(&_scale), - reinterpret_cast(&_scale) + sizeof(_scale) - ); - - // Add timestamp - buffer.insert( - buffer.end(), - reinterpret_cast(&_timestamp), - reinterpret_cast(&_timestamp) + sizeof(_timestamp) - ); - } - - size_t deserialize(const std::vector& buffer, size_t offset = 0) { - int size = 0; - - // Position - size = sizeof(_position); - std::memcpy(glm::value_ptr(_position), buffer.data() + offset, size); - offset += size; - - // Orientation - size = sizeof(_rotation); - std::memcpy(glm::value_ptr(_rotation), buffer.data() + offset, size); - offset += size; - - // Follow focus node rotation? - size = sizeof(_followNodeRotation); - std::memcpy(&_followNodeRotation, buffer.data() + offset, size); - offset += size; - - // Focus node - int nodeNameLength; - size = sizeof(int); - std::memcpy(&nodeNameLength, buffer.data() + offset, size); - offset += size; - size = nodeNameLength; - _focusNode = std::string(buffer.data() + offset, buffer.data() + offset + size); - offset += size; - - // Scale - size = sizeof(_scale); - std::memcpy(&_scale, buffer.data() + offset, size); - offset += size; - - // Timestamp - size = sizeof(_timestamp); - std::memcpy(&_timestamp, buffer.data() + offset, size); - offset += size; - - return offset; - } - - void write(std::ostream& out) const { - out.write( - reinterpret_cast(glm::value_ptr(_position)), - sizeof(_position) - ); - out.write( - reinterpret_cast(glm::value_ptr(_rotation)), - sizeof(_rotation) - ); - - // Write follow focus node rotation? - out.write( - reinterpret_cast(&_followNodeRotation), - sizeof(_followNodeRotation) - ); - - int nodeNameLength = static_cast(_focusNode.size()); - - // Write focus node - out.write(reinterpret_cast(&nodeNameLength), sizeof(nodeNameLength)); - out.write(_focusNode.c_str(), _focusNode.size()); - - // Write scale - out.write(reinterpret_cast(&_scale), sizeof(_scale)); - - // Write timestamp - out.write(reinterpret_cast(&_timestamp), sizeof(_timestamp)); - } - - void write(std::stringstream& out) const { - // Add camera position - out << std::setprecision(std::numeric_limits::max_digits10); - out << _position.x << ' ' << _position.y << ' ' << _position.z << ' '; - // Add camera rotation - out << _rotation.x << ' ' - << _rotation.y << ' ' - << _rotation.z << ' ' - << _rotation.w << ' '; - out << std::scientific << _scale << ' '; - if (_followNodeRotation) { - out << "F "; - } - else { - out << "- "; - } - out << _focusNode; - } - - void read(std::istream* in) { - // Read position - in->read(reinterpret_cast(&_position), sizeof(_position)); - - // Read orientation - in->read(reinterpret_cast(&_rotation), sizeof(_rotation)); - - // Read follow focus node rotation - unsigned char b; - in->read(reinterpret_cast(&b), sizeof(unsigned char)); - _followNodeRotation = (b == 1); - - // Read focus node - int nodeNameLength = static_cast(_focusNode.size()); - in->read(reinterpret_cast(&nodeNameLength), sizeof(nodeNameLength)); - std::vector temp(static_cast(nodeNameLength) + 1); - in->read(temp.data(), nodeNameLength); - - temp[nodeNameLength] = '\0'; - _focusNode = temp.data(); - - // Read scale - in->read(reinterpret_cast(&_scale), sizeof(_scale)); - - // Read timestamp - in->read(reinterpret_cast(&_timestamp), sizeof(_timestamp)); - } - - void read(std::istringstream& iss) { - std::string rotationFollowing; - - iss >> _position.x - >> _position.y - >> _position.z - >> _rotation.x - >> _rotation.y - >> _rotation.z - >> _rotation.w - >> _scale - >> rotationFollowing - >> _focusNode; - _followNodeRotation = (rotationFollowing == "F"); - } }; struct TimeKeyframe { TimeKeyframe() = default; - TimeKeyframe(const std::vector& buffer) { - deserialize(buffer); - } + TimeKeyframe(const std::vector& buffer); + + void serialize(std::vector& buffer) const; + size_t deserialize(const std::vector& buffer, size_t offset = 0); + + void write(std::ostream* out) const; + void write(std::stringstream& out) const; + + void read(std::istream* in); + void read(std::istringstream& iss); double _time = 0.0; double _dt = 0.0; bool _paused = false; bool _requiresTimeJump = false; double _timestamp = 0.0; - - void serialize(std::vector& buffer) const { - buffer.insert( - buffer.end(), - reinterpret_cast(this), - reinterpret_cast(this) + sizeof(TimeKeyframe) - ); - } - - size_t deserialize(const std::vector& buffer, size_t offset = 0) { - *this = *reinterpret_cast(buffer.data() + offset); - offset += sizeof(TimeKeyframe); - return offset; - } - - void write(std::ostream* out) const { - out->write(reinterpret_cast(this), sizeof(TimeKeyframe)); - } - - void write(std::stringstream& out) const { - out << ' ' << _dt; - if (_paused) { - out << " P"; - } - else { - out << " R"; - } - if (_requiresTimeJump) { - out << " J"; - } - else { - out << " -"; - } - } - - void read(std::istream* in) { - in->read(reinterpret_cast(this), sizeof(TimeKeyframe)); - } - - void read(std::istringstream& iss) { - std::string paused, jump; - - iss >> _dt - >> paused - >> jump; - _paused = (paused == "P"); - _requiresTimeJump = (jump == "J"); - } }; struct TimeTimeline { TimeTimeline() = default; - TimeTimeline(const std::vector& buffer) { - deserialize(buffer); - } + TimeTimeline(const std::vector& buffer); + + void serialize(std::vector& buffer) const; + size_t deserialize(const std::vector& buffer, size_t offset = 0); + + void write(std::ostream* out) const; + void read(std::istream* in); bool _clear = true; std::vector _keyframes; - - void serialize(std::vector& buffer) const { - buffer.insert( - buffer.end(), - reinterpret_cast(&_clear), - reinterpret_cast(&_clear) + sizeof(bool) - ); - - int64_t nKeyframes = _keyframes.size(); - buffer.insert( - buffer.end(), - reinterpret_cast(&nKeyframes), - reinterpret_cast(&nKeyframes) + sizeof(int64_t) - ); - for (const TimeKeyframe& k : _keyframes) { - k.serialize(buffer); - } - } - - size_t deserialize(const std::vector& buffer, size_t offset = 0) { - int size = 0; - - size = sizeof(_clear); - std::memcpy(&_clear, buffer.data() + offset, size); - offset += size; - - int64_t nKeyframes = _keyframes.size(); - size = sizeof(nKeyframes); - std::memcpy(&nKeyframes, buffer.data() + offset, size); - offset += size; - - _keyframes.resize(nKeyframes); - for (TimeKeyframe& k : _keyframes) { - offset = k.deserialize(buffer, offset); - } - return offset; - } - - void write(std::ostream* out) const { - out->write(reinterpret_cast(&_clear), sizeof(bool)); - - int64_t nKeyframes = _keyframes.size(); - out->write(reinterpret_cast(&nKeyframes), sizeof(int64_t)); - for (const TimeKeyframe& k : _keyframes) { - k.write(out); - } - } - - void read(std::istream* in) { - in->read(reinterpret_cast(&_clear), sizeof(bool)); - - int64_t nKeyframes = _keyframes.size(); - in->read(reinterpret_cast(&nKeyframes), sizeof(int64_t)); - for (TimeKeyframe& k : _keyframes) { - k.read(in); - } - } }; struct ScriptMessage { ScriptMessage() = default; + void serialize(std::vector& buffer) const; + void deserialize(const std::vector& buffer); + + void write(std::ostream* out) const; + void write(unsigned char* buf, size_t& idx, std::ofstream& file) const; + void write(std::stringstream& ss) const; + + void read(std::istream* in); + void read(std::istringstream& iss); + std::string _script; double _timestamp = 0.0; - - void serialize(std::vector& buffer) const { - uint32_t strLen = static_cast(_script.size()); - - const char* p = reinterpret_cast(&strLen); - buffer.insert(buffer.end(), p, p + sizeof(uint32_t)); - - buffer.insert(buffer.end(), _script.begin(), _script.end()); - } - - void deserialize(const std::vector& buffer) { - const char* p = buffer.data(); - const uint32_t len = *reinterpret_cast(p); - - if (buffer.size() != (sizeof(uint32_t) + len)) { - LERRORC( - "ParallelPeer", - std::format( - "Received buffer with wrong size. Expected {} got {}", - len, buffer.size() - ) - ); - return; - } - - // We can skip over the first uint32_t that encoded the length - _script.assign(buffer.begin() + sizeof(uint32_t), buffer.end()); - } - - void write(std::ostream* out) const { - out->write(_script.c_str(), _script.size()); - } - - void write(unsigned char* buf, size_t& idx, std::ofstream& file) const { - size_t strLen = _script.size(); - size_t writeSize_bytes = sizeof(size_t); - - unsigned char const *p = reinterpret_cast(&strLen); - memcpy((buf + idx), p, writeSize_bytes); - idx += static_cast(writeSize_bytes); - - memcpy((buf + idx), _script.c_str(), _script.size()); - idx += static_cast(strLen); - file.write(reinterpret_cast(buf), idx); - //Write directly to file because some scripts can be very long - file.write(_script.c_str(), _script.size()); - } - - void write(std::stringstream& ss) const { - unsigned int numLinesInScript = static_cast( - std::count(_script.begin(), _script.end(), '\n') - ); - ss << ' ' << (numLinesInScript + 1) << ' '; - ss << _script; - } - - void read(std::istream* in) { - uint32_t strLen = 0; - //Read string length from file - in->read(reinterpret_cast(&strLen), sizeof(strLen)); - //Read back full string - std::vector temp(strLen + 1); - in->read(temp.data(), strLen); - temp[strLen] = '\0'; - - _script.erase(); - _script = temp.data(); - } - - void read(std::istringstream& iss) { - int numScriptLines; - iss >> numScriptLines; - if (numScriptLines < 0) { - numScriptLines = 0; - } - std::string tmpReadbackScript; - _script.erase(); - for (int i = 0; i < numScriptLines; i++) { - ghoul::getline(iss, tmpReadbackScript); - size_t start = tmpReadbackScript.find_first_not_of(" "); - tmpReadbackScript = tmpReadbackScript.substr(start); - _script.append(tmpReadbackScript); - if (i < (numScriptLines - 1)) { - _script.append("\n"); - } - } - } }; } // namespace openspace::messagestructures diff --git a/include/openspace/network/messagestructureshelper.h b/include/openspace/network/messagestructureshelper.h index dac6cd0504..5e034cfa20 100644 --- a/include/openspace/network/messagestructureshelper.h +++ b/include/openspace/network/messagestructureshelper.h @@ -25,10 +25,14 @@ #ifndef __OPENSPACE_CORE___MESSAGESTRUCTURESHELPER___H__ #define __OPENSPACE_CORE___MESSAGESTRUCTURESHELPER___H__ -#include +#include namespace openspace::datamessagestructures { +struct CameraKeyframe; +struct ScriptMessage; +struct TimeKeyframe; + /** * Method that creates a CameraKeyframe object and populates it with the current * properties of the camera from the navigation handler. diff --git a/include/openspace/network/parallelconnection.h b/include/openspace/network/parallelconnection.h index 59382c3c7a..191139c2dc 100644 --- a/include/openspace/network/parallelconnection.h +++ b/include/openspace/network/parallelconnection.h @@ -28,6 +28,8 @@ #include #include #include +#include +#include #include namespace openspace { diff --git a/include/openspace/network/parallelpeer.h b/include/openspace/network/parallelpeer.h index f03bf09f6b..d59920cd1c 100644 --- a/include/openspace/network/parallelpeer.h +++ b/include/openspace/network/parallelpeer.h @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include diff --git a/include/openspace/properties/list/doublelistproperty.h b/include/openspace/properties/list/doublelistproperty.h index 060c2a2142..0469828c86 100644 --- a/include/openspace/properties/list/doublelistproperty.h +++ b/include/openspace/properties/list/doublelistproperty.h @@ -31,7 +31,7 @@ namespace openspace::properties { class DoubleListProperty : public ListProperty { public: - DoubleListProperty(Property::PropertyInfo info, + explicit DoubleListProperty(Property::PropertyInfo info, std::vector values = std::vector()); std::string_view className() const override final; diff --git a/include/openspace/properties/list/intlistproperty.h b/include/openspace/properties/list/intlistproperty.h index eb13bceba8..ab7bd5100b 100644 --- a/include/openspace/properties/list/intlistproperty.h +++ b/include/openspace/properties/list/intlistproperty.h @@ -31,7 +31,7 @@ namespace openspace::properties { class IntListProperty : public ListProperty { public: - IntListProperty(Property::PropertyInfo info, + explicit IntListProperty(Property::PropertyInfo info, std::vector values = std::vector()); std::string_view className() const override final; diff --git a/include/openspace/properties/list/stringlistproperty.h b/include/openspace/properties/list/stringlistproperty.h index 25eb12e441..c5531087d5 100644 --- a/include/openspace/properties/list/stringlistproperty.h +++ b/include/openspace/properties/list/stringlistproperty.h @@ -27,14 +27,11 @@ #include -#include -#include - namespace openspace::properties { class StringListProperty : public ListProperty { public: - StringListProperty(Property::PropertyInfo info, + explicit StringListProperty(Property::PropertyInfo info, std::vector values = std::vector()); std::string_view className() const override final; diff --git a/include/openspace/properties/matrix/dmat2property.h b/include/openspace/properties/matrix/dmat2property.h index 8c25086ef4..cfd6b00118 100644 --- a/include/openspace/properties/matrix/dmat2property.h +++ b/include/openspace/properties/matrix/dmat2property.h @@ -34,7 +34,8 @@ namespace openspace::properties { class DMat2Property : public NumericalProperty { public: - DMat2Property(Property::PropertyInfo info, glm::dmat2x2 value = glm::dmat2x2(0.0), + explicit DMat2Property(Property::PropertyInfo info, + glm::dmat2x2 value = glm::dmat2x2(0.0), glm::dmat2x2 minValue = ghoul::createFillMat2x2(std::numeric_limits::lowest()), glm::dmat2x2 maxValue = diff --git a/include/openspace/properties/matrix/dmat3property.h b/include/openspace/properties/matrix/dmat3property.h index 954e56e12a..7d184bd2b0 100644 --- a/include/openspace/properties/matrix/dmat3property.h +++ b/include/openspace/properties/matrix/dmat3property.h @@ -34,7 +34,8 @@ namespace openspace::properties { class DMat3Property : public NumericalProperty { public: - DMat3Property(Property::PropertyInfo info, glm::dmat3x3 value = glm::dmat3x3(0.0), + explicit DMat3Property(Property::PropertyInfo info, + glm::dmat3x3 value = glm::dmat3x3(0.0), glm::dmat3x3 minValue = ghoul::createFillMat3x3(std::numeric_limits::lowest()), glm::dmat3x3 maxValue = diff --git a/include/openspace/properties/matrix/dmat4property.h b/include/openspace/properties/matrix/dmat4property.h index 3a21e502c9..8e3ff61135 100644 --- a/include/openspace/properties/matrix/dmat4property.h +++ b/include/openspace/properties/matrix/dmat4property.h @@ -34,7 +34,8 @@ namespace openspace::properties { class DMat4Property : public NumericalProperty { public: - DMat4Property(Property::PropertyInfo info, glm::dmat4x4 value = glm::dmat4x4(0.0), + explicit DMat4Property(Property::PropertyInfo info, + glm::dmat4x4 value = glm::dmat4x4(0.0), glm::dmat4x4 minValue = ghoul::createFillMat4x4(std::numeric_limits::lowest()), glm::dmat4x4 maxValue = diff --git a/include/openspace/properties/matrix/mat2property.h b/include/openspace/properties/matrix/mat2property.h index 68513c377d..5e5eb80e28 100644 --- a/include/openspace/properties/matrix/mat2property.h +++ b/include/openspace/properties/matrix/mat2property.h @@ -28,13 +28,13 @@ #include #include -#include namespace openspace::properties { class Mat2Property : public NumericalProperty { public: - Mat2Property(Property::PropertyInfo info, glm::mat2x2 value = glm::mat2x2(0.f), + explicit Mat2Property(Property::PropertyInfo info, + glm::mat2x2 value = glm::mat2x2(0.f), glm::mat2x2 minValue = ghoul::createFillMat2x2(std::numeric_limits::lowest()), glm::mat2x2 maxValue = diff --git a/include/openspace/properties/matrix/mat3property.h b/include/openspace/properties/matrix/mat3property.h index 17cc04876e..372c1116b8 100644 --- a/include/openspace/properties/matrix/mat3property.h +++ b/include/openspace/properties/matrix/mat3property.h @@ -34,7 +34,8 @@ namespace openspace::properties { class Mat3Property : public NumericalProperty { public: - Mat3Property(Property::PropertyInfo info, glm::mat3x3 value = glm::mat3x3(), + explicit Mat3Property(Property::PropertyInfo info, + glm::mat3x3 value = glm::mat3x3(0.f), glm::mat3x3 minValue = ghoul::createFillMat3x3(std::numeric_limits::lowest()), glm::mat3x3 maxValue = diff --git a/include/openspace/properties/matrix/mat4property.h b/include/openspace/properties/matrix/mat4property.h index 0ba714173b..8ae4b0b7cd 100644 --- a/include/openspace/properties/matrix/mat4property.h +++ b/include/openspace/properties/matrix/mat4property.h @@ -34,7 +34,7 @@ namespace openspace::properties { class Mat4Property : public NumericalProperty { public: - Mat4Property(Property::PropertyInfo info, glm::mat4 value = glm::mat4(), + explicit Mat4Property(Property::PropertyInfo info, glm::mat4 value = glm::mat4(0.f), glm::mat4 minValue = ghoul::createFillMat4x4(std::numeric_limits::lowest()), glm::mat4 maxValue = diff --git a/include/openspace/properties/misc/listproperty.h b/include/openspace/properties/misc/listproperty.h index 2453549adc..dd15f7e192 100644 --- a/include/openspace/properties/misc/listproperty.h +++ b/include/openspace/properties/misc/listproperty.h @@ -27,14 +27,12 @@ #include -#include - namespace openspace::properties { template class ListProperty : public TemplateProperty> { public: - ListProperty(Property::PropertyInfo info, std::vector values); + explicit ListProperty(Property::PropertyInfo info, std::vector values); virtual ~ListProperty() override = 0; }; diff --git a/include/openspace/properties/misc/optionproperty.h b/include/openspace/properties/misc/optionproperty.h index deeadd946d..d1f639037c 100644 --- a/include/openspace/properties/misc/optionproperty.h +++ b/include/openspace/properties/misc/optionproperty.h @@ -25,9 +25,7 @@ #ifndef __OPENSPACE_CORE___OPTIONPROPERTY___H__ #define __OPENSPACE_CORE___OPTIONPROPERTY___H__ -#include - -#include +#include namespace openspace::properties { @@ -57,7 +55,7 @@ public: * \pre \p info.identifier must not be empty * \pre \p info.guiName must not be empty */ - OptionProperty(Property::PropertyInfo info); + explicit OptionProperty(Property::PropertyInfo info); /** * Returns the name of the class for reflection purposes. diff --git a/include/openspace/properties/misc/selectionproperty.h b/include/openspace/properties/misc/selectionproperty.h index 8542bb308f..e3beef6e1d 100644 --- a/include/openspace/properties/misc/selectionproperty.h +++ b/include/openspace/properties/misc/selectionproperty.h @@ -28,8 +28,6 @@ #include #include -#include -#include namespace openspace::properties { diff --git a/include/openspace/properties/misc/stringproperty.h b/include/openspace/properties/misc/stringproperty.h index aa63a0d7a7..7441a771c8 100644 --- a/include/openspace/properties/misc/stringproperty.h +++ b/include/openspace/properties/misc/stringproperty.h @@ -31,7 +31,7 @@ namespace openspace::properties { class StringProperty : public TemplateProperty { public: - StringProperty(Property::PropertyInfo info, std::string value = ""); + explicit StringProperty(Property::PropertyInfo info, std::string value = ""); std::string_view className() const override final; ghoul::lua::LuaTypes typeLua() const override final; diff --git a/include/openspace/properties/misc/triggerproperty.h b/include/openspace/properties/misc/triggerproperty.h index e12f06ae98..de8168e041 100644 --- a/include/openspace/properties/misc/triggerproperty.h +++ b/include/openspace/properties/misc/triggerproperty.h @@ -44,7 +44,7 @@ public: * \pre \p info.identifier must not be empty * \pre \p info.guiName must not be empty */ - TriggerProperty(PropertyInfo info); + explicit TriggerProperty(PropertyInfo info); /** * Returns the class name `TriggerProperty`. diff --git a/include/openspace/properties/numericalproperty.h b/include/openspace/properties/numericalproperty.h index a83fad6e6d..3aef60e433 100644 --- a/include/openspace/properties/numericalproperty.h +++ b/include/openspace/properties/numericalproperty.h @@ -26,7 +26,8 @@ #define __OPENSPACE_CORE___NUMERICALPROPERTY___H__ #include -#include + +#include namespace openspace::properties { diff --git a/include/openspace/properties/property.h b/include/openspace/properties/property.h index 54c646f3e9..2b71d590ba 100644 --- a/include/openspace/properties/property.h +++ b/include/openspace/properties/property.h @@ -29,9 +29,16 @@ #include #include #include +#include #include +#include +#include #include #include +#include +#include +#include +#include struct lua_State; diff --git a/include/openspace/properties/propertyowner.h b/include/openspace/properties/propertyowner.h index 251cd7c062..c965cd3fb1 100644 --- a/include/openspace/properties/propertyowner.h +++ b/include/openspace/properties/propertyowner.h @@ -27,6 +27,7 @@ #include #include +#include #include namespace openspace::properties { diff --git a/include/openspace/properties/scalar/boolproperty.h b/include/openspace/properties/scalar/boolproperty.h index cf3d364e26..54039ffdce 100644 --- a/include/openspace/properties/scalar/boolproperty.h +++ b/include/openspace/properties/scalar/boolproperty.h @@ -35,7 +35,7 @@ namespace openspace::properties { */ class BoolProperty : public TemplateProperty { public: - BoolProperty(Property::PropertyInfo info, bool value = false); + explicit BoolProperty(Property::PropertyInfo info, bool value = false); std::string_view className() const override final; ghoul::lua::LuaTypes typeLua() const override final; diff --git a/include/openspace/properties/scalar/doubleproperty.h b/include/openspace/properties/scalar/doubleproperty.h index b1e1f682fd..2db5ed3eaf 100644 --- a/include/openspace/properties/scalar/doubleproperty.h +++ b/include/openspace/properties/scalar/doubleproperty.h @@ -26,6 +26,7 @@ #define __OPENSPACE_CORE___DOUBLEPROPERTY___H__ #include + #include namespace openspace::properties { @@ -36,7 +37,7 @@ namespace openspace::properties { */ class DoubleProperty : public NumericalProperty { public: - DoubleProperty(Property::PropertyInfo info, double value = 0.0, + explicit DoubleProperty(Property::PropertyInfo info, double value = 0.0, double minValue = std::numeric_limits::lowest(), double maxValue = std::numeric_limits::max(), double stepValue = 0.01); diff --git a/include/openspace/properties/scalar/floatproperty.h b/include/openspace/properties/scalar/floatproperty.h index 074dc44b11..851953b6d3 100644 --- a/include/openspace/properties/scalar/floatproperty.h +++ b/include/openspace/properties/scalar/floatproperty.h @@ -26,6 +26,7 @@ #define __OPENSPACE_CORE___FLOATPROPERTY___H__ #include + #include namespace openspace::properties { @@ -36,7 +37,7 @@ namespace openspace::properties { */ class FloatProperty : public NumericalProperty { public: - FloatProperty(Property::PropertyInfo info, float value = 0.f, + explicit FloatProperty(Property::PropertyInfo info, float value = 0.f, float minValue = std::numeric_limits::lowest(), float maxValue = std::numeric_limits::max(), float stepValue = 0.01f); diff --git a/include/openspace/properties/scalar/intproperty.h b/include/openspace/properties/scalar/intproperty.h index 9872c0c223..a3dc40f75c 100644 --- a/include/openspace/properties/scalar/intproperty.h +++ b/include/openspace/properties/scalar/intproperty.h @@ -26,6 +26,7 @@ #define __OPENSPACE_CORE___INTPROPERTY___H__ #include + #include namespace openspace::properties { diff --git a/include/openspace/properties/scalar/longproperty.h b/include/openspace/properties/scalar/longproperty.h index e5f78d3fdf..c66206eb5d 100644 --- a/include/openspace/properties/scalar/longproperty.h +++ b/include/openspace/properties/scalar/longproperty.h @@ -26,6 +26,7 @@ #define __OPENSPACE_CORE___LONGPROPERTY___H__ #include + #include namespace openspace::properties { @@ -36,7 +37,7 @@ namespace openspace::properties { */ class LongProperty : public NumericalProperty { public: - LongProperty(Property::PropertyInfo info, long value = long(0), + explicit LongProperty(Property::PropertyInfo info, long value = long(0), long minValue = std::numeric_limits::lowest(), long maxValue = std::numeric_limits::max(), long stepValue = long(1)); diff --git a/include/openspace/properties/scalar/shortproperty.h b/include/openspace/properties/scalar/shortproperty.h index 044fb95b8d..8515b92614 100644 --- a/include/openspace/properties/scalar/shortproperty.h +++ b/include/openspace/properties/scalar/shortproperty.h @@ -26,6 +26,7 @@ #define __OPENSPACE_CORE___SHORTPROPERTY___H__ #include + #include namespace openspace::properties { @@ -36,7 +37,7 @@ namespace openspace::properties { */ class ShortProperty : public NumericalProperty { public: - ShortProperty(Property::PropertyInfo info, short value = short(0), + explicit ShortProperty(Property::PropertyInfo info, short value = short(0), short minValue = std::numeric_limits::lowest(), short maxValue = std::numeric_limits::max(), short stepValue = short(1)); diff --git a/include/openspace/properties/scalar/uintproperty.h b/include/openspace/properties/scalar/uintproperty.h index 9ad692a75c..f0dce518ee 100644 --- a/include/openspace/properties/scalar/uintproperty.h +++ b/include/openspace/properties/scalar/uintproperty.h @@ -26,6 +26,7 @@ #define __OPENSPACE_CORE___UINTPROPERTY___H__ #include + #include namespace openspace::properties { @@ -36,7 +37,7 @@ namespace openspace::properties { */ class UIntProperty : public NumericalProperty { public: - UIntProperty(Property::PropertyInfo info, unsigned int value = 0, + explicit UIntProperty(Property::PropertyInfo info, unsigned int value = 0, unsigned int minValue = std::numeric_limits::lowest(), unsigned int maxValue = std::numeric_limits::max(), unsigned int stepValue = 1); diff --git a/include/openspace/properties/scalar/ulongproperty.h b/include/openspace/properties/scalar/ulongproperty.h index 64c7464438..8e6d0757df 100644 --- a/include/openspace/properties/scalar/ulongproperty.h +++ b/include/openspace/properties/scalar/ulongproperty.h @@ -26,6 +26,7 @@ #define __OPENSPACE_CORE___ULONGPROPERTY___H__ #include + #include namespace openspace::properties { @@ -36,7 +37,7 @@ namespace openspace::properties { */ class ULongProperty : public NumericalProperty { public: - ULongProperty(Property::PropertyInfo info, unsigned long value = 0ul, + explicit ULongProperty(Property::PropertyInfo info, unsigned long value = 0ul, unsigned long minValue = std::numeric_limits::lowest(), unsigned long maxValue = std::numeric_limits::max(), unsigned long stepValue = 1ul); diff --git a/include/openspace/properties/scalar/ushortproperty.h b/include/openspace/properties/scalar/ushortproperty.h index 175b6c721f..921a4e17cb 100644 --- a/include/openspace/properties/scalar/ushortproperty.h +++ b/include/openspace/properties/scalar/ushortproperty.h @@ -26,6 +26,7 @@ #define __OPENSPACE_CORE___USHORTPROPERTY___H__ #include + #include namespace openspace::properties { @@ -36,7 +37,7 @@ namespace openspace::properties { */ class UShortProperty : public NumericalProperty { public: - UShortProperty(Property::PropertyInfo info, unsigned short value = 0, + explicit UShortProperty(Property::PropertyInfo info, unsigned short value = 0, unsigned short minValue = std::numeric_limits::lowest(), unsigned short maxValue = std::numeric_limits::max(), unsigned short stepValue = 1); diff --git a/include/openspace/properties/vector/dvec2property.h b/include/openspace/properties/vector/dvec2property.h index 61dd0a8562..bc6b982454 100644 --- a/include/openspace/properties/vector/dvec2property.h +++ b/include/openspace/properties/vector/dvec2property.h @@ -34,7 +34,8 @@ namespace openspace::properties { class DVec2Property : public NumericalProperty { public: - DVec2Property(Property::PropertyInfo info, glm::dvec2 value = glm::dvec2(0.0), + explicit DVec2Property(Property::PropertyInfo info, + glm::dvec2 value = glm::dvec2(0.0), glm::dvec2 minValue = glm::dvec2(std::numeric_limits::lowest()), glm::dvec2 maxValue = glm::dvec2(std::numeric_limits::max()), glm::dvec2 stepValue = glm::dvec2(0.01)); diff --git a/include/openspace/properties/vector/dvec3property.h b/include/openspace/properties/vector/dvec3property.h index f78c8a3be2..2f6e222746 100644 --- a/include/openspace/properties/vector/dvec3property.h +++ b/include/openspace/properties/vector/dvec3property.h @@ -34,7 +34,8 @@ namespace openspace::properties { class DVec3Property : public NumericalProperty { public: - DVec3Property(Property::PropertyInfo info, glm::dvec3 value = glm::dvec3(0.0), + explicit DVec3Property(Property::PropertyInfo info, + glm::dvec3 value = glm::dvec3(0.0), glm::dvec3 minValue = glm::dvec3(std::numeric_limits::lowest()), glm::dvec3 maxValue = glm::dvec3(std::numeric_limits::max()), glm::dvec3 stepValue = glm::dvec3(0.01)); diff --git a/include/openspace/properties/vector/dvec4property.h b/include/openspace/properties/vector/dvec4property.h index 63c3836fb0..1c999ac62c 100644 --- a/include/openspace/properties/vector/dvec4property.h +++ b/include/openspace/properties/vector/dvec4property.h @@ -34,7 +34,8 @@ namespace openspace::properties { class DVec4Property : public NumericalProperty { public: - DVec4Property(Property::PropertyInfo info, glm::dvec4 value = glm::dvec4(0.0), + explicit DVec4Property(Property::PropertyInfo info, + glm::dvec4 value = glm::dvec4(0.0), glm::dvec4 minValue = glm::dvec4(std::numeric_limits::lowest()), glm::dvec4 maxValue = glm::dvec4(std::numeric_limits::max()), glm::dvec4 stepValue = glm::dvec4(0.01)); diff --git a/include/openspace/properties/vector/ivec2property.h b/include/openspace/properties/vector/ivec2property.h index 49517b1b8f..ba6473df78 100644 --- a/include/openspace/properties/vector/ivec2property.h +++ b/include/openspace/properties/vector/ivec2property.h @@ -34,7 +34,7 @@ namespace openspace::properties { class IVec2Property : public NumericalProperty { public: - IVec2Property(Property::PropertyInfo info, glm::ivec2 value = glm::ivec2(0), + explicit IVec2Property(Property::PropertyInfo info, glm::ivec2 value = glm::ivec2(0), glm::ivec2 minValue = glm::ivec2(std::numeric_limits::lowest()), glm::ivec2 maxValue = glm::ivec2(std::numeric_limits::max()), glm::ivec2 stepValue = glm::ivec2(1)); diff --git a/include/openspace/properties/vector/ivec3property.h b/include/openspace/properties/vector/ivec3property.h index 9126a24b79..a8b6db456b 100644 --- a/include/openspace/properties/vector/ivec3property.h +++ b/include/openspace/properties/vector/ivec3property.h @@ -34,7 +34,7 @@ namespace openspace::properties { class IVec3Property : public NumericalProperty { public: - IVec3Property(Property::PropertyInfo info, glm::ivec3 value = glm::ivec3(0), + explicit IVec3Property(Property::PropertyInfo info, glm::ivec3 value = glm::ivec3(0), glm::ivec3 minValue = glm::ivec3(std::numeric_limits::lowest()), glm::ivec3 maxValue = glm::ivec3(std::numeric_limits::max()), glm::ivec3 stepValue = glm::ivec3(1)); diff --git a/include/openspace/properties/vector/ivec4property.h b/include/openspace/properties/vector/ivec4property.h index 3c54337213..cb90554fc9 100644 --- a/include/openspace/properties/vector/ivec4property.h +++ b/include/openspace/properties/vector/ivec4property.h @@ -34,7 +34,7 @@ namespace openspace::properties { class IVec4Property : public NumericalProperty { public: - IVec4Property(Property::PropertyInfo info, glm::ivec4 value = glm::ivec4(0), + explicit IVec4Property(Property::PropertyInfo info, glm::ivec4 value = glm::ivec4(0), glm::ivec4 minValue = glm::ivec4(std::numeric_limits::lowest()), glm::ivec4 maxValue = glm::ivec4(std::numeric_limits::max()), glm::ivec4 stepValue = glm::ivec4(1)); diff --git a/include/openspace/properties/vector/uvec2property.h b/include/openspace/properties/vector/uvec2property.h index c5bb2d8676..0b76a83fca 100644 --- a/include/openspace/properties/vector/uvec2property.h +++ b/include/openspace/properties/vector/uvec2property.h @@ -34,7 +34,7 @@ namespace openspace::properties { class UVec2Property : public NumericalProperty { public: - UVec2Property(Property::PropertyInfo info, glm::uvec2 value = glm::uvec2(0), + explicit UVec2Property(Property::PropertyInfo info, glm::uvec2 value = glm::uvec2(0), glm::uvec2 minValue = glm::uvec2(std::numeric_limits::lowest()), glm::uvec2 maxValue = glm::uvec2(std::numeric_limits::max()), glm::uvec2 stepValue = glm::uvec2(1)); diff --git a/include/openspace/properties/vector/uvec3property.h b/include/openspace/properties/vector/uvec3property.h index 92dcbc5d70..d190436f23 100644 --- a/include/openspace/properties/vector/uvec3property.h +++ b/include/openspace/properties/vector/uvec3property.h @@ -34,7 +34,7 @@ namespace openspace::properties { class UVec3Property : public NumericalProperty { public: - UVec3Property(Property::PropertyInfo info, glm::uvec3 value = glm::uvec3(0), + explicit UVec3Property(Property::PropertyInfo info, glm::uvec3 value = glm::uvec3(0), glm::uvec3 minValue = glm::uvec3(std::numeric_limits::lowest()), glm::uvec3 maxValue = glm::uvec3(std::numeric_limits::max()), glm::uvec3 stepValue = glm::uvec3(1)); diff --git a/include/openspace/properties/vector/uvec4property.h b/include/openspace/properties/vector/uvec4property.h index 9e5a4dd89d..72bd965a45 100644 --- a/include/openspace/properties/vector/uvec4property.h +++ b/include/openspace/properties/vector/uvec4property.h @@ -34,7 +34,7 @@ namespace openspace::properties { class UVec4Property : public NumericalProperty { public: - UVec4Property(Property::PropertyInfo info, glm::uvec4 value = glm::uvec4(0), + explicit UVec4Property(Property::PropertyInfo info, glm::uvec4 value = glm::uvec4(0), glm::uvec4 minValue = glm::uvec4(std::numeric_limits::lowest()), glm::uvec4 maxValue = glm::uvec4(std::numeric_limits::max()), glm::uvec4 stepValue = glm::uvec4(1)); diff --git a/include/openspace/properties/vector/vec2property.h b/include/openspace/properties/vector/vec2property.h index fedecf1dda..c5334176ae 100644 --- a/include/openspace/properties/vector/vec2property.h +++ b/include/openspace/properties/vector/vec2property.h @@ -34,7 +34,7 @@ namespace openspace::properties { class Vec2Property : public NumericalProperty { public: - Vec2Property(Property::PropertyInfo info, glm::vec2 value = glm::vec2(0.f), + explicit Vec2Property(Property::PropertyInfo info, glm::vec2 value = glm::vec2(0.f), glm::vec2 minValue = glm::vec2(std::numeric_limits::lowest()), glm::vec2 maxValue = glm::vec2(std::numeric_limits::max()), glm::vec2 stepValue = glm::vec2(0.01f)); diff --git a/include/openspace/properties/vector/vec3property.h b/include/openspace/properties/vector/vec3property.h index 2a90a724e9..f5226956e1 100644 --- a/include/openspace/properties/vector/vec3property.h +++ b/include/openspace/properties/vector/vec3property.h @@ -34,7 +34,7 @@ namespace openspace::properties { class Vec3Property : public NumericalProperty { public: - Vec3Property(Property::PropertyInfo info, glm::vec3 value = glm::vec3(0.f), + explicit Vec3Property(Property::PropertyInfo info, glm::vec3 value = glm::vec3(0.f), glm::vec3 minValue = glm::vec3(std::numeric_limits::lowest()), glm::vec3 maxValue = glm::vec3(std::numeric_limits::max()), glm::vec3 stepValue = glm::vec3(0.01f)); diff --git a/include/openspace/properties/vector/vec4property.h b/include/openspace/properties/vector/vec4property.h index 4179867b4b..4cad546ee5 100644 --- a/include/openspace/properties/vector/vec4property.h +++ b/include/openspace/properties/vector/vec4property.h @@ -34,7 +34,7 @@ namespace openspace::properties { class Vec4Property : public NumericalProperty { public: - Vec4Property(Property::PropertyInfo info, glm::vec4 value = glm::vec4(0.f), + explicit Vec4Property(Property::PropertyInfo info, glm::vec4 value = glm::vec4(0.f), glm::vec4 minValue = glm::vec4(std::numeric_limits::lowest()), glm::vec4 maxValue = glm::vec4(std::numeric_limits::max()), glm::vec4 stepValue = glm::vec4(0.01f)); diff --git a/include/openspace/query/query.h b/include/openspace/query/query.h index f16c10b996..29e41f2623 100644 --- a/include/openspace/query/query.h +++ b/include/openspace/query/query.h @@ -30,12 +30,14 @@ namespace openspace { -namespace properties { class Property; } - +namespace properties { + class Property; + class PropertyOwner; +} // namespace properties +class IswaGroup; class Renderable; class Scene; class SceneGraphNode; -class IswaGroup; class ScreenSpaceRenderable; Scene* sceneGraph(); diff --git a/include/openspace/rendering/colormappingcomponent.h b/include/openspace/rendering/colormappingcomponent.h index 456309be56..158d2ceaa8 100644 --- a/include/openspace/rendering/colormappingcomponent.h +++ b/include/openspace/rendering/colormappingcomponent.h @@ -34,7 +34,14 @@ #include #include #include +#include #include +#include +#include +#include +#include + +namespace ghoul { class Dictionary; } namespace openspace { diff --git a/include/openspace/rendering/dashboard.h b/include/openspace/rendering/dashboard.h index ed30d0a4ec..ccfcf893ab 100644 --- a/include/openspace/rendering/dashboard.h +++ b/include/openspace/rendering/dashboard.h @@ -32,7 +32,9 @@ #include #include #include +#include #include +#include #include namespace openspace { diff --git a/include/openspace/rendering/dashboarditem.h b/include/openspace/rendering/dashboarditem.h index a2024e26e8..2854909256 100644 --- a/include/openspace/rendering/dashboarditem.h +++ b/include/openspace/rendering/dashboarditem.h @@ -29,6 +29,7 @@ #include #include +#include namespace ghoul { class Dictionary; } diff --git a/include/openspace/rendering/dashboardtextitem.h b/include/openspace/rendering/dashboardtextitem.h index f5b10b0dd7..a748d5b30a 100644 --- a/include/openspace/rendering/dashboardtextitem.h +++ b/include/openspace/rendering/dashboardtextitem.h @@ -30,13 +30,10 @@ #include #include -namespace ghoul { class Dictionary; } namespace ghoul::fontrendering { class Font; } namespace openspace { -namespace documentation { struct Documentation; } - class DashboardTextItem : public DashboardItem { public: explicit DashboardTextItem(const ghoul::Dictionary& dictionary); diff --git a/include/openspace/rendering/deferredcaster.h b/include/openspace/rendering/deferredcaster.h index 7705f43643..e5c9c3520f 100644 --- a/include/openspace/rendering/deferredcaster.h +++ b/include/openspace/rendering/deferredcaster.h @@ -26,7 +26,6 @@ #define __OPENSPACE_CORE___DEFERREDCASTER___H #include -#include namespace ghoul::opengl { class Texture; @@ -35,21 +34,21 @@ namespace ghoul::opengl { namespace openspace { -struct RenderData; struct DeferredcastData; +struct RenderData; struct UpdateData; class Deferredcaster { public: virtual ~Deferredcaster() = default; - virtual void preRaycast(const RenderData& /*renderData*/, - const DeferredcastData& /*deferredData*/, - ghoul::opengl::ProgramObject& /*program*/) {} + virtual void preRaycast(const RenderData& renderData, + const DeferredcastData& deferredData, + ghoul::opengl::ProgramObject& program); - virtual void postRaycast(const RenderData& /*renderData*/, - const DeferredcastData& /*deferredData*/, - ghoul::opengl::ProgramObject& /*program*/) {} + virtual void postRaycast(const RenderData& renderData, + const DeferredcastData& deferredData, + ghoul::opengl::ProgramObject& program); virtual std::filesystem::path deferredcastVSPath() const = 0; diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index 8447ed381a..c0da38b6e8 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -36,7 +36,6 @@ namespace ghoul { class Dictionary; } namespace ghoul::filesystem { class File; } - namespace ghoul::opengl { class ProgramObject; class Texture; @@ -186,11 +185,9 @@ private: std::unique_ptr >; - void resolveMSAA(float blackoutFactor); void applyTMO(float blackoutFactor, const glm::ivec4& viewport); void applyFXAA(const glm::ivec4& viewport); void updateDownscaleTextures() const; - void updateExitVolumeTextures(); void writeDownscaledVolume(const glm::ivec4& viewport); std::map _raycastData; diff --git a/include/openspace/rendering/helper.h b/include/openspace/rendering/helper.h index 635b4102fa..44c5f91677 100644 --- a/include/openspace/rendering/helper.h +++ b/include/openspace/rendering/helper.h @@ -25,7 +25,11 @@ #ifndef __OPENSPACE_CORE___HELPER___H__ #define __OPENSPACE_CORE___HELPER___H__ +#include +#include #include +#include +#include namespace ghoul::opengl { class ProgramObject; @@ -39,13 +43,7 @@ namespace openspace { namespace openspace::rendering::helper { -enum class Anchor { - Center, - NW, - NE, - SW, - SE -}; +enum class Anchor { Center, NW, NE, SW, SE }; void initialize(); void deinitialize(); diff --git a/include/openspace/rendering/labelscomponent.h b/include/openspace/rendering/labelscomponent.h index 71dfb8cc14..f63c22ab7d 100644 --- a/include/openspace/rendering/labelscomponent.h +++ b/include/openspace/rendering/labelscomponent.h @@ -36,13 +36,15 @@ #include #include #include +#include +namespace ghoul { class Dictionary; } namespace ghoul::fontrendering { class Font; } namespace openspace { -struct RenderData; namespace documentation { struct Documentation; } +struct RenderData; class LabelsComponent : public properties::PropertyOwner, public Fadeable { public: diff --git a/include/openspace/rendering/loadingscreen.h b/include/openspace/rendering/loadingscreen.h index a291b1ef25..772140785f 100644 --- a/include/openspace/rendering/loadingscreen.h +++ b/include/openspace/rendering/loadingscreen.h @@ -28,14 +28,17 @@ #include #include #include +#include +#include #include #include #include +#include +#include // #define LOADINGSCREEN_DEBUGGING namespace ghoul::fontrendering { class Font; } - namespace ghoul::opengl { class ProgramObject; class Texture; diff --git a/include/openspace/rendering/luaconsole.h b/include/openspace/rendering/luaconsole.h index be1ebeb795..344ca75504 100644 --- a/include/openspace/rendering/luaconsole.h +++ b/include/openspace/rendering/luaconsole.h @@ -32,9 +32,11 @@ #include #include #include +#include #include #include #include +#include #include namespace ghoul::fontrendering { class Font; } diff --git a/include/openspace/rendering/raycastermanager.h b/include/openspace/rendering/raycastermanager.h index 66d9ae913f..8cc338b191 100644 --- a/include/openspace/rendering/raycastermanager.h +++ b/include/openspace/rendering/raycastermanager.h @@ -29,8 +29,8 @@ namespace openspace { -class VolumeRaycaster; class RaycasterListener; +class VolumeRaycaster; class RaycasterManager { public: diff --git a/include/openspace/rendering/renderable.h b/include/openspace/rendering/renderable.h index 5a91fe8948..486be431a4 100644 --- a/include/openspace/rendering/renderable.h +++ b/include/openspace/rendering/renderable.h @@ -32,16 +32,22 @@ #include #include #include +#include +#include #include +#include -namespace ghoul { class Dictionary; } -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl +namespace ghoul { + namespace opengl { + class ProgramObject; + class Texture; + } // namespace opengl + class Dictionary; +} // namespace ghoul namespace openspace { +namespace documentation { struct Documentation; } class Camera; class Ellipsoid; struct RenderData; @@ -49,8 +55,6 @@ struct RendererTasks; struct SurfacePositionHandle; struct UpdateData; -namespace documentation { struct Documentation; } - // Unfortunately we can't move this struct into the Renderable until // https://bugs.llvm.org/show_bug.cgi?id=36684 is fixed struct RenderableSettings { diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index 210ea4f002..00f3d80cfc 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -34,27 +34,30 @@ #include #include #include +#include #include #include +#include +#include +#include +#include namespace ghoul { -namespace fontrendering { class Font; } -namespace opengl { - class ProgramObject; - class OpenGLStateCache; -} // namespace opengl - -class Dictionary; -class SharedMemory; + namespace fontrendering { class Font; } + namespace opengl { + class ProgramObject; + class OpenGLStateCache; + } // namespace opengl + class Dictionary; + class SharedMemory; } // ghoul namespace openspace { namespace scripting { struct LuaLibrary; } - class Camera; -class RaycasterManager; class DeferredcasterManager; +class RaycasterManager; class Scene; class SceneManager; class ScreenLog; diff --git a/include/openspace/rendering/screenspacerenderable.h b/include/openspace/rendering/screenspacerenderable.h index e2bf58921a..adcaa8adbe 100644 --- a/include/openspace/rendering/screenspacerenderable.h +++ b/include/openspace/rendering/screenspacerenderable.h @@ -33,14 +33,17 @@ #include #include #include +#include #include #include +namespace ghoul { class Dictionary; } namespace ghoul::opengl { class ProgramObject; } namespace openspace { namespace documentation { struct Documentation; } +struct RenderData; /** * The base class for screen space images and screen space framebuffers. This base class diff --git a/include/openspace/rendering/screenspacerenderableframebuffer.h b/include/openspace/rendering/screenspacerenderableframebuffer.h index 47ae17fded..813ff3bee1 100644 --- a/include/openspace/rendering/screenspacerenderableframebuffer.h +++ b/include/openspace/rendering/screenspacerenderableframebuffer.h @@ -28,16 +28,12 @@ #include #include - -namespace ghoul::opengl { - class FramebufferObject; - class Texture; -} // namespace ghoul::opengl +#include +#include +#include namespace openspace { -namespace documentation { struct Documentation; } - /** * Creates a texture by rendering to a framebuffer, this is then used on a screen space * plane. This class lets you add renderfunctions that should render to a framebuffer with diff --git a/include/openspace/rendering/screenspacerenderabletext.h b/include/openspace/rendering/screenspacerenderabletext.h index 50f8cc339c..b2666f6cce 100644 --- a/include/openspace/rendering/screenspacerenderabletext.h +++ b/include/openspace/rendering/screenspacerenderabletext.h @@ -29,24 +29,13 @@ #include #include +#include #include - -namespace ghoul { - -class Dictionary; - -namespace fontrendering { class Font; } -namespace opengl { - class FramebufferObject; - class Texture; -} // namespace opengl - -} // namespace ghoul +#include +#include namespace openspace { -namespace documentation { struct Documentation; } - class ScreenSpaceRenderableText : public ScreenSpaceRenderable { public: explicit ScreenSpaceRenderableText(const ghoul::Dictionary& dictionary); diff --git a/include/openspace/rendering/texturecomponent.h b/include/openspace/rendering/texturecomponent.h index 88500194c1..161e3a5751 100644 --- a/include/openspace/rendering/texturecomponent.h +++ b/include/openspace/rendering/texturecomponent.h @@ -27,6 +27,7 @@ #include #include +#include namespace ghoul::filesystem { class File; } namespace ghoul::opengl { class Texture; } diff --git a/include/openspace/rendering/volumeraycaster.h b/include/openspace/rendering/volumeraycaster.h index 135cf488f3..f643cec6cc 100644 --- a/include/openspace/rendering/volumeraycaster.h +++ b/include/openspace/rendering/volumeraycaster.h @@ -35,27 +35,24 @@ namespace ghoul::opengl { namespace openspace { -struct RenderData; struct RaycastData; +struct RenderData; class VolumeRaycaster { public: - /** - * Destructor. - */ virtual ~VolumeRaycaster() = default; /** * Render the volume's entry points (front face of the bounding geometry). */ - virtual void renderEntryPoints(const RenderData& /*data*/, - ghoul::opengl::ProgramObject& /*program*/) = 0; + virtual void renderEntryPoints(const RenderData& data, + ghoul::opengl::ProgramObject& program) = 0; /** * Render the volume's exit points (back face of the bounding geometry). */ - virtual void renderExitPoints(const RenderData& /*data*/, - ghoul::opengl::ProgramObject& /*program*/) = 0; + virtual void renderExitPoints(const RenderData& data, + ghoul::opengl::ProgramObject& program) = 0; /** * Prepare the volume for the ABuffer's resolve step. Make sure textures are up to diff --git a/include/openspace/scene/asset.h b/include/openspace/scene/asset.h index b4f34cfd48..9861311caa 100644 --- a/include/openspace/scene/asset.h +++ b/include/openspace/scene/asset.h @@ -25,13 +25,16 @@ #ifndef __OPENSPACE_CORE___ASSET___H__ #define __OPENSPACE_CORE___ASSET___H__ -#include +#include #include #include +#include +#include namespace openspace { class AssetManager; +class ResourceSynchronization; /** * This class represents a successfully loaded Asset. Each Lua asset file results in diff --git a/include/openspace/scene/assetmanager.h b/include/openspace/scene/assetmanager.h index 45bcf91302..318d5126af 100644 --- a/include/openspace/scene/assetmanager.h +++ b/include/openspace/scene/assetmanager.h @@ -25,16 +25,19 @@ #ifndef __OPENSPACE_CORE___ASSETMANAGER___H__ #define __OPENSPACE_CORE___ASSETMANAGER___H__ -#include #include -#include -#include #include +#include +#include +#include +#include +#include + +namespace ghoul::lua { class LuaState; } namespace openspace { namespace scripting { struct LuaLibrary; } - class Asset; class ResourceSynchronization; diff --git a/include/openspace/scene/lightsource.h b/include/openspace/scene/lightsource.h index 964d6f0f26..d8fd28b3a9 100644 --- a/include/openspace/scene/lightsource.h +++ b/include/openspace/scene/lightsource.h @@ -36,7 +36,6 @@ namespace ghoul { class Dictionary; } namespace openspace { namespace documentation { struct Documentation; } - class SceneGraphNode; struct RenderData; diff --git a/include/openspace/scene/profile.h b/include/openspace/scene/profile.h index e169c1b23c..71de42875f 100644 --- a/include/openspace/scene/profile.h +++ b/include/openspace/scene/profile.h @@ -25,19 +25,21 @@ #ifndef __OPENSPACE_CORE___PROFILE___H__ #define __OPENSPACE_CORE___PROFILE___H__ -#include #include #include #include +#include #include #include +#include #include #include +#include namespace openspace { namespace interaction { struct NavigationState; } - +namespace properties { class PropertyOwner; } namespace scripting { struct LuaLibrary; } class Profile { diff --git a/include/openspace/scene/rotation.h b/include/openspace/scene/rotation.h index 7db4d7ea9c..f7b81f9f30 100644 --- a/include/openspace/scene/rotation.h +++ b/include/openspace/scene/rotation.h @@ -30,14 +30,14 @@ #include #include #include +#include namespace ghoul { class Dictionary; } namespace openspace { -struct UpdateData; - namespace documentation { struct Documentation; } +struct UpdateData; /** * This class represents a configurable rotation which may or may not be time-dependent. @@ -60,7 +60,6 @@ public: static ghoul::mm_unique_ptr createFromDictionary( const ghoul::Dictionary& dictionary); - explicit Rotation(const ghoul::Dictionary& dictionary); virtual ~Rotation() override = default; diff --git a/include/openspace/scene/scale.h b/include/openspace/scene/scale.h index 188a18e6f4..30cd000d6a 100644 --- a/include/openspace/scene/scale.h +++ b/include/openspace/scene/scale.h @@ -30,14 +30,14 @@ #include #include #include +#include namespace ghoul { class Dictionary; } namespace openspace { -struct UpdateData; - namespace documentation { struct Documentation; } +struct UpdateData; class Scale : public properties::PropertyOwner { public: diff --git a/include/openspace/scene/scene.h b/include/openspace/scene/scene.h index 9a052ae3a8..9663634fe6 100644 --- a/include/openspace/scene/scene.h +++ b/include/openspace/scene/scene.h @@ -28,25 +28,35 @@ #include #include +#include #include +#include #include +#include +#include +#include #include #include +#include +#include #include #include -namespace ghoul { - -class Dictionary; -namespace lua { class LuaState; } -namespace opengl { class ProgramObject; } - -} // namespace ghoul +namespace ghoul { class Dictionary; } +namespace ghoul::lua { class LuaState; } +namespace ghoul::opengl { class ProgramObject; } namespace openspace { namespace documentation { struct Documentation; } +namespace properties { class Property; } namespace scripting { struct LuaLibrary; } +class Camera; +class Profile; +struct RenderData; +struct RendererTasks; +class SceneInitializer; +struct UpdateData; enum class PropertyValueType { Boolean = 0, @@ -56,9 +66,6 @@ enum class PropertyValueType { Nil }; -class Profile; -class SceneInitializer; - // Notifications: // SceneGraphFinishedLoading class Scene : public properties::PropertyOwner { diff --git a/include/openspace/scene/scenegraphnode.h b/include/openspace/scene/scenegraphnode.h index 1be70e9852..17458d645d 100644 --- a/include/openspace/scene/scenegraphnode.h +++ b/include/openspace/scene/scenegraphnode.h @@ -40,6 +40,8 @@ #include #include #include +#include +#include #include // #define Debugging_Core_SceneGraphNode_Indices @@ -49,20 +51,19 @@ namespace ghoul::opengl { class ProgramObject; } namespace openspace { +namespace documentation { struct Documentation; } class Camera; -struct RenderData; class Renderable; +struct RenderData; struct RendererTasks; class Rotation; -class Translation; class Scale; class Scene; -struct UpdateData; struct SurfacePositionHandle; -class TimeFrame; class Time; - -namespace documentation { struct Documentation; } +class TimeFrame; +class Translation; +struct UpdateData; class SceneGraphNode : public properties::PropertyOwner { public: diff --git a/include/openspace/scene/sceneinitializer.h b/include/openspace/scene/sceneinitializer.h index c1014a311c..aeb33a8311 100644 --- a/include/openspace/scene/sceneinitializer.h +++ b/include/openspace/scene/sceneinitializer.h @@ -27,6 +27,7 @@ #include #include +#include #include namespace openspace { @@ -41,7 +42,7 @@ class SceneGraphNode; */ class SceneInitializer { public: - SceneInitializer(unsigned int nThreads = 0); + explicit SceneInitializer(unsigned int nThreads = 0); void initializeNode(SceneGraphNode* node); std::vector takeInitializedNodes(); diff --git a/include/openspace/scene/timeframe.h b/include/openspace/scene/timeframe.h index adcd0ec836..87eb4dbfa4 100644 --- a/include/openspace/scene/timeframe.h +++ b/include/openspace/scene/timeframe.h @@ -27,17 +27,15 @@ #include -#include -#include +#include #include namespace ghoul { class Dictionary; } namespace openspace { -class Time; - namespace documentation { struct Documentation; } +class Time; class TimeFrame : public properties::PropertyOwner { public: diff --git a/include/openspace/scene/translation.h b/include/openspace/scene/translation.h index 9096e9a1af..de4e2f52be 100644 --- a/include/openspace/scene/translation.h +++ b/include/openspace/scene/translation.h @@ -31,15 +31,15 @@ #include #include #include +#include namespace ghoul { class Dictionary; } namespace openspace { +namespace documentation { struct Documentation; } struct UpdateData; -namespace documentation { struct Documentation; } - class Translation : public properties::PropertyOwner { public: static ghoul::mm_unique_ptr createFromDictionary( diff --git a/include/openspace/scripting/lualibrary.h b/include/openspace/scripting/lualibrary.h index 716dfad495..0a6caab48e 100644 --- a/include/openspace/scripting/lualibrary.h +++ b/include/openspace/scripting/lualibrary.h @@ -26,6 +26,7 @@ #define __OPENSPACE_CORE___LUALIBRARY___H__ #include +#include #include #include @@ -44,7 +45,7 @@ struct LuaLibrary { * the function. */ struct Function { - using lua_CFunction =int(*)(lua_State* L); + using lua_CFunction = int(*)(lua_State* L); /// The name of the function std::string name; diff --git a/include/openspace/scripting/scriptengine.h b/include/openspace/scripting/scriptengine.h index 16c8d6642d..e0e09480ae 100644 --- a/include/openspace/scripting/scriptengine.h +++ b/include/openspace/scripting/scriptengine.h @@ -30,11 +30,16 @@ #include #include #include +#include #include #include -#include +#include +#include +#include +namespace ghoul { class Dictionary; } namespace openspace { class SyncBuffer; } +struct lua_State; namespace openspace::scripting { diff --git a/include/openspace/scripting/scriptscheduler.h b/include/openspace/scripting/scriptscheduler.h index 68189c7952..72c45827fa 100644 --- a/include/openspace/scripting/scriptscheduler.h +++ b/include/openspace/scripting/scriptscheduler.h @@ -27,13 +27,9 @@ #include -#include #include -#include - -#include +#include #include -#include #include #include diff --git a/include/openspace/util/coordinateconversion.h b/include/openspace/util/coordinateconversion.h index 42b557dbee..3b04d9ad7c 100644 --- a/include/openspace/util/coordinateconversion.h +++ b/include/openspace/util/coordinateconversion.h @@ -27,6 +27,7 @@ #include #include +#include namespace openspace { diff --git a/include/openspace/util/distanceconstants.h b/include/openspace/util/distanceconstants.h index 332b69a03b..294f2d4b97 100644 --- a/include/openspace/util/distanceconstants.h +++ b/include/openspace/util/distanceconstants.h @@ -26,23 +26,25 @@ #define __OPENSPACE_CORE___DISTANCECONSTANTS___H__ namespace openspace::distanceconstants { - constexpr double EarthRadius = 6371E3; - constexpr double JupiterRadius = 7.1492E7; - constexpr double SolarRadius = 6.95700E8; - constexpr double LightYear = 9.4607304725808E15; - constexpr double LightMonth = LightYear / 12; - constexpr double LightDay = LightYear / 365; - constexpr double LightHour = LightDay / 24; - constexpr double LightSecond = 299792458.0; - constexpr double AstronomicalUnit = 1.495978707E11; - constexpr double Parsec = 3.0856776E16; - constexpr double Inch = 0.0254; - constexpr double Foot = 0.3048; - constexpr double Yard = 0.9144; - constexpr double Chain = 20.1168; - constexpr double Mile = 1609.344; - constexpr double NauticalMile = 1852.0; +constexpr double EarthRadius = 6371E3; +constexpr double JupiterRadius = 7.1492E7; +constexpr double SolarRadius = 6.95700E8; +constexpr double LightYear = 9.4607304725808E15; +constexpr double LightMonth = LightYear / 12; +constexpr double LightDay = LightYear / 365; +constexpr double LightHour = LightDay / 24; +constexpr double LightSecond = 299792458.0; +constexpr double AstronomicalUnit = 1.495978707E11; +constexpr double Parsec = 3.0856776E16; + +constexpr double Inch = 0.0254; +constexpr double Foot = 0.3048; +constexpr double Yard = 0.9144; +constexpr double Chain = 20.1168; +constexpr double Mile = 1609.344; +constexpr double NauticalMile = 1852.0; + } // openspace::distanceconstants #endif // __OPENSPACE_CORE___DISTANCECONSTANTS___H__ diff --git a/include/openspace/util/distanceconversion.h b/include/openspace/util/distanceconversion.h index 063c3f0853..1f4e3691cd 100644 --- a/include/openspace/util/distanceconversion.h +++ b/include/openspace/util/distanceconversion.h @@ -26,12 +26,13 @@ #define __OPENSPACE_CORE___DISTANCECONVERSION___H__ #include - #include #include #include #include +#include #include +#include namespace openspace { diff --git a/include/openspace/util/downloadeventengine.h b/include/openspace/util/downloadeventengine.h index fcb8343ace..ec3f77cc5f 100644 --- a/include/openspace/util/downloadeventengine.h +++ b/include/openspace/util/downloadeventengine.h @@ -25,11 +25,12 @@ #ifndef __OPENSPACE_CORE___DOWNLOAD_EVENT_ENGINE___H__ #define __OPENSPACE_CORE___DOWNLOAD_EVENT_ENGINE___H__ +#include #include -#include #include #include #include +#include namespace openspace { diff --git a/include/openspace/util/dynamicfilesequencedownloader.h b/include/openspace/util/dynamicfilesequencedownloader.h index a9d13028f2..b113275e65 100644 --- a/include/openspace/util/dynamicfilesequencedownloader.h +++ b/include/openspace/util/dynamicfilesequencedownloader.h @@ -56,7 +56,7 @@ public: DynamicFileSequenceDownloader(int dataID, const std::string& identifier, std::string infoUrl, std::string dataUrl, size_t nFilesToQueue); - void deinitialize(bool cacheFiles); + void deinitialize(bool cacheFiles) const; void requestDataInfo(std::string httpInfoRequest); void requestAvailableFiles(std::string httpDataRequest, std::filesystem::path syncDir); diff --git a/include/openspace/util/ellipsoid.h b/include/openspace/util/ellipsoid.h index 5ab77df487..a6064c61e9 100644 --- a/include/openspace/util/ellipsoid.h +++ b/include/openspace/util/ellipsoid.h @@ -26,6 +26,7 @@ #define __OPENSPACE_CORE___ELLIPSOID___H__ #include +#include #include namespace openspace { diff --git a/include/openspace/util/factorymanager.h b/include/openspace/util/factorymanager.h index 71a97266ff..e31ae1e310 100644 --- a/include/openspace/util/factorymanager.h +++ b/include/openspace/util/factorymanager.h @@ -28,6 +28,8 @@ #include #include #include +#include +#include namespace openspace { diff --git a/include/openspace/util/factorymanager.inl b/include/openspace/util/factorymanager.inl index 7c52b7255e..b4ab1764a2 100644 --- a/include/openspace/util/factorymanager.inl +++ b/include/openspace/util/factorymanager.inl @@ -23,6 +23,7 @@ ****************************************************************************************/ #include +#include namespace openspace { diff --git a/include/openspace/util/histogram.h b/include/openspace/util/histogram.h index b473526b4c..01cc1c2a80 100644 --- a/include/openspace/util/histogram.h +++ b/include/openspace/util/histogram.h @@ -25,6 +25,7 @@ #ifndef __OPENSPACE_CORE___HISTOGRAM___H__ #define __OPENSPACE_CORE___HISTOGRAM___H__ +#include #include namespace openspace { @@ -58,7 +59,7 @@ public: float interpolate(float bin) const; float sample(int binIndex) const; const float* data() const; - std::vector> getDecimated(int numBins) const; + std::vector> getDecimated(int numBins) const; void normalize(); void print() const; diff --git a/include/openspace/util/httprequest.h b/include/openspace/util/httprequest.h index 2dde039fde..b9f0d81ff1 100644 --- a/include/openspace/util/httprequest.h +++ b/include/openspace/util/httprequest.h @@ -25,18 +25,19 @@ #ifndef __OPENSPACE_CORE___HTTPREQUEST___H__ #define __OPENSPACE_CORE___HTTPREQUEST___H__ -#include +#include #include #include +#include #include #include #include #include +#include #include #include #include #include -#include namespace openspace { diff --git a/include/openspace/util/json_helper.h b/include/openspace/util/json_helper.h index 9d64113c8c..ef291e3c62 100644 --- a/include/openspace/util/json_helper.h +++ b/include/openspace/util/json_helper.h @@ -26,10 +26,11 @@ #define __OPENSPACE_CORE___JSON_HELPER___H__ #include -#include #include #include +namespace ghoul { class Dictionary; } + namespace openspace { /** diff --git a/include/openspace/util/keys.h b/include/openspace/util/keys.h index 27e34ea2bd..83e43e09ea 100644 --- a/include/openspace/util/keys.h +++ b/include/openspace/util/keys.h @@ -61,6 +61,8 @@ #include #include #include +#include +#include namespace openspace { diff --git a/include/openspace/util/openspacemodule.h b/include/openspace/util/openspacemodule.h index 4ff6d55c43..548941283a 100644 --- a/include/openspace/util/openspacemodule.h +++ b/include/openspace/util/openspacemodule.h @@ -28,16 +28,13 @@ #include #include -#include -#include namespace ghoul { class Dictionary; } namespace openspace { -namespace documentation { struct Documentation; } +namespace documentation { struct Documentation; } namespace scripting { struct LuaLibrary; } - class ModuleEngine; /** diff --git a/include/openspace/util/resourcesynchronization.h b/include/openspace/util/resourcesynchronization.h index e19c528c7c..0b7ed964b6 100644 --- a/include/openspace/util/resourcesynchronization.h +++ b/include/openspace/util/resourcesynchronization.h @@ -27,6 +27,7 @@ #include #include +#include #include namespace ghoul { class Dictionary; } diff --git a/include/openspace/util/syncable.h b/include/openspace/util/syncable.h index 584e74bf6d..e4303b9769 100644 --- a/include/openspace/util/syncable.h +++ b/include/openspace/util/syncable.h @@ -41,10 +41,10 @@ protected: // from the used of implementations of the interface friend class SyncEngine; - virtual void preSync(bool /*isMaster*/) {} - virtual void encode(SyncBuffer* /*syncBuffer*/) = 0; - virtual void decode(SyncBuffer* /*syncBuffer*/) = 0; - virtual void postSync(bool /*isMaster*/) {} + virtual void preSync(bool isMaster); + virtual void encode(SyncBuffer* syncBuffer) = 0; + virtual void decode(SyncBuffer* syncBuffer) = 0; + virtual void postSync(bool isMaster); }; } // namespace openspace diff --git a/include/openspace/util/syncbuffer.h b/include/openspace/util/syncbuffer.h index 4408cf6781..cfd072d84f 100644 --- a/include/openspace/util/syncbuffer.h +++ b/include/openspace/util/syncbuffer.h @@ -26,6 +26,7 @@ #define __OPENSPACE_CORE___SYNCBUFFER___H__ #include +#include #include #include diff --git a/include/openspace/util/task.h b/include/openspace/util/task.h index eb3904047d..48d83faf70 100644 --- a/include/openspace/util/task.h +++ b/include/openspace/util/task.h @@ -27,6 +27,7 @@ #include #include +#include namespace ghoul { class Dictionary; } @@ -38,14 +39,14 @@ class Task { public: using ProgressCallback = std::function; - virtual ~Task() = default; - virtual void perform(const ProgressCallback& onProgress) = 0; - virtual std::string description() = 0; - static std::unique_ptr createFromDictionary( const ghoul::Dictionary& dictionary ); + virtual ~Task() = default; + virtual void perform(const ProgressCallback& onProgress) = 0; + virtual std::string description() = 0; + static documentation::Documentation documentation(); }; diff --git a/include/openspace/util/threadpool.h b/include/openspace/util/threadpool.h index 89b5a06567..10f2c20d39 100644 --- a/include/openspace/util/threadpool.h +++ b/include/openspace/util/threadpool.h @@ -44,7 +44,7 @@ public: void operator()(); private: - ThreadPool& pool; + ThreadPool& _pool; }; class ThreadPool { @@ -61,14 +61,14 @@ public: private: friend class Worker; - std::vector workers; + std::vector _workers; - std::deque> tasks; + std::deque> _tasks; - std::mutex queue_mutex; - std::condition_variable condition; + std::mutex _queueMutex; + std::condition_variable _condition; - bool stop; + bool _shouldStop = false; }; } // namespace openspace diff --git a/include/openspace/util/timeconversion.h b/include/openspace/util/timeconversion.h index 5b71a3e1a1..ba039dc56e 100644 --- a/include/openspace/util/timeconversion.h +++ b/include/openspace/util/timeconversion.h @@ -31,6 +31,9 @@ #include #include #include +#include +#include +#include namespace openspace { diff --git a/include/openspace/util/touch.h b/include/openspace/util/touch.h index 5ee1a84785..047c394163 100644 --- a/include/openspace/util/touch.h +++ b/include/openspace/util/touch.h @@ -25,8 +25,7 @@ #ifndef __OPENSPACE_CORE___TOUCH___H__ #define __OPENSPACE_CORE___TOUCH___H__ -#include - +#include #include namespace openspace { @@ -38,6 +37,7 @@ namespace openspace { */ struct TouchInput { TouchInput(size_t touchDeviceId, size_t fingerId, float x, float y, double timestamp); + glm::vec2 screenCoordinates(const glm::vec2& resolution) const; glm::vec2 currentWindowCoordinates() const; bool isMoving() const; @@ -59,7 +59,7 @@ struct TouchInput { */ class TouchInputHolder { public: - TouchInputHolder(TouchInput input); + explicit TouchInputHolder(TouchInput input); /** * Succeeds upon a different input than last. Fails upon a too similar input as last. diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp index c28c9f8ea2..3fa3aa5a49 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp @@ -56,16 +56,31 @@ #include +#include #include #include #include #include +#include #include +#include #include #include +#include #include +#include +#include +#include +#include +#include +#include #include +#include +#include #include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "AtmosphereDeferredcaster"; diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.h b/modules/atmosphere/rendering/atmospheredeferredcaster.h index f7cb74db4b..8b9baf5acb 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.h +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.h @@ -27,22 +27,14 @@ #include -#include #include #include #include -#include #include -namespace ghoul::opengl { - class Texture; - class ProgramObject; -} // namespace ghoul::opengl - namespace openspace { -struct RenderData; -struct DeferredcastData; +class SceneGraphNode; struct ShadowConfiguration; struct ShadowRenderingStruct { @@ -113,7 +105,6 @@ private: void calculateInscattering(int scatteringOrder, ghoul::opengl::ProgramObject& program, GLuint deltaSRayleigh); - UniformCache(cullAtmosphere, opacity, Rg, Rt, groundRadianceEmission, HR, betaRayleigh, HM, betaMieExtinction, mieG, sunRadiance, ozoneLayerEnabled, HO, betaOzoneExtinction, SAMPLES_R, SAMPLES_MU, SAMPLES_MU_S, SAMPLES_NU, diff --git a/modules/atmosphere/rendering/renderableatmosphere.cpp b/modules/atmosphere/rendering/renderableatmosphere.cpp index 5b2d0dd92c..baf3b2e6d0 100644 --- a/modules/atmosphere/rendering/renderableatmosphere.cpp +++ b/modules/atmosphere/rendering/renderableatmosphere.cpp @@ -27,15 +27,21 @@ #include #include #include -#include #include #include -#include -#include #include +#include #include +#include +#include +#include +#include +#include +#include +#include #include #include +#include namespace { constexpr float KM_TO_M = 1000.f; diff --git a/modules/atmosphere/rendering/renderableatmosphere.h b/modules/atmosphere/rendering/renderableatmosphere.h index 15d95b4b12..cc3234d899 100644 --- a/modules/atmosphere/rendering/renderableatmosphere.h +++ b/modules/atmosphere/rendering/renderableatmosphere.h @@ -28,26 +28,15 @@ #include #include -#include -#include #include #include #include -#include -#include #include -#include -#include - -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl +#include namespace openspace { class AtmosphereDeferredcaster; - struct TransformData; // Shadow structure @@ -60,9 +49,6 @@ struct ShadowConfiguration { bool printedCasterError = false; }; -namespace documentation { struct Documentation; } -namespace planetgeometry { class PlanetGeometry; } - class RenderableAtmosphere : public Renderable { public: explicit RenderableAtmosphere(const ghoul::Dictionary& dictionary); @@ -77,7 +63,7 @@ public: static documentation::Documentation Documentation(); private: - glm::dmat4 computeModelTransformMatrix(const openspace::TransformData& data); + glm::dmat4 computeModelTransformMatrix(const TransformData& data); void updateAtmosphereParameters(); void setDimmingCoefficient(const glm::dmat4& modelTransform); diff --git a/modules/audio/audiomodule.cpp b/modules/audio/audiomodule.cpp index d94eb09293..1cc6055894 100644 --- a/modules/audio/audiomodule.cpp +++ b/modules/audio/audiomodule.cpp @@ -24,11 +24,20 @@ #include -#include +#include #include +#include +#include +#include #include +#include +#include +#include #include #include +#include +#include +#include #include "audiomodule_lua.inl" diff --git a/modules/audio/audiomodule.h b/modules/audio/audiomodule.h index 6087fbd7a9..63bad67f60 100644 --- a/modules/audio/audiomodule.h +++ b/modules/audio/audiomodule.h @@ -27,9 +27,11 @@ #include -#include -#include +#include #include +#include +#include +#include namespace SoLoud { class Soloud; diff --git a/modules/audio/audiomodule_lua.inl b/modules/audio/audiomodule_lua.inl index 2f54c348c1..51516b29ec 100644 --- a/modules/audio/audiomodule_lua.inl +++ b/modules/audio/audiomodule_lua.inl @@ -22,8 +22,8 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include #include -#include namespace { diff --git a/modules/base/basemodule.cpp b/modules/base/basemodule.cpp index 22f16a8437..f4e7fc5d81 100644 --- a/modules/base/basemodule.cpp +++ b/modules/base/basemodule.cpp @@ -96,12 +96,13 @@ #include #include #include -#include -#include #include #include #include #include +#include +#include +#include namespace openspace { diff --git a/modules/base/dashboard/dashboarditemangle.cpp b/modules/base/dashboard/dashboarditemangle.cpp index d39bd100c2..038a6e26a8 100644 --- a/modules/base/dashboard/dashboarditemangle.cpp +++ b/modules/base/dashboard/dashboarditemangle.cpp @@ -26,18 +26,20 @@ #include #include -#include #include #include #include #include #include #include -#include -#include -#include +#include #include +#include #include +#include +#include +#include +#include namespace { enum Type { diff --git a/modules/base/dashboard/dashboarditemangle.h b/modules/base/dashboard/dashboarditemangle.h index cde4aedb8e..410fd5830a 100644 --- a/modules/base/dashboard/dashboarditemangle.h +++ b/modules/base/dashboard/dashboarditemangle.h @@ -35,8 +35,6 @@ namespace openspace { class SceneGraphNode; -namespace documentation { struct Documentation; } - class DashboardItemAngle : public DashboardTextItem { public: explicit DashboardItemAngle(const ghoul::Dictionary& dictionary); diff --git a/modules/base/dashboard/dashboarditemcameraorientation.cpp b/modules/base/dashboard/dashboarditemcameraorientation.cpp index e4887ec377..7808790146 100644 --- a/modules/base/dashboard/dashboarditemcameraorientation.cpp +++ b/modules/base/dashboard/dashboarditemcameraorientation.cpp @@ -29,7 +29,9 @@ #include #include #include -#include +#include +#include +#include namespace { // This `DashboardItem` shows the current camera orientation in the yaw, pitch, and diff --git a/modules/base/dashboard/dashboarditemdate.cpp b/modules/base/dashboard/dashboarditemdate.cpp index 5f4287629d..ee88d71f14 100644 --- a/modules/base/dashboard/dashboarditemdate.cpp +++ b/modules/base/dashboard/dashboarditemdate.cpp @@ -25,15 +25,14 @@ #include #include -#include #include #include #include -#include -#include -#include +#include #include +#include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo FormatStringInfo = { diff --git a/modules/base/dashboard/dashboarditemdate.h b/modules/base/dashboard/dashboarditemdate.h index d620f1f699..d465a3dcac 100644 --- a/modules/base/dashboard/dashboarditemdate.h +++ b/modules/base/dashboard/dashboarditemdate.h @@ -31,8 +31,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class DashboardItemDate : public DashboardTextItem { public: explicit DashboardItemDate(const ghoul::Dictionary& dictionary); diff --git a/modules/base/dashboard/dashboarditemdistance.cpp b/modules/base/dashboard/dashboarditemdistance.cpp index 57d28fbf68..1f0eeb6aee 100644 --- a/modules/base/dashboard/dashboarditemdistance.cpp +++ b/modules/base/dashboard/dashboarditemdistance.cpp @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -34,11 +33,13 @@ #include #include #include -#include -#include -#include +#include #include +#include #include +#include +#include +#include namespace { enum Type { diff --git a/modules/base/dashboard/dashboarditemdistance.h b/modules/base/dashboard/dashboarditemdistance.h index cea0fd1966..3a81c6fc52 100644 --- a/modules/base/dashboard/dashboarditemdistance.h +++ b/modules/base/dashboard/dashboarditemdistance.h @@ -36,8 +36,6 @@ namespace openspace { class SceneGraphNode; -namespace documentation { struct Documentation; } - class DashboardItemDistance : public DashboardTextItem { public: explicit DashboardItemDistance(const ghoul::Dictionary& dictionary); diff --git a/modules/base/dashboard/dashboarditemelapsedtime.cpp b/modules/base/dashboard/dashboarditemelapsedtime.cpp index 7595594b06..ed874ee38f 100644 --- a/modules/base/dashboard/dashboarditemelapsedtime.cpp +++ b/modules/base/dashboard/dashboarditemelapsedtime.cpp @@ -25,15 +25,15 @@ #include #include -#include #include -#include #include #include #include -#include -#include -#include +#include +#include +#include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo FormatStringInfo = { diff --git a/modules/base/dashboard/dashboarditemelapsedtime.h b/modules/base/dashboard/dashboarditemelapsedtime.h index fecbab5712..b7c646754a 100644 --- a/modules/base/dashboard/dashboarditemelapsedtime.h +++ b/modules/base/dashboard/dashboarditemelapsedtime.h @@ -33,8 +33,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class DashboardItemElapsedTime : public DashboardTextItem { public: explicit DashboardItemElapsedTime(const ghoul::Dictionary& dictionary); diff --git a/modules/base/dashboard/dashboarditemframerate.cpp b/modules/base/dashboard/dashboarditemframerate.cpp index 4b4c32d29e..c78b35de84 100644 --- a/modules/base/dashboard/dashboarditemframerate.cpp +++ b/modules/base/dashboard/dashboarditemframerate.cpp @@ -25,14 +25,14 @@ #include #include -#include #include #include -#include -#include -#include +#include +#include +#include #include #include +#include namespace { enum FrametimeType { diff --git a/modules/base/dashboard/dashboarditemframerate.h b/modules/base/dashboard/dashboarditemframerate.h index feaddb7075..c8ff593fe3 100644 --- a/modules/base/dashboard/dashboarditemframerate.h +++ b/modules/base/dashboard/dashboarditemframerate.h @@ -30,12 +30,8 @@ #include #include -namespace ghoul { class Dictionary; } - namespace openspace { -namespace documentation { struct Documentation; } - class DashboardItemFramerate : public DashboardTextItem { public: explicit DashboardItemFramerate(const ghoul::Dictionary& dictionary); diff --git a/modules/base/dashboard/dashboarditeminputstate.cpp b/modules/base/dashboard/dashboarditeminputstate.cpp index 89a68e4d18..7b082f7c8f 100644 --- a/modules/base/dashboard/dashboarditeminputstate.cpp +++ b/modules/base/dashboard/dashboarditeminputstate.cpp @@ -25,13 +25,13 @@ #include #include -#include #include #include -#include -#include -#include +#include +#include #include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo ShowWhenEnabledInfo = { diff --git a/modules/base/dashboard/dashboarditeminputstate.h b/modules/base/dashboard/dashboarditeminputstate.h index 84cdee23f3..734fb753f0 100644 --- a/modules/base/dashboard/dashboarditeminputstate.h +++ b/modules/base/dashboard/dashboarditeminputstate.h @@ -31,9 +31,6 @@ namespace openspace { -namespace properties { class Property; } -namespace documentation { struct Documentation; } - class DashboardItemInputState : public DashboardTextItem { public: explicit DashboardItemInputState(const ghoul::Dictionary& dictionary); diff --git a/modules/base/dashboard/dashboarditemmission.cpp b/modules/base/dashboard/dashboarditemmission.cpp index 571773cb23..a831d86ec7 100644 --- a/modules/base/dashboard/dashboarditemmission.cpp +++ b/modules/base/dashboard/dashboarditemmission.cpp @@ -25,16 +25,18 @@ #include #include -#include #include #include #include #include #include -#include #include +#include +#include #include +#include #include +#include namespace { std::string progressToStr(int size, double t) { diff --git a/modules/base/dashboard/dashboarditemmission.h b/modules/base/dashboard/dashboarditemmission.h index 8a7c9a87db..fabb4326cf 100644 --- a/modules/base/dashboard/dashboarditemmission.h +++ b/modules/base/dashboard/dashboarditemmission.h @@ -29,8 +29,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class DashboardItemMission : public DashboardTextItem { public: explicit DashboardItemMission(const ghoul::Dictionary& dictionary); diff --git a/modules/base/dashboard/dashboarditemparallelconnection.cpp b/modules/base/dashboard/dashboarditemparallelconnection.cpp index 6a15e397a4..3286fbaffd 100644 --- a/modules/base/dashboard/dashboarditemparallelconnection.cpp +++ b/modules/base/dashboard/dashboarditemparallelconnection.cpp @@ -25,13 +25,11 @@ #include #include -#include #include #include #include -#include -#include -#include +#include +#include #include namespace { @@ -44,6 +42,7 @@ namespace { // The information presented contains how many clients are connected to the same // session and whether this machine is currently the host of the session. struct [[codegen::Dictionary(DashboardItemParallelConnection)]] Parameters {}; + #include "dashboarditemparallelconnection_codegen.cpp" } // namespace diff --git a/modules/base/dashboard/dashboarditemparallelconnection.h b/modules/base/dashboard/dashboarditemparallelconnection.h index 6191a8e382..90c599a585 100644 --- a/modules/base/dashboard/dashboarditemparallelconnection.h +++ b/modules/base/dashboard/dashboarditemparallelconnection.h @@ -29,8 +29,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class DashboardItemParallelConnection : public DashboardTextItem { public: explicit DashboardItemParallelConnection(const ghoul::Dictionary& dictionary); diff --git a/modules/base/dashboard/dashboarditempropertyvalue.cpp b/modules/base/dashboard/dashboarditempropertyvalue.cpp index c88b0ad23b..4957588df0 100644 --- a/modules/base/dashboard/dashboarditempropertyvalue.cpp +++ b/modules/base/dashboard/dashboarditempropertyvalue.cpp @@ -25,8 +25,8 @@ #include #include -#include -#include +#include +#include #include #include #include @@ -46,11 +46,11 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo PropertyUriInfo = { diff --git a/modules/base/dashboard/dashboarditempropertyvalue.h b/modules/base/dashboard/dashboarditempropertyvalue.h index e69ecd30ed..ad2d946b8d 100644 --- a/modules/base/dashboard/dashboarditempropertyvalue.h +++ b/modules/base/dashboard/dashboarditempropertyvalue.h @@ -33,8 +33,6 @@ namespace openspace { namespace properties { class Property; } -namespace documentation { struct Documentation; } - class DashboardItemPropertyValue : public DashboardTextItem { public: DashboardItemPropertyValue(const ghoul::Dictionary& dictionary); diff --git a/modules/base/dashboard/dashboarditemsimulationincrement.cpp b/modules/base/dashboard/dashboarditemsimulationincrement.cpp index 52ee00caa6..e0ae86b24d 100644 --- a/modules/base/dashboard/dashboarditemsimulationincrement.cpp +++ b/modules/base/dashboard/dashboarditemsimulationincrement.cpp @@ -25,15 +25,16 @@ #include #include -#include #include #include #include -#include -#include -#include +#include #include +#include #include +#include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo SimplificationInfo = { diff --git a/modules/base/dashboard/dashboarditemsimulationincrement.h b/modules/base/dashboard/dashboarditemsimulationincrement.h index 3354a9a5ff..3252fbd094 100644 --- a/modules/base/dashboard/dashboarditemsimulationincrement.h +++ b/modules/base/dashboard/dashboarditemsimulationincrement.h @@ -33,8 +33,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class DashboardItemSimulationIncrement : public DashboardTextItem { public: explicit DashboardItemSimulationIncrement(const ghoul::Dictionary& dictionary); diff --git a/modules/base/dashboard/dashboarditemspacing.cpp b/modules/base/dashboard/dashboarditemspacing.cpp index 0d7809494c..0e8b287c3a 100644 --- a/modules/base/dashboard/dashboarditemspacing.cpp +++ b/modules/base/dashboard/dashboarditemspacing.cpp @@ -25,7 +25,7 @@ #include #include -#include +#include #include namespace { diff --git a/modules/base/dashboard/dashboarditemspacing.h b/modules/base/dashboard/dashboarditemspacing.h index 0fe59e4a34..b40977ee18 100644 --- a/modules/base/dashboard/dashboarditemspacing.h +++ b/modules/base/dashboard/dashboarditemspacing.h @@ -31,8 +31,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class DashboardItemSpacing : public DashboardItem { public: explicit DashboardItemSpacing(const ghoul::Dictionary& dictionary); diff --git a/modules/base/dashboard/dashboarditemtext.cpp b/modules/base/dashboard/dashboarditemtext.cpp index 1000e830e1..6bcb6f306c 100644 --- a/modules/base/dashboard/dashboarditemtext.cpp +++ b/modules/base/dashboard/dashboarditemtext.cpp @@ -25,10 +25,7 @@ #include #include -#include -#include -#include -#include +#include #include namespace { diff --git a/modules/base/dashboard/dashboarditemtext.h b/modules/base/dashboard/dashboarditemtext.h index 02fee87f81..783a954a88 100644 --- a/modules/base/dashboard/dashboarditemtext.h +++ b/modules/base/dashboard/dashboarditemtext.h @@ -31,8 +31,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class DashboardItemText : public DashboardTextItem { public: explicit DashboardItemText(const ghoul::Dictionary& dictionary); diff --git a/modules/base/dashboard/dashboarditemtimevaryingtext.cpp b/modules/base/dashboard/dashboarditemtimevaryingtext.cpp index 98671ceaa9..e3f2b0cc47 100644 --- a/modules/base/dashboard/dashboarditemtimevaryingtext.cpp +++ b/modules/base/dashboard/dashboarditemtimevaryingtext.cpp @@ -25,13 +25,18 @@ #include #include -#include #include -#include +#include #include -#include +#include #include +#include +#include +#include +#include #include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo FormatStringInfo = { diff --git a/modules/base/dashboard/dashboarditemtimevaryingtext.h b/modules/base/dashboard/dashboarditemtimevaryingtext.h index 80a4f330de..2225ce493b 100644 --- a/modules/base/dashboard/dashboarditemtimevaryingtext.h +++ b/modules/base/dashboard/dashboarditemtimevaryingtext.h @@ -27,13 +27,12 @@ #include -#include #include +#include +#include namespace openspace { -namespace documentation { struct Documentation; } - class DashboardItemTimeVaryingText : public DashboardTextItem { public: explicit DashboardItemTimeVaryingText(const ghoul::Dictionary& dictionary); diff --git a/modules/base/dashboard/dashboarditemvelocity.cpp b/modules/base/dashboard/dashboarditemvelocity.cpp index aa0556ee5f..be19e5b121 100644 --- a/modules/base/dashboard/dashboarditemvelocity.cpp +++ b/modules/base/dashboard/dashboarditemvelocity.cpp @@ -26,16 +26,16 @@ #include #include -#include #include #include #include #include -#include #include -#include -#include +#include +#include #include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo SimplificationInfo = { diff --git a/modules/base/dashboard/dashboarditemvelocity.h b/modules/base/dashboard/dashboarditemvelocity.h index caf2d5c660..f5fdf17cdb 100644 --- a/modules/base/dashboard/dashboarditemvelocity.h +++ b/modules/base/dashboard/dashboarditemvelocity.h @@ -29,14 +29,9 @@ #include #include -#include namespace openspace { -class SceneGraphNode; - -namespace documentation { struct Documentation; } - class DashboardItemVelocity : public DashboardTextItem { public: explicit DashboardItemVelocity(const ghoul::Dictionary& dictionary); diff --git a/modules/base/lightsource/cameralightsource.cpp b/modules/base/lightsource/cameralightsource.cpp index 07d4a4ff13..0bebb4c7fa 100644 --- a/modules/base/lightsource/cameralightsource.cpp +++ b/modules/base/lightsource/cameralightsource.cpp @@ -25,8 +25,8 @@ #include #include -#include #include +#include #include namespace { diff --git a/modules/base/lightsource/cameralightsource.h b/modules/base/lightsource/cameralightsource.h index c3ccad79a7..b09c4bd16f 100644 --- a/modules/base/lightsource/cameralightsource.h +++ b/modules/base/lightsource/cameralightsource.h @@ -31,8 +31,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class CameraLightSource : public LightSource { public: explicit CameraLightSource(const ghoul::Dictionary& dictionary); diff --git a/modules/base/lightsource/scenegraphlightsource.cpp b/modules/base/lightsource/scenegraphlightsource.cpp index 56c2438614..fda3b79e89 100644 --- a/modules/base/lightsource/scenegraphlightsource.cpp +++ b/modules/base/lightsource/scenegraphlightsource.cpp @@ -25,11 +25,11 @@ #include #include -#include #include #include #include #include +#include #include #include diff --git a/modules/base/lightsource/scenegraphlightsource.h b/modules/base/lightsource/scenegraphlightsource.h index 1259ca66ca..4948b007a1 100644 --- a/modules/base/lightsource/scenegraphlightsource.h +++ b/modules/base/lightsource/scenegraphlightsource.h @@ -32,7 +32,7 @@ namespace openspace { -namespace documentation { struct Documentation; } +class SceneGraphNode; class SceneGraphLightSource : public LightSource { public: diff --git a/modules/base/rendering/grids/renderableboxgrid.cpp b/modules/base/rendering/grids/renderableboxgrid.cpp index 6a82d972cf..0991c8f6c1 100644 --- a/modules/base/rendering/grids/renderableboxgrid.cpp +++ b/modules/base/rendering/grids/renderableboxgrid.cpp @@ -25,15 +25,16 @@ #include #include +#include #include -#include #include #include -#include -#include #include +#include +#include #include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo ColorInfo = { diff --git a/modules/base/rendering/grids/renderableboxgrid.h b/modules/base/rendering/grids/renderableboxgrid.h index 12b9ee7ac1..8157cf992e 100644 --- a/modules/base/rendering/grids/renderableboxgrid.h +++ b/modules/base/rendering/grids/renderableboxgrid.h @@ -31,12 +31,6 @@ #include #include -namespace ghoul::opengl { - class ProgramObject; -} // namespace ghoul::opengl - -namespace openspace::documentation { struct Documentation; } - namespace openspace { class RenderableBoxGrid : public Renderable { diff --git a/modules/base/rendering/grids/renderablegrid.cpp b/modules/base/rendering/grids/renderablegrid.cpp index a66e631600..e0c5ee5c93 100644 --- a/modules/base/rendering/grids/renderablegrid.cpp +++ b/modules/base/rendering/grids/renderablegrid.cpp @@ -25,15 +25,17 @@ #include #include -#include +#include #include -#include #include #include #include #include +#include #include #include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo ColorInfo = { diff --git a/modules/base/rendering/grids/renderablegrid.h b/modules/base/rendering/grids/renderablegrid.h index 3173ee10c2..1b713b95a7 100644 --- a/modules/base/rendering/grids/renderablegrid.h +++ b/modules/base/rendering/grids/renderablegrid.h @@ -27,16 +27,13 @@ #include -#include #include #include #include #include #include #include - -namespace ghoul::opengl { class ProgramObject; } -namespace openspace::documentation { struct Documentation; } +#include namespace openspace { diff --git a/modules/base/rendering/grids/renderableradialgrid.cpp b/modules/base/rendering/grids/renderableradialgrid.cpp index 2683aecbbb..cdec94acb6 100644 --- a/modules/base/rendering/grids/renderableradialgrid.cpp +++ b/modules/base/rendering/grids/renderableradialgrid.cpp @@ -26,15 +26,18 @@ #include #include +#include #include +#include #include #include -#include #include #include #include #include +#include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo ColorInfo = { diff --git a/modules/base/rendering/grids/renderableradialgrid.h b/modules/base/rendering/grids/renderableradialgrid.h index cc9a8db7bf..5fb5525483 100644 --- a/modules/base/rendering/grids/renderableradialgrid.h +++ b/modules/base/rendering/grids/renderableradialgrid.h @@ -35,10 +35,7 @@ #include #include #include - -namespace ghoul::opengl { class ProgramObject; } - -namespace openspace::documentation { struct Documentation; } +#include namespace openspace { @@ -93,6 +90,6 @@ protected: std::unique_ptr _labels; }; -}// namespace openspace +} // namespace openspace #endif // __OPENSPACE_MODULE_BASE___RENDERABLERADIALGRID___H__ diff --git a/modules/base/rendering/grids/renderablesphericalgrid.cpp b/modules/base/rendering/grids/renderablesphericalgrid.cpp index 668979ab36..8c5ee80c90 100644 --- a/modules/base/rendering/grids/renderablesphericalgrid.cpp +++ b/modules/base/rendering/grids/renderablesphericalgrid.cpp @@ -25,14 +25,18 @@ #include #include +#include #include #include #include -#include #include #include +#include #include #include +#include +#include +#include #include namespace { diff --git a/modules/base/rendering/grids/renderablesphericalgrid.h b/modules/base/rendering/grids/renderablesphericalgrid.h index 3f24f9d331..ef5d4fe773 100644 --- a/modules/base/rendering/grids/renderablesphericalgrid.h +++ b/modules/base/rendering/grids/renderablesphericalgrid.h @@ -32,13 +32,10 @@ #include #include #include - -namespace ghoul::opengl { class ProgramObject; } +#include namespace openspace { -namespace documentation { struct Documentation; } - class RenderableSphericalGrid : public Renderable { public: explicit RenderableSphericalGrid(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rendering/pointcloud/renderableinterpolatedpoints.cpp b/modules/base/rendering/pointcloud/renderableinterpolatedpoints.cpp index 9f0be053e6..d913e5c39a 100644 --- a/modules/base/rendering/pointcloud/renderableinterpolatedpoints.cpp +++ b/modules/base/rendering/pointcloud/renderableinterpolatedpoints.cpp @@ -30,12 +30,14 @@ #include #include #include +#include #include #include -#include +#include +#include #include -#include -#include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderableInterpolatedPoints"; diff --git a/modules/base/rendering/pointcloud/renderableinterpolatedpoints.h b/modules/base/rendering/pointcloud/renderableinterpolatedpoints.h index 97bb597b4b..60482391ed 100644 --- a/modules/base/rendering/pointcloud/renderableinterpolatedpoints.h +++ b/modules/base/rendering/pointcloud/renderableinterpolatedpoints.h @@ -31,15 +31,12 @@ #include #include #include - -namespace ghoul::opengl { class Texture; } +#include namespace openspace { -namespace documentation { struct Documentation; } - /** - * A specialization of the RenderablePointCloud that supports interpolation beetween + * A specialization of the RenderablePointCloud that supports interpolation between * different positions for the points. */ class RenderableInterpolatedPoints : public RenderablePointCloud { diff --git a/modules/base/rendering/pointcloud/renderablepointcloud.cpp b/modules/base/rendering/pointcloud/renderablepointcloud.cpp index f0db1b28a1..9d3ab6d46e 100644 --- a/modules/base/rendering/pointcloud/renderablepointcloud.cpp +++ b/modules/base/rendering/pointcloud/renderablepointcloud.cpp @@ -25,35 +25,32 @@ #include #include +#include #include -#include #include -#include #include -#include +#include #include +#include #include #include #include -#include -#include +#include +#include +#include #include #include #include #include #include #include -#include #include -#include -#include +#include #include #include -#include -#include -#include -#include -#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderablePointCloud"; diff --git a/modules/base/rendering/pointcloud/renderablepointcloud.h b/modules/base/rendering/pointcloud/renderablepointcloud.h index df3419492f..3bb2673a15 100644 --- a/modules/base/rendering/pointcloud/renderablepointcloud.h +++ b/modules/base/rendering/pointcloud/renderablepointcloud.h @@ -28,32 +28,28 @@ #include #include +#include +#include #include #include -#include #include #include #include -#include #include #include #include #include #include +#include #include +#include #include #include -#include - -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl +#include +#include namespace openspace { -namespace documentation { struct Documentation; } - struct TextureFormat { glm::uvec2 resolution; bool useAlpha = false; @@ -157,7 +153,7 @@ protected: void renderPoints(const RenderData& data, const glm::dmat4& modelMatrix, const glm::dvec3& orthoRight, const glm::dvec3& orthoUp, float fadeInVariable); - gl::GLenum internalGlFormat(bool useAlpha) const; + GLenum internalGlFormat(bool useAlpha) const; ghoul::opengl::Texture::Format glFormat(bool useAlpha) const; bool _dataIsDirty = true; diff --git a/modules/base/rendering/pointcloud/renderablepolygoncloud.cpp b/modules/base/rendering/pointcloud/renderablepolygoncloud.cpp index f69a9ba302..f901c5b4d2 100644 --- a/modules/base/rendering/pointcloud/renderablepolygoncloud.cpp +++ b/modules/base/rendering/pointcloud/renderablepolygoncloud.cpp @@ -26,11 +26,12 @@ #include #include -#include #include +#include +#include #include -#include -#include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderablePolygonCloud"; diff --git a/modules/base/rendering/pointcloud/renderablepolygoncloud.h b/modules/base/rendering/pointcloud/renderablepolygoncloud.h index 13cf5a8aa2..681b0b6635 100644 --- a/modules/base/rendering/pointcloud/renderablepolygoncloud.h +++ b/modules/base/rendering/pointcloud/renderablepolygoncloud.h @@ -27,17 +27,11 @@ #include -#include - -namespace ghoul::opengl { class Texture; } - namespace openspace { -namespace documentation { struct Documentation; } - /** * A billboarded point cloud, but with dynamically created uniform polygon shapes instead - * of a custom texture. Overwrites the sprite set in parent class, RenderablePointCloud + * of a custom texture. Overwrites the sprite set in parent class, RenderablePointCloud. */ class RenderablePolygonCloud : public RenderablePointCloud { public: diff --git a/modules/base/rendering/pointcloud/sizemappingcomponent.cpp b/modules/base/rendering/pointcloud/sizemappingcomponent.cpp index c5bf3ea1a9..1e965666dd 100644 --- a/modules/base/rendering/pointcloud/sizemappingcomponent.cpp +++ b/modules/base/rendering/pointcloud/sizemappingcomponent.cpp @@ -27,6 +27,10 @@ #include #include #include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "SizeMapping"; diff --git a/modules/base/rendering/pointcloud/sizemappingcomponent.h b/modules/base/rendering/pointcloud/sizemappingcomponent.h index 3da60e6620..0223dc6d1e 100644 --- a/modules/base/rendering/pointcloud/sizemappingcomponent.h +++ b/modules/base/rendering/pointcloud/sizemappingcomponent.h @@ -31,6 +31,8 @@ #include #include +namespace ghoul { class Dictionary; } + namespace openspace { namespace documentation { struct Documentation; } diff --git a/modules/base/rendering/renderablecartesianaxes.cpp b/modules/base/rendering/renderablecartesianaxes.cpp index 71fbc85bee..2eb30818d7 100644 --- a/modules/base/rendering/renderablecartesianaxes.cpp +++ b/modules/base/rendering/renderablecartesianaxes.cpp @@ -25,16 +25,17 @@ #include #include +#include #include #include -#include #include -#include #include #include +#include #include #include -#include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo XColorInfo = { diff --git a/modules/base/rendering/renderablecartesianaxes.h b/modules/base/rendering/renderablecartesianaxes.h index fadf761f03..89ebd158ac 100644 --- a/modules/base/rendering/renderablecartesianaxes.h +++ b/modules/base/rendering/renderablecartesianaxes.h @@ -27,17 +27,9 @@ #include -#include -#include -#include -#include #include #include -namespace ghoul::opengl { class ProgramObject; } - -namespace openspace::documentation { struct Documentation; } - namespace openspace { class RenderableCartesianAxes : public Renderable { diff --git a/modules/base/rendering/renderabledisc.cpp b/modules/base/rendering/renderabledisc.cpp index 97d521b8aa..40e16c5b24 100644 --- a/modules/base/rendering/renderabledisc.cpp +++ b/modules/base/rendering/renderabledisc.cpp @@ -25,15 +25,14 @@ #include #include -#include #include #include -#include #include #include -#include +#include #include #include +#include #include #include #include diff --git a/modules/base/rendering/renderabledisc.h b/modules/base/rendering/renderabledisc.h index 588c64cc69..dd8f88db19 100644 --- a/modules/base/rendering/renderabledisc.h +++ b/modules/base/rendering/renderabledisc.h @@ -32,15 +32,10 @@ #include #include #include -#include - -namespace ghoul::filesystem { class File; } -namespace ghoul::opengl { class ProgramObject; } +#include namespace openspace { -namespace documentation { struct Documentation; } - class RenderableDisc : public Renderable { public: explicit RenderableDisc(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rendering/renderabledistancelabel.cpp b/modules/base/rendering/renderabledistancelabel.cpp index 2a93a3a850..c14f45d75f 100644 --- a/modules/base/rendering/renderabledistancelabel.cpp +++ b/modules/base/rendering/renderabledistancelabel.cpp @@ -26,14 +26,13 @@ #include #include -#include #include #include #include #include +#include #include -#include -#include +#include namespace { constexpr std::string_view _loggerCat = "RenderableDistanceLabel"; diff --git a/modules/base/rendering/renderabledistancelabel.h b/modules/base/rendering/renderabledistancelabel.h index a79c85d527..2d525e2104 100644 --- a/modules/base/rendering/renderabledistancelabel.h +++ b/modules/base/rendering/renderabledistancelabel.h @@ -33,8 +33,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class RenderableDistanceLabel : public RenderableLabel { public: explicit RenderableDistanceLabel(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rendering/renderablelabel.cpp b/modules/base/rendering/renderablelabel.cpp index 2a56a59abb..15d24de5c6 100644 --- a/modules/base/rendering/renderablelabel.cpp +++ b/modules/base/rendering/renderablelabel.cpp @@ -24,28 +24,19 @@ #include -#include #include -#include #include #include -#include #include #include -#include #include #include -#include -#include -#include -#include +#include +#include #include -#include #include -#include -#include -#include -#include +#include +#include #include namespace { diff --git a/modules/base/rendering/renderablelabel.h b/modules/base/rendering/renderablelabel.h index c931d65b94..8dae1d00b9 100644 --- a/modules/base/rendering/renderablelabel.h +++ b/modules/base/rendering/renderablelabel.h @@ -34,26 +34,12 @@ #include #include #include +#include -#include -#include - -namespace ghoul::filesystem { class File; } namespace ghoul::fontrendering { class Font; } -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl namespace openspace { -struct RenderData; -struct UpdateData; - -namespace documentation { struct Documentation; } - -struct LinePoint; - class RenderableLabel : public Renderable { public: explicit RenderableLabel(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rendering/renderablemodel.cpp b/modules/base/rendering/renderablemodel.cpp index d7a9e281e1..e8723ad4a1 100644 --- a/modules/base/rendering/renderablemodel.cpp +++ b/modules/base/rendering/renderablemodel.cpp @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -35,19 +34,28 @@ #include #include #include -#include #include +#include #include +#include #include #include -#include +#include +#include +#include #include #include #include #include #include +#include +#include +#include #include +#include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderableModel"; diff --git a/modules/base/rendering/renderablemodel.h b/modules/base/rendering/renderablemodel.h index bc1aae8cf4..1430a093fc 100644 --- a/modules/base/rendering/renderablemodel.h +++ b/modules/base/rendering/renderablemodel.h @@ -26,33 +26,22 @@ #define __OPENSPACE_MODULE_BASE___RENDERABLEMODEL___H__ #include + #include -#include #include -#include #include +#include #include #include -#include -#include #include #include -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl - namespace ghoul::modelgeometry { class ModelGeometry; } namespace openspace { -struct RenderData; -struct UpdateData; class LightSource; -namespace documentation { struct Documentation; } - class RenderableModel : public Renderable { public: explicit RenderableModel(const ghoul::Dictionary& dictionary); @@ -107,12 +96,12 @@ private: std::filesystem::path _fragmentShaderPath; ghoul::opengl::ProgramObject* _program = nullptr; UniformCache(modelViewTransform, projectionTransform, normalTransform, meshTransform, - meshNormalTransform, ambientIntensity, diffuseIntensity, - specularIntensity, performShading, use_forced_color, has_texture_diffuse, - has_texture_normal, has_texture_specular, has_color_specular, - texture_diffuse, texture_normal, texture_specular, color_diffuse, - color_specular, opacity, nLightSources, lightDirectionsViewSpace, - lightIntensities, performManualDepthTest, gBufferDepthTexture, resolution + meshNormalTransform, ambientIntensity, diffuseIntensity, specularIntensity, + performShading, use_forced_color, has_texture_diffuse, has_texture_normal, + has_texture_specular, has_color_specular, texture_diffuse, texture_normal, + texture_specular, color_diffuse, color_specular, opacity, nLightSources, + lightDirectionsViewSpace, lightIntensities, performManualDepthTest, + gBufferDepthTexture, resolution ) _uniformCache; std::vector> _lightSources; diff --git a/modules/base/rendering/renderablenodearrow.cpp b/modules/base/rendering/renderablenodearrow.cpp index e66e2ef236..08728998cf 100644 --- a/modules/base/rendering/renderablenodearrow.cpp +++ b/modules/base/rendering/renderablenodearrow.cpp @@ -25,22 +25,23 @@ #include #include -#include +#include #include -#include -#include #include #include #include -#include -#include #include +#include #include +#include #include +#include #include #include -#include -#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderableNodeArrow"; diff --git a/modules/base/rendering/renderablenodearrow.h b/modules/base/rendering/renderablenodearrow.h index d08d6fcd32..94ead7aa3d 100644 --- a/modules/base/rendering/renderablenodearrow.h +++ b/modules/base/rendering/renderablenodearrow.h @@ -27,20 +27,15 @@ #include +#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. */ diff --git a/modules/base/rendering/renderablenodeline.cpp b/modules/base/rendering/renderablenodeline.cpp index 588434ec64..b0fd5a8133 100644 --- a/modules/base/rendering/renderablenodeline.cpp +++ b/modules/base/rendering/renderablenodeline.cpp @@ -25,18 +25,20 @@ #include #include -#include +#include #include #include #include #include #include -#include #include #include +#include #include +#include #include #include +#include namespace { constexpr std::string_view _loggerCat = "RenderableNodeLine"; diff --git a/modules/base/rendering/renderablenodeline.h b/modules/base/rendering/renderablenodeline.h index 71588fb168..8a6846e07d 100644 --- a/modules/base/rendering/renderablenodeline.h +++ b/modules/base/rendering/renderablenodeline.h @@ -27,21 +27,17 @@ #include +#include #include #include #include -#include #include - -namespace ghoul::opengl { class ProgramObject; } -namespace openspace::documentation { struct Documentation; } +#include namespace openspace { -class Translation; - /** - * This is a class for a line that is drawn between two nodes in OpenSpace. + * This is a class for a line that is drawn between two nodes. */ class RenderableNodeLine : public Renderable { public: diff --git a/modules/base/rendering/renderableplane.cpp b/modules/base/rendering/renderableplane.cpp index 0b7731e4a8..e583b24aad 100644 --- a/modules/base/rendering/renderableplane.cpp +++ b/modules/base/rendering/renderableplane.cpp @@ -26,19 +26,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 #include namespace { diff --git a/modules/base/rendering/renderableplane.h b/modules/base/rendering/renderableplane.h index 70e34f80ec..f6132e9903 100644 --- a/modules/base/rendering/renderableplane.h +++ b/modules/base/rendering/renderableplane.h @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -35,20 +36,8 @@ namespace ghoul::filesystem { class File; } -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl - namespace openspace { -struct RenderData; -struct UpdateData; - -namespace documentation { struct Documentation; } - -struct LinePoint; - class RenderablePlane : public Renderable { public: explicit RenderablePlane(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rendering/renderableplaneimagelocal.cpp b/modules/base/rendering/renderableplaneimagelocal.cpp index 02a95c8ba9..64242bdf1e 100644 --- a/modules/base/rendering/renderableplaneimagelocal.cpp +++ b/modules/base/rendering/renderableplaneimagelocal.cpp @@ -26,16 +26,18 @@ #include #include -#include #include #include +#include #include #include #include +#include #include #include -#include -#include +#include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo TextureInfo = { diff --git a/modules/base/rendering/renderableplaneimagelocal.h b/modules/base/rendering/renderableplaneimagelocal.h index e41d2f61b6..7a27ffc571 100644 --- a/modules/base/rendering/renderableplaneimagelocal.h +++ b/modules/base/rendering/renderableplaneimagelocal.h @@ -27,16 +27,11 @@ #include -namespace ghoul::filesystem { class File; } -namespace ghoul::opengl { class Texture; } +#include +#include namespace openspace { -struct RenderData; -struct UpdateData; - -namespace documentation { struct Documentation; } - class RenderablePlaneImageLocal : public RenderablePlane { public: explicit RenderablePlaneImageLocal(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rendering/renderableplaneimageonline.cpp b/modules/base/rendering/renderableplaneimageonline.cpp index 9f119d78e7..25b47be4b0 100644 --- a/modules/base/rendering/renderableplaneimageonline.cpp +++ b/modules/base/rendering/renderableplaneimageonline.cpp @@ -25,13 +25,16 @@ #include #include -#include #include -#include +#include #include #include +#include #include -#include +#include +#include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo TextureInfo = { diff --git a/modules/base/rendering/renderableplaneimageonline.h b/modules/base/rendering/renderableplaneimageonline.h index 1f17977536..a94929e774 100644 --- a/modules/base/rendering/renderableplaneimageonline.h +++ b/modules/base/rendering/renderableplaneimageonline.h @@ -28,17 +28,12 @@ #include #include - -namespace ghoul::filesystem { class File; } -namespace ghoul::opengl { class Texture; } +#include +#include +#include namespace openspace { -struct RenderData; -struct UpdateData; - -namespace documentation { struct Documentation; } - class RenderablePlaneImageOnline : public RenderablePlane { public: explicit RenderablePlaneImageOnline(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rendering/renderableplanetimevaryingimage.cpp b/modules/base/rendering/renderableplanetimevaryingimage.cpp index 241a9d9d47..c32d04e770 100644 --- a/modules/base/rendering/renderableplanetimevaryingimage.cpp +++ b/modules/base/rendering/renderableplanetimevaryingimage.cpp @@ -26,16 +26,16 @@ #include #include -#include -#include -#include -#include -#include +#include #include #include +#include #include #include -#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderablePlaneTimeVaryingImage"; diff --git a/modules/base/rendering/renderableplanetimevaryingimage.h b/modules/base/rendering/renderableplanetimevaryingimage.h index dc1ca2001f..ed14a3474f 100644 --- a/modules/base/rendering/renderableplanetimevaryingimage.h +++ b/modules/base/rendering/renderableplanetimevaryingimage.h @@ -27,18 +27,13 @@ #include +#include #include - -namespace ghoul::filesystem { class File; } -namespace ghoul::opengl { class Texture; } +#include +#include namespace openspace { -struct RenderData; -struct UpdateData; - -namespace documentation { struct Documentation; } - class RenderablePlaneTimeVaryingImage : public RenderablePlane { public: explicit RenderablePlaneTimeVaryingImage(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rendering/renderableprism.cpp b/modules/base/rendering/renderableprism.cpp index 7d2c857b5e..47fd98d282 100644 --- a/modules/base/rendering/renderableprism.cpp +++ b/modules/base/rendering/renderableprism.cpp @@ -25,15 +25,17 @@ #include #include -#include #include #include #include #include #include -#include +#include +#include +#include #include #include +#include #include namespace { diff --git a/modules/base/rendering/renderableprism.h b/modules/base/rendering/renderableprism.h index 4005ea59d8..e26edfb9be 100644 --- a/modules/base/rendering/renderableprism.h +++ b/modules/base/rendering/renderableprism.h @@ -32,14 +32,11 @@ #include #include #include -#include - -namespace ghoul::opengl { class ProgramObject; } +#include +#include namespace openspace { -namespace documentation { struct Documentation; } - class RenderablePrism : public Renderable { public: explicit RenderablePrism(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rendering/renderablesphere.cpp b/modules/base/rendering/renderablesphere.cpp index 16728b1ae4..1f09a62cff 100644 --- a/modules/base/rendering/renderablesphere.cpp +++ b/modules/base/rendering/renderablesphere.cpp @@ -26,17 +26,24 @@ #include #include -#include #include #include #include #include #include +#include #include #include +#include +#include +#include #include #include #include +#include +#include +#include +#include #include namespace { diff --git a/modules/base/rendering/renderablesphere.h b/modules/base/rendering/renderablesphere.h index 470dde39b5..56a964e807 100644 --- a/modules/base/rendering/renderablesphere.h +++ b/modules/base/rendering/renderablesphere.h @@ -28,20 +28,17 @@ #include #include -#include +#include +#include +#include +#include #include +#include #include - -namespace ghoul::opengl { class ProgramObject; } +#include namespace openspace { -class Sphere; -struct RenderData; -struct UpdateData; - -namespace documentation { struct Documentation; } - class RenderableSphere : public Renderable { public: explicit RenderableSphere(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rendering/renderablesphereimagelocal.cpp b/modules/base/rendering/renderablesphereimagelocal.cpp index 8a2acad954..2f165a5817 100644 --- a/modules/base/rendering/renderablesphereimagelocal.cpp +++ b/modules/base/rendering/renderablesphereimagelocal.cpp @@ -25,12 +25,9 @@ #include #include -#include -#include -#include -#include +#include #include -#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo TextureInfo = { diff --git a/modules/base/rendering/renderablesphereimagelocal.h b/modules/base/rendering/renderablesphereimagelocal.h index 3117a54468..34b02da986 100644 --- a/modules/base/rendering/renderablesphereimagelocal.h +++ b/modules/base/rendering/renderablesphereimagelocal.h @@ -27,17 +27,11 @@ #include +#include #include -namespace ghoul::opengl { class Texture; } - namespace openspace { -struct RenderData; -struct UpdateData; - -namespace documentation { struct Documentation; } - class RenderableSphereImageLocal : public RenderableSphere { public: explicit RenderableSphereImageLocal(const ghoul::Dictionary& dictionary); @@ -56,7 +50,6 @@ protected: void bindTexture() override; private: - properties::StringProperty _texturePath; std::unique_ptr _texture; diff --git a/modules/base/rendering/renderablesphereimageonline.cpp b/modules/base/rendering/renderablesphereimageonline.cpp index 1afe4900f5..5620e59883 100644 --- a/modules/base/rendering/renderablesphereimageonline.cpp +++ b/modules/base/rendering/renderablesphereimageonline.cpp @@ -25,13 +25,14 @@ #include #include -#include +#include #include -#include -#include +#include #include #include +#include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo TextureInfo = { diff --git a/modules/base/rendering/renderablesphereimageonline.h b/modules/base/rendering/renderablesphereimageonline.h index e2a6e4f7e0..c6bc4efabd 100644 --- a/modules/base/rendering/renderablesphereimageonline.h +++ b/modules/base/rendering/renderablesphereimageonline.h @@ -28,18 +28,13 @@ #include #include - -namespace ghoul::opengl { class Texture; } +#include +#include namespace openspace { -struct RenderData; -struct UpdateData; - -namespace documentation { struct Documentation; } - /** - * This class describes a sphere renderable that displays an image from an online source + * This class describes a sphere renderable that displays an image from an online source. */ class RenderableSphereImageOnline : public RenderableSphere { public: diff --git a/modules/base/rendering/renderableswitch.cpp b/modules/base/rendering/renderableswitch.cpp index dacf889e89..844bb14fc9 100644 --- a/modules/base/rendering/renderableswitch.cpp +++ b/modules/base/rendering/renderableswitch.cpp @@ -24,18 +24,11 @@ #include -#include #include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include #include namespace { diff --git a/modules/base/rendering/renderableswitch.h b/modules/base/rendering/renderableswitch.h index 48b8eda97d..e325e92b08 100644 --- a/modules/base/rendering/renderableswitch.h +++ b/modules/base/rendering/renderableswitch.h @@ -27,13 +27,10 @@ #include +#include + namespace openspace { -struct RenderData; -struct UpdateData; - -namespace documentation { struct Documentation; } - class RenderableSwitch : public Renderable { public: explicit RenderableSwitch(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rendering/renderabletimevaryingsphere.cpp b/modules/base/rendering/renderabletimevaryingsphere.cpp index 168c97de13..cd4e0060a7 100644 --- a/modules/base/rendering/renderabletimevaryingsphere.cpp +++ b/modules/base/rendering/renderabletimevaryingsphere.cpp @@ -25,13 +25,15 @@ #include #include -#include -#include +#include #include #include #include -#include #include +#include +#include +#include +#include namespace { // Extract J2000 time from file names diff --git a/modules/base/rendering/renderabletimevaryingsphere.h b/modules/base/rendering/renderabletimevaryingsphere.h index 5bb35a6d92..39f80d5329 100644 --- a/modules/base/rendering/renderabletimevaryingsphere.h +++ b/modules/base/rendering/renderabletimevaryingsphere.h @@ -27,17 +27,14 @@ #include +#include #include +#include namespace ghoul::opengl { class Texture; } namespace openspace { -struct RenderData; -struct UpdateData; - -namespace documentation { struct Documentation; } - class RenderableTimeVaryingSphere : public RenderableSphere { public: explicit RenderableTimeVaryingSphere(const ghoul::Dictionary& dictionary); @@ -59,10 +56,12 @@ private: double time; std::unique_ptr texture; }; + void loadTexture(); void extractMandatoryInfoFromSourceFolder(); void updateActiveTriggerTimeIndex(double currenttime); void computeSequenceEndTime(); + // If there's just one state it should never disappear! double _sequenceEndTime = std::numeric_limits::max(); std::vector _files; diff --git a/modules/base/rendering/renderabletrail.cpp b/modules/base/rendering/renderabletrail.cpp index 0216e9ddfa..daed2265b7 100644 --- a/modules/base/rendering/renderabletrail.cpp +++ b/modules/base/rendering/renderabletrail.cpp @@ -26,16 +26,21 @@ #include #include -#include #include #include #include +#include #include #include +#include +#include #include #include #include +#include +#include #include +#include #include namespace { diff --git a/modules/base/rendering/renderabletrail.h b/modules/base/rendering/renderabletrail.h index a9683b4c8b..cdc8eeaee5 100644 --- a/modules/base/rendering/renderabletrail.h +++ b/modules/base/rendering/renderabletrail.h @@ -28,26 +28,16 @@ #include #include -#include #include #include #include -#include #include -#include #include #include #include -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl - namespace openspace { -namespace documentation { struct Documentation; } - class Translation; /** diff --git a/modules/base/rendering/renderabletrailorbit.cpp b/modules/base/rendering/renderabletrailorbit.cpp index f4cb5c151f..c8c99988f6 100644 --- a/modules/base/rendering/renderabletrailorbit.cpp +++ b/modules/base/rendering/renderabletrailorbit.cpp @@ -25,19 +25,17 @@ #include #include -#include #include #include -#include -#include -#include -#include -#include -#include - -#include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include // This class is using a VBO ring buffer + a constantly updated point as follows: // Structure of the array with a _resolution of 16. FF denotes the floating position that diff --git a/modules/base/rendering/renderabletrailorbit.h b/modules/base/rendering/renderabletrailorbit.h index 9864373f15..9996549079 100644 --- a/modules/base/rendering/renderabletrailorbit.h +++ b/modules/base/rendering/renderabletrailorbit.h @@ -32,8 +32,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - /** * This concrete implementation of a RenderableTrail renders an updated trail behind an * object that is likely to have an orbit-like path. However, this is not required and diff --git a/modules/base/rendering/renderabletrailtrajectory.cpp b/modules/base/rendering/renderabletrailtrajectory.cpp index 990f33c1fb..89efa6cb8b 100644 --- a/modules/base/rendering/renderabletrailtrajectory.cpp +++ b/modules/base/rendering/renderabletrailtrajectory.cpp @@ -25,11 +25,15 @@ #include #include -#include #include #include +#include #include #include +#include +#include +#include +#include #include // This class creates the entire trajectory at once and keeps it in memory the entire diff --git a/modules/base/rendering/renderabletrailtrajectory.h b/modules/base/rendering/renderabletrailtrajectory.h index c23971c272..31adcbd265 100644 --- a/modules/base/rendering/renderabletrailtrajectory.h +++ b/modules/base/rendering/renderabletrailtrajectory.h @@ -31,12 +31,9 @@ #include #include #include -#include namespace openspace { -namespace documentation { struct Documentation; } - /** * This concrete implementation of a RenderableTrail renders a fixed trail, regardless of * its shape. The trail is sampled equitemporal (with an interval of _sampleInterval in diff --git a/modules/base/rendering/screenspacedashboard.cpp b/modules/base/rendering/screenspacedashboard.cpp index 2492f87fc4..2246d68038 100644 --- a/modules/base/rendering/screenspacedashboard.cpp +++ b/modules/base/rendering/screenspacedashboard.cpp @@ -25,16 +25,15 @@ #include #include -#include #include #include -#include #include #include -#include -#include -#include +#include +#include +#include #include +#include #include "screenspacedashboard_lua.inl" diff --git a/modules/base/rendering/screenspacedashboard.h b/modules/base/rendering/screenspacedashboard.h index 21579a4a54..f3920d3716 100644 --- a/modules/base/rendering/screenspacedashboard.h +++ b/modules/base/rendering/screenspacedashboard.h @@ -30,14 +30,8 @@ #include #include -namespace ghoul::fontrendering { - class Font; - class FontRenderer; -} // namespace ghoul::fontrendering - namespace openspace { -namespace documentation { struct Documentation; } namespace scripting { struct LuaLibrary; } class ScreenSpaceDashboard : public ScreenSpaceRenderableFramebuffer { diff --git a/modules/base/rendering/screenspacedashboard_lua.inl b/modules/base/rendering/screenspacedashboard_lua.inl index f448e740a7..fc4f80a705 100644 --- a/modules/base/rendering/screenspacedashboard_lua.inl +++ b/modules/base/rendering/screenspacedashboard_lua.inl @@ -23,6 +23,7 @@ ****************************************************************************************/ #include +#include namespace { diff --git a/modules/base/rendering/screenspacedate.cpp b/modules/base/rendering/screenspacedate.cpp index a4fd2aaf0e..70381151a8 100644 --- a/modules/base/rendering/screenspacedate.cpp +++ b/modules/base/rendering/screenspacedate.cpp @@ -24,12 +24,15 @@ #include +#include +#include #include #include #include +#include #include -#include -#include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo FormatStringInfo = { diff --git a/modules/base/rendering/screenspaceimagelocal.cpp b/modules/base/rendering/screenspaceimagelocal.cpp index c3807618b0..2cb3556d29 100644 --- a/modules/base/rendering/screenspaceimagelocal.cpp +++ b/modules/base/rendering/screenspaceimagelocal.cpp @@ -25,15 +25,15 @@ #include #include -#include #include +#include #include #include -#include +#include #include -#include #include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo TexturePathInfo = { diff --git a/modules/base/rendering/screenspaceimagelocal.h b/modules/base/rendering/screenspaceimagelocal.h index f829a0505f..d9bcd1619c 100644 --- a/modules/base/rendering/screenspaceimagelocal.h +++ b/modules/base/rendering/screenspaceimagelocal.h @@ -33,8 +33,6 @@ namespace ghoul::opengl { class Texture; } namespace openspace { -namespace documentation { struct Documentation; } - class ScreenSpaceImageLocal : public ScreenSpaceRenderable { public: explicit ScreenSpaceImageLocal(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rendering/screenspaceimageonline.cpp b/modules/base/rendering/screenspaceimageonline.cpp index 76eb5dd421..8b3058b03f 100644 --- a/modules/base/rendering/screenspaceimageonline.cpp +++ b/modules/base/rendering/screenspaceimageonline.cpp @@ -25,15 +25,15 @@ #include #include -#include #include #include -#include +#include #include #include #include -#include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "ScreenSpaceImageOnline"; diff --git a/modules/base/rendering/screenspaceimageonline.h b/modules/base/rendering/screenspaceimageonline.h index 23fd1a6f81..5a3f298dd4 100644 --- a/modules/base/rendering/screenspaceimageonline.h +++ b/modules/base/rendering/screenspaceimageonline.h @@ -29,13 +29,12 @@ #include #include +#include namespace ghoul::opengl { class Texture; } namespace openspace { -namespace documentation { struct Documentation; } - class ScreenSpaceImageOnline : public ScreenSpaceRenderable { public: explicit ScreenSpaceImageOnline(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rendering/screenspaceinsetblackout.cpp b/modules/base/rendering/screenspaceinsetblackout.cpp index bcf156a9bf..3a736eaca7 100644 --- a/modules/base/rendering/screenspaceinsetblackout.cpp +++ b/modules/base/rendering/screenspaceinsetblackout.cpp @@ -23,19 +23,25 @@ ****************************************************************************************/ #include -#include +#include #include -#include #include -#include -#include -#include #include #include +#include #include #include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include namespace { constexpr glm::uvec2 BlackoutTextureSize = glm::uvec2(3840, 2160); diff --git a/modules/base/rendering/screenspaceinsetblackout.h b/modules/base/rendering/screenspaceinsetblackout.h index 3ca71e64b8..c96e81b479 100644 --- a/modules/base/rendering/screenspaceinsetblackout.h +++ b/modules/base/rendering/screenspaceinsetblackout.h @@ -28,12 +28,15 @@ #include #include +#include +#include +#include #include +#include +#include namespace openspace { -namespace documentation { struct Documentation; } - class ScreenSpaceInsetBlackout : public ScreenSpaceRenderable { public: explicit ScreenSpaceInsetBlackout(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rendering/screenspacerenderablerenderable.cpp b/modules/base/rendering/screenspacerenderablerenderable.cpp index 48927938c9..434fef691a 100644 --- a/modules/base/rendering/screenspacerenderablerenderable.cpp +++ b/modules/base/rendering/screenspacerenderablerenderable.cpp @@ -25,11 +25,17 @@ #include #include +#include #include #include #include #include +#include #include +#include +#include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo TimeInfo = { diff --git a/modules/base/rendering/screenspacerenderablerenderable.h b/modules/base/rendering/screenspacerenderablerenderable.h index 7905eee1fe..2f39dda1cd 100644 --- a/modules/base/rendering/screenspacerenderablerenderable.h +++ b/modules/base/rendering/screenspacerenderablerenderable.h @@ -27,26 +27,20 @@ #include -#include #include #include #include +#include namespace openspace { -namespace properties { class PropertyOwner; } - class Renderable; class Rotation; class Scale; class Translation; -namespace documentation { struct Documentation; } - class ScreenSpaceRenderableRenderable : public ScreenSpaceRenderableFramebuffer { public: - using RenderFunction = std::function; - explicit ScreenSpaceRenderableRenderable(const ghoul::Dictionary& dictionary); virtual ~ScreenSpaceRenderableRenderable() override; diff --git a/modules/base/rendering/screenspacetext.cpp b/modules/base/rendering/screenspacetext.cpp index aa45a0461a..d0e4e382d7 100644 --- a/modules/base/rendering/screenspacetext.cpp +++ b/modules/base/rendering/screenspacetext.cpp @@ -24,8 +24,9 @@ #include -#include -#include +#include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo TextInfo = { diff --git a/modules/base/rendering/screenspacetimevaryingimageonline.cpp b/modules/base/rendering/screenspacetimevaryingimageonline.cpp index 7edf3b8504..49d88defbd 100644 --- a/modules/base/rendering/screenspacetimevaryingimageonline.cpp +++ b/modules/base/rendering/screenspacetimevaryingimageonline.cpp @@ -25,15 +25,20 @@ #include #include -#include #include #include +#include #include -#include +#include #include #include +#include +#include #include +#include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "ScreenSpaceTimeVaryingImageOnline"; diff --git a/modules/base/rendering/screenspacetimevaryingimageonline.h b/modules/base/rendering/screenspacetimevaryingimageonline.h index 335a8c442c..6fbf195c71 100644 --- a/modules/base/rendering/screenspacetimevaryingimageonline.h +++ b/modules/base/rendering/screenspacetimevaryingimageonline.h @@ -30,13 +30,12 @@ #include #include #include +#include namespace ghoul::opengl { class Texture; } namespace openspace { -namespace documentation { struct Documentation; } - class ScreenSpaceTimeVaryingImageOnline : public ScreenSpaceRenderable { public: explicit ScreenSpaceTimeVaryingImageOnline(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rotation/constantrotation.cpp b/modules/base/rotation/constantrotation.cpp index 92bbd751aa..85987edcc9 100644 --- a/modules/base/rotation/constantrotation.cpp +++ b/modules/base/rotation/constantrotation.cpp @@ -25,8 +25,8 @@ #include #include -#include #include +#include #include #include diff --git a/modules/base/rotation/constantrotation.h b/modules/base/rotation/constantrotation.h index 8ae5b7da4e..b6691f6b55 100644 --- a/modules/base/rotation/constantrotation.h +++ b/modules/base/rotation/constantrotation.h @@ -32,8 +32,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class ConstantRotation : public Rotation { public: explicit ConstantRotation(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rotation/fixedrotation.cpp b/modules/base/rotation/fixedrotation.cpp index 2ac5da5df2..9a9c294d3a 100644 --- a/modules/base/rotation/fixedrotation.cpp +++ b/modules/base/rotation/fixedrotation.cpp @@ -25,15 +25,14 @@ #include #include -#include #include #include #include #include #include +#include #include #include -#include #include namespace { diff --git a/modules/base/rotation/fixedrotation.h b/modules/base/rotation/fixedrotation.h index 9875fb4096..e88ce53c39 100644 --- a/modules/base/rotation/fixedrotation.h +++ b/modules/base/rotation/fixedrotation.h @@ -31,14 +31,11 @@ #include #include #include -#include namespace openspace { class SceneGraphNode; -namespace documentation { struct Documentation; } - class FixedRotation : public Rotation { public: explicit FixedRotation(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rotation/globerotation.cpp b/modules/base/rotation/globerotation.cpp index 9e76e2b98d..26a36d9447 100644 --- a/modules/base/rotation/globerotation.cpp +++ b/modules/base/rotation/globerotation.cpp @@ -25,16 +25,17 @@ #include #include -#include -#include -#include #include #include #include #include #include +#include #include +#include +#include #include +#include namespace { constexpr std::string_view _loggerCat = "GlobeRotation"; diff --git a/modules/base/rotation/luarotation.cpp b/modules/base/rotation/luarotation.cpp index 11ea70a306..08c6e21e53 100644 --- a/modules/base/rotation/luarotation.cpp +++ b/modules/base/rotation/luarotation.cpp @@ -25,16 +25,17 @@ #include #include -#include #include #include #include #include -#include +#include #include #include #include +#include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo ScriptInfo = { diff --git a/modules/base/rotation/luarotation.h b/modules/base/rotation/luarotation.h index 538603c8ac..fe1244d20b 100644 --- a/modules/base/rotation/luarotation.h +++ b/modules/base/rotation/luarotation.h @@ -28,15 +28,13 @@ #include #include - #include +#include namespace ghoul::filesystem { class File; } namespace openspace { -namespace documentation { struct Documentation; } - class LuaRotation : public Rotation { public: explicit LuaRotation(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rotation/multirotation.cpp b/modules/base/rotation/multirotation.cpp index b2c7e7374f..674a2ee4cb 100644 --- a/modules/base/rotation/multirotation.cpp +++ b/modules/base/rotation/multirotation.cpp @@ -25,10 +25,10 @@ #include #include -#include #include -#include -#include +#include +#include +#include namespace { // This Rotation type combines multiple individual rotations that are applied one diff --git a/modules/base/rotation/multirotation.h b/modules/base/rotation/multirotation.h index 8a03d7ce7d..f5438a1fb9 100644 --- a/modules/base/rotation/multirotation.h +++ b/modules/base/rotation/multirotation.h @@ -27,14 +27,8 @@ #include -#include - namespace openspace { -struct UpdateData; - -namespace documentation { struct Documentation; } - class MultiRotation : public Rotation { public: explicit MultiRotation(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rotation/staticrotation.cpp b/modules/base/rotation/staticrotation.cpp index 2106d11c24..c94da01a2e 100644 --- a/modules/base/rotation/staticrotation.cpp +++ b/modules/base/rotation/staticrotation.cpp @@ -25,7 +25,7 @@ #include #include -#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo RotationInfo = { diff --git a/modules/base/rotation/staticrotation.h b/modules/base/rotation/staticrotation.h index 81574e22cf..e08330efe6 100644 --- a/modules/base/rotation/staticrotation.h +++ b/modules/base/rotation/staticrotation.h @@ -31,8 +31,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class StaticRotation : public Rotation { public: explicit StaticRotation(const ghoul::Dictionary& dictionary); diff --git a/modules/base/rotation/timelinerotation.cpp b/modules/base/rotation/timelinerotation.cpp index 139ea611bc..83f2cacf7c 100644 --- a/modules/base/rotation/timelinerotation.cpp +++ b/modules/base/rotation/timelinerotation.cpp @@ -25,11 +25,12 @@ #include #include -#include #include #include #include +#include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo ShouldInterpolateInfo = { diff --git a/modules/base/rotation/timelinerotation.h b/modules/base/rotation/timelinerotation.h index 6dc5ff9021..03e48eb30f 100644 --- a/modules/base/rotation/timelinerotation.h +++ b/modules/base/rotation/timelinerotation.h @@ -32,10 +32,6 @@ namespace openspace { -struct UpdateData; - -namespace documentation { struct Documentation; } - class TimelineRotation : public Rotation { public: explicit TimelineRotation(const ghoul::Dictionary& dictionary); diff --git a/modules/base/scale/luascale.cpp b/modules/base/scale/luascale.cpp index af64764303..9f80d47689 100644 --- a/modules/base/scale/luascale.cpp +++ b/modules/base/scale/luascale.cpp @@ -25,16 +25,17 @@ #include #include -#include #include #include #include #include -#include +#include #include #include #include +#include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo ScriptInfo = { diff --git a/modules/base/scale/luascale.h b/modules/base/scale/luascale.h index 84fb40bfcc..0898c5cf2e 100644 --- a/modules/base/scale/luascale.h +++ b/modules/base/scale/luascale.h @@ -29,13 +29,12 @@ #include #include +#include namespace ghoul::filesystem { class File; } namespace openspace { -namespace documentation { struct Documentation; } - class LuaScale : public Scale { public: explicit LuaScale(const ghoul::Dictionary& dictionary); diff --git a/modules/base/scale/multiscale.cpp b/modules/base/scale/multiscale.cpp index 9d683e4ac6..ea1cd2ec8a 100644 --- a/modules/base/scale/multiscale.cpp +++ b/modules/base/scale/multiscale.cpp @@ -25,10 +25,10 @@ #include #include -#include -#include #include -#include +#include +#include +#include namespace { // This Scale type combines multiple individual scale operations that are applied one diff --git a/modules/base/scale/multiscale.h b/modules/base/scale/multiscale.h index e1b6afec43..d418b1367c 100644 --- a/modules/base/scale/multiscale.h +++ b/modules/base/scale/multiscale.h @@ -29,8 +29,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class MultiScale : public Scale { public: explicit MultiScale(const ghoul::Dictionary& dictionary); diff --git a/modules/base/scale/nonuniformstaticscale.cpp b/modules/base/scale/nonuniformstaticscale.cpp index 22af0f24b5..73fc25f4ce 100644 --- a/modules/base/scale/nonuniformstaticscale.cpp +++ b/modules/base/scale/nonuniformstaticscale.cpp @@ -25,7 +25,7 @@ #include #include -#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo ScaleInfo = { diff --git a/modules/base/scale/nonuniformstaticscale.h b/modules/base/scale/nonuniformstaticscale.h index 665126dad6..7cb5ab07c6 100644 --- a/modules/base/scale/nonuniformstaticscale.h +++ b/modules/base/scale/nonuniformstaticscale.h @@ -31,8 +31,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class NonUniformStaticScale : public Scale { public: explicit NonUniformStaticScale(const ghoul::Dictionary& dictionary); diff --git a/modules/base/scale/staticscale.cpp b/modules/base/scale/staticscale.cpp index baf2003c0f..df42fada0d 100644 --- a/modules/base/scale/staticscale.cpp +++ b/modules/base/scale/staticscale.cpp @@ -25,7 +25,6 @@ #include #include -#include namespace { constexpr openspace::properties::Property::PropertyInfo ScaleInfo = { diff --git a/modules/base/scale/staticscale.h b/modules/base/scale/staticscale.h index 3ce38c3241..a5fc5ce15c 100644 --- a/modules/base/scale/staticscale.h +++ b/modules/base/scale/staticscale.h @@ -31,8 +31,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class StaticScale : public Scale { public: explicit StaticScale(const ghoul::Dictionary& dictionary); diff --git a/modules/base/scale/timedependentscale.cpp b/modules/base/scale/timedependentscale.cpp index 3639b27da2..e640e39de7 100644 --- a/modules/base/scale/timedependentscale.cpp +++ b/modules/base/scale/timedependentscale.cpp @@ -25,9 +25,10 @@ #include #include -#include #include #include +#include +#include #include namespace { diff --git a/modules/base/scale/timedependentscale.h b/modules/base/scale/timedependentscale.h index 9c70a6243f..67f2ac0b73 100644 --- a/modules/base/scale/timedependentscale.h +++ b/modules/base/scale/timedependentscale.h @@ -33,8 +33,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class TimeDependentScale : public Scale { public: explicit TimeDependentScale(const ghoul::Dictionary& dictionary); diff --git a/modules/base/scale/timelinescale.cpp b/modules/base/scale/timelinescale.cpp index 091e61fdd7..d422f552d2 100644 --- a/modules/base/scale/timelinescale.cpp +++ b/modules/base/scale/timelinescale.cpp @@ -25,11 +25,12 @@ #include #include -#include #include #include #include +#include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo ShouldInterpolateInfo = { diff --git a/modules/base/scale/timelinescale.h b/modules/base/scale/timelinescale.h index a298627311..c46113a97c 100644 --- a/modules/base/scale/timelinescale.h +++ b/modules/base/scale/timelinescale.h @@ -29,14 +29,9 @@ #include #include -#include namespace openspace { -struct UpdateData; - -namespace documentation { struct Documentation; } - class TimelineScale : public Scale { public: explicit TimelineScale(const ghoul::Dictionary& dictionary); diff --git a/modules/base/task/convertmodeltask.cpp b/modules/base/task/convertmodeltask.cpp index a39724d713..606495c086 100644 --- a/modules/base/task/convertmodeltask.cpp +++ b/modules/base/task/convertmodeltask.cpp @@ -24,8 +24,10 @@ #include +#include #include #include +#include namespace { // This task converts a 3D model format from a format that is natively supported both diff --git a/modules/base/task/convertmodeltask.h b/modules/base/task/convertmodeltask.h index d481b0e19d..226ffc1f35 100644 --- a/modules/base/task/convertmodeltask.h +++ b/modules/base/task/convertmodeltask.h @@ -28,7 +28,6 @@ #include #include -#include namespace openspace { diff --git a/modules/base/timeframe/timeframeinterval.cpp b/modules/base/timeframe/timeframeinterval.cpp index f2a0bf676d..91ff793e44 100644 --- a/modules/base/timeframe/timeframeinterval.cpp +++ b/modules/base/timeframe/timeframeinterval.cpp @@ -25,10 +25,12 @@ #include #include -#include #include #include +#include #include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo HasStartInfo = { diff --git a/modules/base/timeframe/timeframeinterval.h b/modules/base/timeframe/timeframeinterval.h index ab375a5b0c..98c798a668 100644 --- a/modules/base/timeframe/timeframeinterval.h +++ b/modules/base/timeframe/timeframeinterval.h @@ -27,15 +27,11 @@ #include -#include #include +#include namespace openspace { -class Time; - -namespace documentation { struct Documentation; } - class TimeFrameInterval : public TimeFrame { public: explicit TimeFrameInterval(const ghoul::Dictionary& dictionary); diff --git a/modules/base/timeframe/timeframeunion.cpp b/modules/base/timeframe/timeframeunion.cpp index 54c2f07088..56f585a36b 100644 --- a/modules/base/timeframe/timeframeunion.cpp +++ b/modules/base/timeframe/timeframeunion.cpp @@ -26,9 +26,11 @@ #include #include -#include -#include #include +#include +#include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo TimeFramesInfo = { diff --git a/modules/base/timeframe/timeframeunion.h b/modules/base/timeframe/timeframeunion.h index 260bcda265..ec9a610b83 100644 --- a/modules/base/timeframe/timeframeunion.h +++ b/modules/base/timeframe/timeframeunion.h @@ -29,10 +29,6 @@ namespace openspace { -class Time; - -namespace documentation { struct Documentation; } - class TimeFrameUnion : public TimeFrame { public: explicit TimeFrameUnion(const ghoul::Dictionary& dictionary); diff --git a/modules/base/translation/globetranslation.cpp b/modules/base/translation/globetranslation.cpp index 41e60d9433..93d70b8e80 100644 --- a/modules/base/translation/globetranslation.cpp +++ b/modules/base/translation/globetranslation.cpp @@ -24,17 +24,16 @@ #include -#include #include -#include -#include -#include #include #include #include #include #include +#include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "GlobeTranslation"; diff --git a/modules/base/translation/luatranslation.cpp b/modules/base/translation/luatranslation.cpp index 9af55740ca..faffd978b3 100644 --- a/modules/base/translation/luatranslation.cpp +++ b/modules/base/translation/luatranslation.cpp @@ -25,17 +25,17 @@ #include #include -#include #include #include #include #include -#include #include #include #include #include +#include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo ScriptInfo = { diff --git a/modules/base/translation/luatranslation.h b/modules/base/translation/luatranslation.h index e5cd7fc360..3530de2081 100644 --- a/modules/base/translation/luatranslation.h +++ b/modules/base/translation/luatranslation.h @@ -35,8 +35,6 @@ namespace ghoul::filesystem { class File; } namespace openspace { -namespace documentation { struct Documentation; } - class LuaTranslation : public Translation { public: explicit LuaTranslation(const ghoul::Dictionary& dictionary); diff --git a/modules/base/translation/multitranslation.cpp b/modules/base/translation/multitranslation.cpp index c368d915c8..bab4eb7c45 100644 --- a/modules/base/translation/multitranslation.cpp +++ b/modules/base/translation/multitranslation.cpp @@ -25,10 +25,10 @@ #include #include -#include #include -#include -#include +#include +#include +#include namespace { // This Translation type combines multiple translations that are applied one after the diff --git a/modules/base/translation/multitranslation.h b/modules/base/translation/multitranslation.h index 4a69d65d82..3fd1e78577 100644 --- a/modules/base/translation/multitranslation.h +++ b/modules/base/translation/multitranslation.h @@ -29,10 +29,6 @@ namespace openspace { -struct UpdateData; - -namespace documentation { struct Documentation; } - class MultiTranslation : public Translation { public: explicit MultiTranslation(const ghoul::Dictionary& dictionary); diff --git a/modules/base/translation/statictranslation.cpp b/modules/base/translation/statictranslation.cpp index a74fccb2e0..95a3614f32 100644 --- a/modules/base/translation/statictranslation.cpp +++ b/modules/base/translation/statictranslation.cpp @@ -25,7 +25,6 @@ #include #include -#include namespace { constexpr openspace::properties::Property::PropertyInfo PositionInfo = { diff --git a/modules/base/translation/statictranslation.h b/modules/base/translation/statictranslation.h index 81bff8cc33..d6991a010c 100644 --- a/modules/base/translation/statictranslation.h +++ b/modules/base/translation/statictranslation.h @@ -31,10 +31,6 @@ namespace openspace { -struct UpdateData; - -namespace documentation { struct Documentation; } - class StaticTranslation : public Translation { public: explicit StaticTranslation(const ghoul::Dictionary& dictionary); diff --git a/modules/base/translation/timelinetranslation.cpp b/modules/base/translation/timelinetranslation.cpp index 3899accd81..55d659082b 100644 --- a/modules/base/translation/timelinetranslation.cpp +++ b/modules/base/translation/timelinetranslation.cpp @@ -25,11 +25,12 @@ #include #include -#include #include #include #include +#include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo ShouldInterpolateInfo = { diff --git a/modules/base/translation/timelinetranslation.h b/modules/base/translation/timelinetranslation.h index 17059ddc30..839d61d1f6 100644 --- a/modules/base/translation/timelinetranslation.h +++ b/modules/base/translation/timelinetranslation.h @@ -29,14 +29,9 @@ #include #include -#include namespace openspace { -struct UpdateData; - -namespace documentation { struct Documentation; } - class TimelineTranslation : public Translation { public: explicit TimelineTranslation(const ghoul::Dictionary& dictionary); diff --git a/modules/cefwebgui/cefwebguimodule.cpp b/modules/cefwebgui/cefwebguimodule.cpp index d6ac7688cb..c3713bb680 100644 --- a/modules/cefwebgui/cefwebguimodule.cpp +++ b/modules/cefwebgui/cefwebguimodule.cpp @@ -37,6 +37,7 @@ #include #include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo EnabledInfo = { diff --git a/modules/cefwebgui/cefwebguimodule.h b/modules/cefwebgui/cefwebguimodule.h index 6c171cf175..9843501015 100644 --- a/modules/cefwebgui/cefwebguimodule.h +++ b/modules/cefwebgui/cefwebguimodule.h @@ -32,6 +32,7 @@ #include #include #include +#include namespace openspace { diff --git a/modules/cefwebgui/include/guirenderhandler.h b/modules/cefwebgui/include/guirenderhandler.h index 7712c5b43e..1680e4e56e 100644 --- a/modules/cefwebgui/include/guirenderhandler.h +++ b/modules/cefwebgui/include/guirenderhandler.h @@ -27,7 +27,6 @@ #include -#include #include namespace ghoul::opengl { class ProgramObject; } diff --git a/modules/cefwebgui/src/guikeyboardhandler.cpp b/modules/cefwebgui/src/guikeyboardhandler.cpp index 109d856c97..d0c31d963c 100644 --- a/modules/cefwebgui/src/guikeyboardhandler.cpp +++ b/modules/cefwebgui/src/guikeyboardhandler.cpp @@ -25,6 +25,7 @@ #include #include +#include namespace openspace { diff --git a/modules/cefwebgui/src/guirenderhandler.cpp b/modules/cefwebgui/src/guirenderhandler.cpp index 9c61b81344..48e25a119d 100644 --- a/modules/cefwebgui/src/guirenderhandler.cpp +++ b/modules/cefwebgui/src/guirenderhandler.cpp @@ -24,11 +24,12 @@ #include -#include #include #include +#include #include #include +#include namespace { constexpr std::string_view _loggerCat = "WebGUI:RenderHandler"; diff --git a/modules/debugging/debuggingmodule.cpp b/modules/debugging/debuggingmodule.cpp index f6c381d316..253bc39e52 100644 --- a/modules/debugging/debuggingmodule.cpp +++ b/modules/debugging/debuggingmodule.cpp @@ -30,21 +30,16 @@ #include #include #include -#include -#include -#include -#include #include -#include -#include -#include #include #include #include #include #include -#include +#include #include +#include +#include #include #include "debuggingmodule_lua.inl" diff --git a/modules/debugging/debuggingmodule_lua.inl b/modules/debugging/debuggingmodule_lua.inl index 9d7af12c0a..acae63d9a6 100644 --- a/modules/debugging/debuggingmodule_lua.inl +++ b/modules/debugging/debuggingmodule_lua.inl @@ -24,6 +24,10 @@ #include #include +#include +#include +#include +#include namespace { diff --git a/modules/debugging/rendering/debugrenderer.cpp b/modules/debugging/rendering/debugrenderer.cpp index 322441c7c1..5f926cdce5 100644 --- a/modules/debugging/rendering/debugrenderer.cpp +++ b/modules/debugging/rendering/debugrenderer.cpp @@ -24,12 +24,17 @@ #include +#include #include #include +#include #include #include #include #include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "DebugRenderer"; diff --git a/modules/debugging/rendering/screenspacedebugplane.cpp b/modules/debugging/rendering/screenspacedebugplane.cpp index ec48a80a38..84b12d2d66 100644 --- a/modules/debugging/rendering/screenspacedebugplane.cpp +++ b/modules/debugging/rendering/screenspacedebugplane.cpp @@ -25,6 +25,8 @@ #include #include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo TextureInfo = { diff --git a/modules/digitaluniverse/digitaluniversemodule.cpp b/modules/digitaluniverse/digitaluniversemodule.cpp index 47fb5decdd..6803c91e0a 100644 --- a/modules/digitaluniverse/digitaluniversemodule.cpp +++ b/modules/digitaluniverse/digitaluniversemodule.cpp @@ -29,7 +29,10 @@ #include #include #include +#include +#include #include +#include namespace openspace { diff --git a/modules/digitaluniverse/rendering/renderabledumeshes.cpp b/modules/digitaluniverse/rendering/renderabledumeshes.cpp index 992ff7f984..613de291e4 100644 --- a/modules/digitaluniverse/rendering/renderabledumeshes.cpp +++ b/modules/digitaluniverse/rendering/renderabledumeshes.cpp @@ -26,28 +26,26 @@ #include #include -#include #include #include #include #include -#include #include #include #include -#include -#include -#include +#include +#include #include +#include +#include +#include #include #include -#include -#include -#include -#include -#include +#include +#include #include -#include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderableDUMeshes"; diff --git a/modules/digitaluniverse/rendering/renderabledumeshes.h b/modules/digitaluniverse/rendering/renderabledumeshes.h index 8b678db611..5643d80efe 100644 --- a/modules/digitaluniverse/rendering/renderabledumeshes.h +++ b/modules/digitaluniverse/rendering/renderabledumeshes.h @@ -29,7 +29,6 @@ #include #include -#include #include #include #include @@ -38,19 +37,13 @@ #include #include #include +#include #include -namespace ghoul::filesystem { class File; } namespace ghoul::fontrendering { class Font; } -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl namespace openspace { -namespace documentation { struct Documentation; } - class RenderableDUMeshes : public Renderable { public: explicit RenderableDUMeshes(const ghoul::Dictionary& dictionary); diff --git a/modules/exoplanets/datastructure.cpp b/modules/exoplanets/datastructure.cpp index 9f9b0ceb92..3404678a7f 100644 --- a/modules/exoplanets/datastructure.cpp +++ b/modules/exoplanets/datastructure.cpp @@ -25,11 +25,16 @@ #include #include +#include #include #include #include -#include +#include #include +#include +#include +#include +#include #include namespace { diff --git a/modules/exoplanets/datastructure.h b/modules/exoplanets/datastructure.h index 4b592a0b48..8edabd6bb3 100644 --- a/modules/exoplanets/datastructure.h +++ b/modules/exoplanets/datastructure.h @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #include diff --git a/modules/exoplanets/exoplanetshelper.cpp b/modules/exoplanets/exoplanetshelper.cpp index 488f2ed910..a29e7d17c7 100644 --- a/modules/exoplanets/exoplanetshelper.cpp +++ b/modules/exoplanets/exoplanetshelper.cpp @@ -28,16 +28,18 @@ #include #include #include -#include #include #include #include #include -#include #include -#include +#include #include #include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "ExoplanetsModule"; diff --git a/modules/exoplanets/exoplanetshelper.h b/modules/exoplanets/exoplanetshelper.h index 7acaf2c471..34887dc22f 100644 --- a/modules/exoplanets/exoplanetshelper.h +++ b/modules/exoplanets/exoplanetshelper.h @@ -26,7 +26,6 @@ #define __OPENSPACE_MODULE_EXOPLANETS___EXOPLANETSHELPER___H__ #include -#include #include namespace openspace::exoplanets { diff --git a/modules/exoplanets/exoplanetsmodule.cpp b/modules/exoplanets/exoplanetsmodule.cpp index f758fdcb63..f12e960c9c 100644 --- a/modules/exoplanets/exoplanetsmodule.cpp +++ b/modules/exoplanets/exoplanetsmodule.cpp @@ -25,27 +25,18 @@ #include #include -#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include +#include #include -#include -#include #include #include #include #include #include -#include -#include +#include +#include +#include #include #include "exoplanetsmodule_lua.inl" diff --git a/modules/exoplanets/exoplanetsmodule.h b/modules/exoplanets/exoplanetsmodule.h index 3fbe451075..2e28f14ad8 100644 --- a/modules/exoplanets/exoplanetsmodule.h +++ b/modules/exoplanets/exoplanetsmodule.h @@ -32,6 +32,7 @@ #include #include #include +#include #include namespace openspace { diff --git a/modules/exoplanets/exoplanetsmodule_lua.inl b/modules/exoplanets/exoplanetsmodule_lua.inl index 587cfcfe99..d13c4321fc 100644 --- a/modules/exoplanets/exoplanetsmodule_lua.inl +++ b/modules/exoplanets/exoplanetsmodule_lua.inl @@ -25,7 +25,10 @@ #include #include #include +#include +#include #include +#include #include #include #include diff --git a/modules/exoplanets/rendering/renderableorbitdisc.cpp b/modules/exoplanets/rendering/renderableorbitdisc.cpp index 786576054d..19ac3a7a9d 100644 --- a/modules/exoplanets/rendering/renderableorbitdisc.cpp +++ b/modules/exoplanets/rendering/renderableorbitdisc.cpp @@ -25,19 +25,16 @@ #include #include -#include #include #include -#include -#include -#include -#include +#include #include +#include #include #include +#include #include #include -#include namespace { constexpr openspace::properties::Property::PropertyInfo TextureInfo = { diff --git a/modules/exoplanets/rendering/renderableorbitdisc.h b/modules/exoplanets/rendering/renderableorbitdisc.h index f2676ef0f1..9a890764fe 100644 --- a/modules/exoplanets/rendering/renderableorbitdisc.h +++ b/modules/exoplanets/rendering/renderableorbitdisc.h @@ -33,16 +33,11 @@ #include #include #include -#include #include - -namespace ghoul::filesystem { class File; } -namespace ghoul::opengl { class ProgramObject; } // namespace ghoul::opengl +#include namespace openspace { -namespace documentation { struct Documentation; } - class RenderableOrbitDisc : public Renderable { public: explicit RenderableOrbitDisc(const ghoul::Dictionary& dictionary); diff --git a/modules/exoplanets/tasks/exoplanetsdatapreparationtask.cpp b/modules/exoplanets/tasks/exoplanetsdatapreparationtask.cpp index cd07d51cac..9701130322 100644 --- a/modules/exoplanets/tasks/exoplanetsdatapreparationtask.cpp +++ b/modules/exoplanets/tasks/exoplanetsdatapreparationtask.cpp @@ -24,9 +24,7 @@ #include -#include #include -#include #include #include #include @@ -35,8 +33,11 @@ #include #include #include -#include -#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "ExoplanetsDataPreparationTask"; diff --git a/modules/exoplanets/tasks/exoplanetsdatapreparationtask.h b/modules/exoplanets/tasks/exoplanetsdatapreparationtask.h index 5291c46481..a773873976 100644 --- a/modules/exoplanets/tasks/exoplanetsdatapreparationtask.h +++ b/modules/exoplanets/tasks/exoplanetsdatapreparationtask.h @@ -28,9 +28,8 @@ #include #include -#include #include -#include +#include namespace openspace::exoplanets { diff --git a/modules/fieldlines/fieldlinesmodule.cpp b/modules/fieldlines/fieldlinesmodule.cpp index 74957005e6..b48274d6aa 100644 --- a/modules/fieldlines/fieldlinesmodule.cpp +++ b/modules/fieldlines/fieldlinesmodule.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include namespace openspace { diff --git a/modules/fieldlines/rendering/renderablefieldlines.cpp b/modules/fieldlines/rendering/renderablefieldlines.cpp index 201a3e3a51..928a8c527d 100644 --- a/modules/fieldlines/rendering/renderablefieldlines.cpp +++ b/modules/fieldlines/rendering/renderablefieldlines.cpp @@ -29,13 +29,18 @@ #include #include #include -#include #include +#include #include #include +#include +#include #include #include +#include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderableFieldlines"; diff --git a/modules/fieldlines/rendering/renderablefieldlines.h b/modules/fieldlines/rendering/renderablefieldlines.h index d75c989fd2..561491ccf5 100644 --- a/modules/fieldlines/rendering/renderablefieldlines.h +++ b/modules/fieldlines/rendering/renderablefieldlines.h @@ -34,8 +34,7 @@ #include #include #include - -namespace ghoul::opengl { class ProgramObject; } +#include namespace openspace { @@ -54,7 +53,7 @@ public: void update(const UpdateData& data) override; private: - typedef std::vector Line; + using Line = std::vector; void initializeDefaultPropertyValues(); void loadSeedPoints(); diff --git a/modules/fieldlinessequence/fieldlinessequencemodule.cpp b/modules/fieldlinessequence/fieldlinessequencemodule.cpp index 6aef48fc51..a0edd4a4c2 100644 --- a/modules/fieldlinessequence/fieldlinessequencemodule.cpp +++ b/modules/fieldlinessequence/fieldlinessequencemodule.cpp @@ -30,8 +30,11 @@ #include #include #include +#include #include #include +#include +#include namespace { constexpr std::string_view DefaultTransferfunctionSource = diff --git a/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp b/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp index c40f9e1a17..ca2fd838fa 100644 --- a/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp +++ b/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp @@ -30,14 +30,24 @@ #include #include #include +#include +#include #include #include #include +#include +#include +#include +#include +#include #include #include #include -#include -#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderableFieldlinesSequence"; diff --git a/modules/fieldlinessequence/rendering/renderablefieldlinessequence.h b/modules/fieldlinessequence/rendering/renderablefieldlinessequence.h index b04d395c1f..d65ed7e2ec 100644 --- a/modules/fieldlinessequence/rendering/renderablefieldlinessequence.h +++ b/modules/fieldlinessequence/rendering/renderablefieldlinessequence.h @@ -27,17 +27,21 @@ #include +#include #include #include #include #include +#include +#include #include #include #include #include #include +#include #include -#include +#include namespace openspace { diff --git a/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.cpp b/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.cpp index 64d2d1efda..a59a898020 100644 --- a/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.cpp +++ b/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.cpp @@ -26,13 +26,18 @@ #include #include -#include -#include -#include +#include +#include #include -#include +#include #include -#include +#include +#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "KameleonVolumeToFieldlinesTask"; diff --git a/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.h b/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.h index f0dbd70a8c..123d2f4701 100644 --- a/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.h +++ b/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.h @@ -27,7 +27,7 @@ #include -#include +#include namespace openspace { diff --git a/modules/fieldlinessequence/util/fieldlinesstate.cpp b/modules/fieldlinessequence/util/fieldlinesstate.cpp index ce7ac509b1..a5d569a4fe 100644 --- a/modules/fieldlinessequence/util/fieldlinesstate.cpp +++ b/modules/fieldlinessequence/util/fieldlinesstate.cpp @@ -28,9 +28,17 @@ #include #include #include +#include #include +#include +#include +#include #include #include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "FieldlinesState"; diff --git a/modules/fieldlinessequence/util/kameleonfieldlinehelper.cpp b/modules/fieldlinessequence/util/kameleonfieldlinehelper.cpp index 1597adf846..78cddda56f 100644 --- a/modules/fieldlinessequence/util/kameleonfieldlinehelper.cpp +++ b/modules/fieldlinessequence/util/kameleonfieldlinehelper.cpp @@ -29,12 +29,20 @@ #include #include #include +#include #include +#include +#include #include #include +#include +#include +#include #ifdef OPENSPACE_MODULE_KAMELEON_ENABLED +#include + #ifdef _MSC_VER #pragma warning (push) // Boost throws #pragma warning: there is no warning number '4675' @@ -42,9 +50,10 @@ #endif // _MSC_VER #include +#include #include +#include #include -#include #ifdef _MSC_VER #pragma warning (pop) @@ -89,12 +98,12 @@ bool convertCdfToFieldlinesState(FieldlinesState& state, const std::string& cdfP return false; #else // OPENSPACE_MODULE_KAMELEON_ENABLED // Create Kameleon object and open CDF file! - std::unique_ptr kameleon = kameleonHelper::createKameleonObject( + std::unique_ptr kameleon = kameleonhelper::createKameleonObject( cdfPath ); state.setModel(fls::stringToModel(kameleon->getModelName())); - double cdfDoubleTime = kameleonHelper::getTime(kameleon.get(), manualTimeOffset); + double cdfDoubleTime = kameleonhelper::getTime(kameleon.get(), manualTimeOffset); state.setTriggerTime(cdfDoubleTime); // get time as string. diff --git a/modules/fieldlinessequence/util/kameleonfieldlinehelper.h b/modules/fieldlinessequence/util/kameleonfieldlinehelper.h index 330786c79c..02c0ff59d9 100644 --- a/modules/fieldlinessequence/util/kameleonfieldlinehelper.h +++ b/modules/fieldlinessequence/util/kameleonfieldlinehelper.h @@ -26,6 +26,7 @@ #define __OPENSPACE_MODULE_FIELDLINESSEQUENCE___KAMELEONFIELDLINEHELPER___H__ #include +#include #include #include #include diff --git a/modules/fitsfilereader/fitsfilereadermodule.cpp b/modules/fitsfilereader/fitsfilereadermodule.cpp index 78436d37c6..8433e0b998 100644 --- a/modules/fitsfilereader/fitsfilereadermodule.cpp +++ b/modules/fitsfilereader/fitsfilereadermodule.cpp @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include namespace openspace { diff --git a/modules/fitsfilereader/include/fitsfilereader.h b/modules/fitsfilereader/include/fitsfilereader.h index 4cfd388b64..defad123a0 100644 --- a/modules/fitsfilereader/include/fitsfilereader.h +++ b/modules/fitsfilereader/include/fitsfilereader.h @@ -39,8 +39,6 @@ namespace CCfits { class ExtHDU; } // namespace CCfits -namespace ghoul::opengl { class Texture; } - namespace openspace { template diff --git a/modules/fitsfilereader/include/renderabletimevaryingfitssphere.h b/modules/fitsfilereader/include/renderabletimevaryingfitssphere.h index 4aca6a74aa..e3eea39bf2 100644 --- a/modules/fitsfilereader/include/renderabletimevaryingfitssphere.h +++ b/modules/fitsfilereader/include/renderabletimevaryingfitssphere.h @@ -27,16 +27,18 @@ #include +#include #include +#include #include +#include #include +#include +#include +#include namespace openspace { -struct RenderData; -struct UpdateData; -namespace documentation { struct Documentation; } - class RenderableTimeVaryingFitsSphere : public RenderableSphere { public: enum class LoadingType { diff --git a/modules/fitsfilereader/include/wsafitshelper.h b/modules/fitsfilereader/include/wsafitshelper.h index 5e70e350fc..d5117f2fec 100644 --- a/modules/fitsfilereader/include/wsafitshelper.h +++ b/modules/fitsfilereader/include/wsafitshelper.h @@ -25,15 +25,12 @@ #ifndef __OPENSPACE_MODULE_FITSFILEREADER___WSAFITSHELPER___H__ #define __OPENSPACE_MODULE_FITSFILEREADER___WSAFITSHELPER___H__ -#include -#include +#include +#include +#include #include -namespace CCfits { - class FITS; - class PHDU; - class ExtHDU; -} // namespace CCfits +namespace ghoul::opengl { class Texture; } namespace openspace { diff --git a/modules/fitsfilereader/src/fitsfilereader.cpp b/modules/fitsfilereader/src/fitsfilereader.cpp index 409cb7a8a9..c371d1ac39 100644 --- a/modules/fitsfilereader/src/fitsfilereader.cpp +++ b/modules/fitsfilereader/src/fitsfilereader.cpp @@ -27,9 +27,15 @@ #include #include #include -#include +#include #include +#include #include +#include +#include +#include +#include +#include #ifdef WIN32 #pragma warning (push) @@ -44,7 +50,6 @@ #pragma warning (pop) #endif // WIN32 - using namespace CCfits; namespace { diff --git a/modules/fitsfilereader/src/renderabletimevaryingfitssphere.cpp b/modules/fitsfilereader/src/renderabletimevaryingfitssphere.cpp index de8fd9df63..4f322bb344 100644 --- a/modules/fitsfilereader/src/renderabletimevaryingfitssphere.cpp +++ b/modules/fitsfilereader/src/renderabletimevaryingfitssphere.cpp @@ -26,18 +26,22 @@ #include #include -#include #include #include -#include +#include #include #include -#include -#include -#include +#include +#include #include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderableTimeVaryingFitsSphere"; diff --git a/modules/fitsfilereader/src/wsafitshelper.cpp b/modules/fitsfilereader/src/wsafitshelper.cpp index 0b33686d2a..b1bc053f61 100644 --- a/modules/fitsfilereader/src/wsafitshelper.cpp +++ b/modules/fitsfilereader/src/wsafitshelper.cpp @@ -23,11 +23,20 @@ ****************************************************************************************/ #include + +#include #include +#include #include #include +#include +#include +#include +#include -constexpr std::string_view _loggerCat = "RenderableTimeVaryingSphere"; +namespace { + constexpr std::string_view _loggerCat = "RenderableTimeVaryingSphere"; +} // namespace using namespace CCfits; diff --git a/modules/gaia/gaiamodule.cpp b/modules/gaia/gaiamodule.cpp index 73ef37aa9b..d962edaf29 100644 --- a/modules/gaia/gaiamodule.cpp +++ b/modules/gaia/gaiamodule.cpp @@ -32,8 +32,12 @@ #include #include #include +#include #include #include +#include +#include +#include namespace openspace { diff --git a/modules/gaia/gaiamodule.h b/modules/gaia/gaiamodule.h index 8962e068e7..81f84da7ba 100644 --- a/modules/gaia/gaiamodule.h +++ b/modules/gaia/gaiamodule.h @@ -27,8 +27,6 @@ #include -#include - namespace openspace { class GaiaModule : public OpenSpaceModule { diff --git a/modules/gaia/rendering/gaiaoptions.h b/modules/gaia/rendering/gaiaoptions.h index 4331e8b3c7..544412bbc3 100644 --- a/modules/gaia/rendering/gaiaoptions.h +++ b/modules/gaia/rendering/gaiaoptions.h @@ -29,24 +29,24 @@ namespace openspace::gaia { enum RenderMode { Static = 0, - Color = 1, - Motion = 2 + Color, + Motion }; enum FileReaderOption { Fits = 0, - Speck = 1, - BinaryRaw = 2, - BinaryOctree = 3, - StreamOctree = 4 + Speck, + BinaryRaw, + BinaryOctree, + StreamOctree }; enum ShaderOption { PointSSBO = 0, - PointVBO = 1, - BillboardSSBO = 2, - BillboardVBO = 3, - BillboardSSBONoFBO = 4 + PointVBO, + BillboardSSBO, + BillboardVBO, + BillboardSSBONoFBO }; } // namespace openspace::gaiamission diff --git a/modules/gaia/rendering/octreeculler.cpp b/modules/gaia/rendering/octreeculler.cpp index 728655c1c0..e7140f020c 100644 --- a/modules/gaia/rendering/octreeculler.cpp +++ b/modules/gaia/rendering/octreeculler.cpp @@ -25,7 +25,7 @@ #include #include -#include +#include namespace openspace { diff --git a/modules/gaia/rendering/octreeculler.h b/modules/gaia/rendering/octreeculler.h index f7b3378c85..62c280f048 100644 --- a/modules/gaia/rendering/octreeculler.h +++ b/modules/gaia/rendering/octreeculler.h @@ -40,7 +40,6 @@ namespace openspace { */ class OctreeCuller { public: - /** * \param viewFrustum This is the view space in normalized device coordinates space. * Hence it is an axis aligned bounding box and not a real frustum diff --git a/modules/gaia/rendering/octreemanager.cpp b/modules/gaia/rendering/octreemanager.cpp index eab557afaa..0a1349d86b 100644 --- a/modules/gaia/rendering/octreemanager.cpp +++ b/modules/gaia/rendering/octreemanager.cpp @@ -25,11 +25,13 @@ #include #include +#include #include #include -#include #include -#include +#include +#include +#include #include namespace { diff --git a/modules/gaia/rendering/octreemanager.h b/modules/gaia/rendering/octreemanager.h index bca9d93561..780d4acc49 100644 --- a/modules/gaia/rendering/octreemanager.h +++ b/modules/gaia/rendering/octreemanager.h @@ -26,14 +26,19 @@ #define __OPENSPACE_MODULE_GAIA___OCTREEMANAGER___H__ #include +#include #include -#include #include #include +#include #include +#include #include #include +#include #include +#include +#include #include namespace openspace { diff --git a/modules/gaia/rendering/renderablegaiastars.cpp b/modules/gaia/rendering/renderablegaiastars.cpp index 75affcf0e0..798a20fabd 100644 --- a/modules/gaia/rendering/renderablegaiastars.cpp +++ b/modules/gaia/rendering/renderablegaiastars.cpp @@ -26,19 +26,20 @@ #include #include -#include #include -#include #include -#include #include #include -#include +#include #include +#include #include #include #include -#include +#include +#include +#include +#include #include #include #include @@ -46,6 +47,11 @@ #include #include #include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderableGaiaStars"; diff --git a/modules/gaia/rendering/renderablegaiastars.h b/modules/gaia/rendering/renderablegaiastars.h index a5add6a272..a8a9b85c19 100644 --- a/modules/gaia/rendering/renderablegaiastars.h +++ b/modules/gaia/rendering/renderablegaiastars.h @@ -27,29 +27,27 @@ #include +#include #include #include #include #include -#include #include #include #include #include +#include #include #include #include +#include +#include +#include namespace ghoul::filesystem { class File; } -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl namespace openspace { -namespace documentation { struct Documentation; } - class RenderableGaiaStars : public Renderable { public: explicit RenderableGaiaStars(const ghoul::Dictionary& dictionary); diff --git a/modules/gaia/tasks/constructoctreetask.cpp b/modules/gaia/tasks/constructoctreetask.cpp index 37cc857bc3..eb1d6604e1 100644 --- a/modules/gaia/tasks/constructoctreetask.cpp +++ b/modules/gaia/tasks/constructoctreetask.cpp @@ -25,14 +25,18 @@ #include #include -#include #include #include #include #include -#include +#include +#include #include +#include +#include +#include #include +#include namespace { constexpr std::string_view _loggerCat = "ConstructOctreeTask"; diff --git a/modules/gaia/tasks/constructoctreetask.h b/modules/gaia/tasks/constructoctreetask.h index cc6d8081b6..2fd950253b 100644 --- a/modules/gaia/tasks/constructoctreetask.h +++ b/modules/gaia/tasks/constructoctreetask.h @@ -27,9 +27,10 @@ #include -#include #include +#include #include +#include namespace openspace { diff --git a/modules/gaia/tasks/readfilejob.cpp b/modules/gaia/tasks/readfilejob.cpp index b3432e3be4..b81becda5d 100644 --- a/modules/gaia/tasks/readfilejob.cpp +++ b/modules/gaia/tasks/readfilejob.cpp @@ -24,10 +24,13 @@ #include -#include #include #include -#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "ReadFileJob"; diff --git a/modules/gaia/tasks/readfilejob.h b/modules/gaia/tasks/readfilejob.h index 1459f2f2e0..29737da027 100644 --- a/modules/gaia/tasks/readfilejob.h +++ b/modules/gaia/tasks/readfilejob.h @@ -25,10 +25,13 @@ #ifndef __OPENSPACE_MODULE_GAIA___READFILEJOB___H__ #define __OPENSPACE_MODULE_GAIA___READFILEJOB___H__ -#include +#include #include #include +#include +#include +#include namespace openspace::gaia { diff --git a/modules/gaia/tasks/readfitstask.cpp b/modules/gaia/tasks/readfitstask.cpp index 16ddcdb3b1..9a5f0637e7 100644 --- a/modules/gaia/tasks/readfitstask.cpp +++ b/modules/gaia/tasks/readfitstask.cpp @@ -24,18 +24,22 @@ #include +#include #include #include -#include - #include +#include +#include #include #include #include -#include +#include +#include #include -#include #include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "ReadFitsTask"; diff --git a/modules/gaia/tasks/readfitstask.h b/modules/gaia/tasks/readfitstask.h index 1bebeb2843..6aafab2f0c 100644 --- a/modules/gaia/tasks/readfitstask.h +++ b/modules/gaia/tasks/readfitstask.h @@ -27,15 +27,11 @@ #include -#include -#include -#include #include +#include namespace openspace { -namespace documentation { struct Documentation; } - class ReadFitsTask : public Task { public: explicit ReadFitsTask(const ghoul::Dictionary& dictionary); diff --git a/modules/gaia/tasks/readspecktask.cpp b/modules/gaia/tasks/readspecktask.cpp index 123f49a5f6..2bb2ae4a0e 100644 --- a/modules/gaia/tasks/readspecktask.cpp +++ b/modules/gaia/tasks/readspecktask.cpp @@ -26,12 +26,14 @@ #include #include -#include #include #include #include #include +#include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "ReadSpeckTask"; diff --git a/modules/gaia/tasks/readspecktask.h b/modules/gaia/tasks/readspecktask.h index 437141663c..70cf3c8f98 100644 --- a/modules/gaia/tasks/readspecktask.h +++ b/modules/gaia/tasks/readspecktask.h @@ -28,12 +28,9 @@ #include #include -#include namespace openspace { -namespace documentation { struct Documentation; } - class ReadSpeckTask : public Task { public: explicit ReadSpeckTask(const ghoul::Dictionary& dictionary); diff --git a/modules/galaxy/galaxymodule.cpp b/modules/galaxy/galaxymodule.cpp index 8de67e6678..42a738726e 100644 --- a/modules/galaxy/galaxymodule.cpp +++ b/modules/galaxy/galaxymodule.cpp @@ -30,8 +30,11 @@ #include #include #include +#include #include +#include #include +#include namespace openspace { diff --git a/modules/galaxy/rendering/galaxyraycaster.cpp b/modules/galaxy/rendering/galaxyraycaster.cpp index e1700a40d6..34b7c68d0b 100644 --- a/modules/galaxy/rendering/galaxyraycaster.cpp +++ b/modules/galaxy/rendering/galaxyraycaster.cpp @@ -24,14 +24,18 @@ #include -#include #include #include +#include #include #include #include #include #include +#include +#include +#include +#include namespace { constexpr std::string_view GlslRaycastPath = diff --git a/modules/galaxy/rendering/galaxyraycaster.h b/modules/galaxy/rendering/galaxyraycaster.h index ef0bc8d525..75006a65b8 100644 --- a/modules/galaxy/rendering/galaxyraycaster.h +++ b/modules/galaxy/rendering/galaxyraycaster.h @@ -28,21 +28,12 @@ #include #include -#include -#include #include -namespace ghoul::opengl { - class Texture; - class TextureUnit; - class ProgramObject; -} // namespace ghoul::opengl +namespace ghoul::opengl { class TextureUnit; } namespace openspace { -struct RenderData; -struct RaycastData; - class GalaxyRaycaster : public VolumeRaycaster { public: explicit GalaxyRaycaster(ghoul::opengl::Texture& texture, @@ -89,8 +80,7 @@ private: ghoul::opengl::Texture& _texture; std::unique_ptr _textureUnit; std::filesystem::path _raycastingShader; - -}; // GalaxyRaycaster +}; } // namespace openspace diff --git a/modules/galaxy/rendering/renderablegalaxy.cpp b/modules/galaxy/rendering/renderablegalaxy.cpp index 346edc1e57..9f38faec5a 100644 --- a/modules/galaxy/rendering/renderablegalaxy.cpp +++ b/modules/galaxy/rendering/renderablegalaxy.cpp @@ -32,27 +32,29 @@ #include #include #include -#include #include #include #include #include #include -#include #include #include +#include +#include #include #include -#include #include #include #include #include #include #include -#include +#include +#include +#include #include -#include +#include +#include namespace { constexpr int8_t CurrentCacheVersion = 1; diff --git a/modules/galaxy/rendering/renderablegalaxy.h b/modules/galaxy/rendering/renderablegalaxy.h index 75acb8c6dd..dedd6b7e83 100644 --- a/modules/galaxy/rendering/renderablegalaxy.h +++ b/modules/galaxy/rendering/renderablegalaxy.h @@ -30,18 +30,16 @@ #include #include #include +#include #include #include #include - -namespace ghoul::opengl { class ProgramObject; } +#include namespace openspace { namespace volume { template class RawVolume; } - class GalaxyRaycaster; -struct RenderData; class RenderableGalaxy : public Renderable { public: diff --git a/modules/galaxy/tasks/milkywayconversiontask.cpp b/modules/galaxy/tasks/milkywayconversiontask.cpp index d2d2b219c1..3145d2df90 100644 --- a/modules/galaxy/tasks/milkywayconversiontask.cpp +++ b/modules/galaxy/tasks/milkywayconversiontask.cpp @@ -29,6 +29,7 @@ #include #include #include +#include namespace { struct [[codegen::Dictionary(MilkywayConversionTask)]] Parameters { diff --git a/modules/galaxy/tasks/milkywayconversiontask.h b/modules/galaxy/tasks/milkywayconversiontask.h index 74384e8451..8cc56c184f 100644 --- a/modules/galaxy/tasks/milkywayconversiontask.h +++ b/modules/galaxy/tasks/milkywayconversiontask.h @@ -28,12 +28,9 @@ #include #include -#include namespace openspace { -namespace documentation { struct Documentation; } - /** * Converts a set of exr image slices to a raw volume with floating point RGBA data (32 * bit per channel). diff --git a/modules/galaxy/tasks/milkywaypointsconversiontask.cpp b/modules/galaxy/tasks/milkywaypointsconversiontask.cpp index 5043a444c7..bafe9b84ac 100644 --- a/modules/galaxy/tasks/milkywaypointsconversiontask.cpp +++ b/modules/galaxy/tasks/milkywaypointsconversiontask.cpp @@ -25,18 +25,22 @@ #include #include - +#include +#include #include #include #include namespace openspace { - -/*MilkywayPointsConversionTask::MilkywayPointsConversionTask( - const std::string& inFilename, - const std::string& outFilename) - : _inFilename(inFilename) - , _outFilename(outFilename) {}*/ + +documentation::Documentation MilkywayPointsConversionTask::Documentation() { + return { + "MilkywayPointsConversionTask", + "galaxy_milkywaypointsconversiontask", + "", + {} + }; +} MilkywayPointsConversionTask::MilkywayPointsConversionTask(const ghoul::Dictionary&) {} @@ -46,8 +50,8 @@ std::string MilkywayPointsConversionTask::description() { void MilkywayPointsConversionTask::perform(const Task::ProgressCallback& progressCallback) { - std::ifstream in(_inFilename, std::ios::in); - std::ofstream out(_outFilename, std::ios::out | std::ios::binary); + std::ifstream in = std::ifstream(_inFilename, std::ios::in); + std::ofstream out = std::ofstream(_outFilename, std::ios::out | std::ios::binary); std::string format; int64_t nPoints = 0; @@ -85,18 +89,6 @@ void MilkywayPointsConversionTask::perform(const Task::ProgressCallback& progres out.write(reinterpret_cast(&nPoints), sizeof(int64_t)); out.write(reinterpret_cast(pointData.data()), nFloats * sizeof(float)); - - in.close(); - out.close(); -} - -documentation::Documentation MilkywayPointsConversionTask::Documentation() { - return { - "MilkywayPointsConversionTask", - "galaxy_milkywaypointsconversiontask", - "", - {} - }; } } // namespace openspace diff --git a/modules/galaxy/tasks/milkywaypointsconversiontask.h b/modules/galaxy/tasks/milkywaypointsconversiontask.h index 346424984e..385c91c872 100644 --- a/modules/galaxy/tasks/milkywaypointsconversiontask.h +++ b/modules/galaxy/tasks/milkywaypointsconversiontask.h @@ -27,14 +27,10 @@ #include -#include - namespace openspace { -namespace documentation { struct Documentation; } - /** - * Converts ASCII based point data + * Converts ASCII based point data. * ``` * int64_t n * (float x, float y, float z, float r, float g, float b) * n diff --git a/modules/globebrowsing/globebrowsingmodule.cpp b/modules/globebrowsing/globebrowsingmodule.cpp index 5109c1e1ab..6c77bf1d89 100644 --- a/modules/globebrowsing/globebrowsingmodule.cpp +++ b/modules/globebrowsing/globebrowsingmodule.cpp @@ -29,15 +29,15 @@ #include #include #include -#include #include #include #include #include -#include -#include #include #include +#include +#include +#include #include #include #include @@ -49,31 +49,32 @@ #include #include #include -#include -#include +#include #include #include -#include #include -#include #include -#include +#include #include -#include -#include #include #include #include #include -#include #include #include #include #include -#include +#include #include +#include #include -#include +#include +#include +#include +#include +#include +#include +#include #include diff --git a/modules/globebrowsing/globebrowsingmodule.h b/modules/globebrowsing/globebrowsingmodule.h index bdfd7af503..836309ae55 100644 --- a/modules/globebrowsing/globebrowsingmodule.h +++ b/modules/globebrowsing/globebrowsingmodule.h @@ -30,24 +30,16 @@ #include #include #include -#include -#include +#include #include #include -#include - -namespace openspace::globebrowsing { - class RenderableGlobe; - struct TileIndex; - - namespace cache { class MemoryAwareTileCache; } -} // namespace openspace::globebrowsing namespace openspace { -class Camera; -struct Geodetic2; -struct Geodetic3; +namespace globebrowsing { + class RenderableGlobe; + namespace cache { class MemoryAwareTileCache; } +} // namespace globebrowsing class SceneGraphNode; class GlobeBrowsingModule : public OpenSpaceModule { diff --git a/modules/globebrowsing/globebrowsingmodule_lua.inl b/modules/globebrowsing/globebrowsingmodule_lua.inl index 5654e717d9..d8ee813d62 100644 --- a/modules/globebrowsing/globebrowsingmodule_lua.inl +++ b/modules/globebrowsing/globebrowsingmodule_lua.inl @@ -22,7 +22,13 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include +#include +#include +#include +#include +#include +#include +#include #include #include diff --git a/modules/globebrowsing/src/asynctiledataprovider.cpp b/modules/globebrowsing/src/asynctiledataprovider.cpp index e833b4daab..b5fbaedc7a 100644 --- a/modules/globebrowsing/src/asynctiledataprovider.cpp +++ b/modules/globebrowsing/src/asynctiledataprovider.cpp @@ -24,14 +24,17 @@ #include -#include +#include +#include #include #include -#include -#include +#include #include #include -#include +#include +#include +#include +#include namespace openspace::globebrowsing { @@ -40,7 +43,7 @@ namespace { } // namespace AsyncTileDataProvider::AsyncTileDataProvider(std::string name, - std::unique_ptr rawTileDataReader) + std::unique_ptr rawTileDataReader) : _name(std::move(name)) , _rawTileDataReader(std::move(rawTileDataReader)) , _concurrentJobManager(LRUThreadPool(1, 10)) diff --git a/modules/globebrowsing/src/asynctiledataprovider.h b/modules/globebrowsing/src/asynctiledataprovider.h index 0d92d4cef8..49c8ef7258 100644 --- a/modules/globebrowsing/src/asynctiledataprovider.h +++ b/modules/globebrowsing/src/asynctiledataprovider.h @@ -29,9 +29,10 @@ #include #include #include -#include +#include #include #include +#include namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/basictypes.h b/modules/globebrowsing/src/basictypes.h index f72f01df3d..dce187f9b5 100644 --- a/modules/globebrowsing/src/basictypes.h +++ b/modules/globebrowsing/src/basictypes.h @@ -27,9 +27,9 @@ #include #include -#include +#include +#include #include -#include namespace ghoul::opengl { class Texture; } diff --git a/modules/globebrowsing/src/dashboarditemglobelocation.cpp b/modules/globebrowsing/src/dashboarditemglobelocation.cpp index 0fac6c869d..7799274e4c 100644 --- a/modules/globebrowsing/src/dashboarditemglobelocation.cpp +++ b/modules/globebrowsing/src/dashboarditemglobelocation.cpp @@ -24,22 +24,19 @@ #include -#include -#include -#include #include -#include #include -#include -#include -#include -#include #include -#include -#include +#include #include -#include +#include +#include #include +#include +#include +#include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo DisplayFormatInfo = { diff --git a/modules/globebrowsing/src/dashboarditemglobelocation.h b/modules/globebrowsing/src/dashboarditemglobelocation.h index 9a0b84bd5b..03f742184b 100644 --- a/modules/globebrowsing/src/dashboarditemglobelocation.h +++ b/modules/globebrowsing/src/dashboarditemglobelocation.h @@ -28,14 +28,10 @@ #include #include -#include -#include #include namespace openspace { -namespace documentation { struct Documentation; } - class DashboardItemGlobeLocation : public DashboardTextItem { public: explicit DashboardItemGlobeLocation(const ghoul::Dictionary& dictionary); diff --git a/modules/globebrowsing/src/gdalwrapper.cpp b/modules/globebrowsing/src/gdalwrapper.cpp index df1f08c932..4518246de6 100644 --- a/modules/globebrowsing/src/gdalwrapper.cpp +++ b/modules/globebrowsing/src/gdalwrapper.cpp @@ -26,14 +26,16 @@ #include #include -#include #include -#include +#include #include +#include #include #include #include +#include #include +#include namespace { constexpr std::string_view _loggerCat = "GdalWrapper"; diff --git a/modules/globebrowsing/src/gdalwrapper.h b/modules/globebrowsing/src/gdalwrapper.h index 31c20cc43a..18093e6f84 100644 --- a/modules/globebrowsing/src/gdalwrapper.h +++ b/modules/globebrowsing/src/gdalwrapper.h @@ -30,8 +30,6 @@ #include #include -#include - namespace openspace::globebrowsing { /** diff --git a/modules/globebrowsing/src/geodeticpatch.cpp b/modules/globebrowsing/src/geodeticpatch.cpp index 61b1392b31..9797370e93 100644 --- a/modules/globebrowsing/src/geodeticpatch.cpp +++ b/modules/globebrowsing/src/geodeticpatch.cpp @@ -26,6 +26,10 @@ #include #include +#include +#include +#include +#include namespace { // Normalizes the angle to the interval [center - pi, center + pi[ diff --git a/modules/globebrowsing/src/geodeticpatch.h b/modules/globebrowsing/src/geodeticpatch.h index 17e5ff7f9d..4cd75dcc92 100644 --- a/modules/globebrowsing/src/geodeticpatch.h +++ b/modules/globebrowsing/src/geodeticpatch.h @@ -68,7 +68,6 @@ public: */ bool contains(const Geodetic2& p) const; - /** * Clamps a point to the patch region. */ diff --git a/modules/globebrowsing/src/geojson/geojsoncomponent.cpp b/modules/globebrowsing/src/geojson/geojsoncomponent.cpp index ad4d39df13..9a7caa7902 100644 --- a/modules/globebrowsing/src/geojson/geojsoncomponent.cpp +++ b/modules/globebrowsing/src/geojson/geojsoncomponent.cpp @@ -24,27 +24,34 @@ #include -#include #include #include #include -#include -#include #include #include #include -#include #include +#include +#include #include #include #include #include #include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include -#include +#include +#include namespace geos_nlohmann = nlohmann; #include diff --git a/modules/globebrowsing/src/geojson/geojsoncomponent.h b/modules/globebrowsing/src/geojson/geojsoncomponent.h index 30a3183803..2efcfaf681 100644 --- a/modules/globebrowsing/src/geojson/geojsoncomponent.h +++ b/modules/globebrowsing/src/geojson/geojsoncomponent.h @@ -28,11 +28,9 @@ #include #include -#include #include #include #include -#include #include #include #include @@ -40,20 +38,22 @@ #include #include #include -#include -#include +#include #include -#include +namespace geos { + namespace geom { class Geometry; } + namespace io { class GeoJSONFeature; } +} // namespace geos +namespace ghoul { + namespace opengl { class ProgramObject; } + class Dictionary; +} // namespace ghoul namespace openspace { - struct RenderData; - class LightSource; namespace documentation { struct Documentation; } - namespace rendering::helper { struct VertexXYZNormal; } -} // namespace::openspace - -namespace ghoul::opengl { class ProgramObject; } -namespace geos::io { class GeoJSONFeature; } + class LightSource; + struct RenderData; +} // namespace openspace namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/geojson/geojsonmanager.cpp b/modules/globebrowsing/src/geojson/geojsonmanager.cpp index a615c3f71e..7e1db1578d 100644 --- a/modules/globebrowsing/src/geojson/geojsonmanager.cpp +++ b/modules/globebrowsing/src/geojson/geojsonmanager.cpp @@ -24,11 +24,17 @@ #include +#include #include -#include +#include #include +#include +#include +#include #include - +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "GeoJsonManager"; diff --git a/modules/globebrowsing/src/geojson/geojsonmanager.h b/modules/globebrowsing/src/geojson/geojsonmanager.h index c8b146d72d..d2a73b1ee7 100644 --- a/modules/globebrowsing/src/geojson/geojsonmanager.h +++ b/modules/globebrowsing/src/geojson/geojsonmanager.h @@ -28,14 +28,13 @@ #include #include - -#include #include -#include namespace ghoul { class Dictionary; } -namespace openspace { struct RenderData; } -namespace openspace::documentation { struct Documentation; } +namespace openspace { + namespace documentation { struct Documentation; } + struct RenderData; +} // namespace openspace namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/geojson/geojsonproperties.cpp b/modules/globebrowsing/src/geojson/geojsonproperties.cpp index b14cb77a70..af4c87d96a 100644 --- a/modules/globebrowsing/src/geojson/geojsonproperties.cpp +++ b/modules/globebrowsing/src/geojson/geojsonproperties.cpp @@ -28,10 +28,13 @@ #include #include #include +#include #include #include #include -#include +#include +#include +#include // Keys used to read properties from GeoJson files namespace geojson::propertykeys { diff --git a/modules/globebrowsing/src/geojson/geojsonproperties.h b/modules/globebrowsing/src/geojson/geojsonproperties.h index 98cfb6f25a..6a6253e51c 100644 --- a/modules/globebrowsing/src/geojson/geojsonproperties.h +++ b/modules/globebrowsing/src/geojson/geojsonproperties.h @@ -35,7 +35,6 @@ #include #include #include -#include namespace geos::io { class GeoJSONFeature; } diff --git a/modules/globebrowsing/src/geojson/globegeometryfeature.cpp b/modules/globebrowsing/src/geojson/globegeometryfeature.cpp index 7a73b52e40..d7cf1ef23f 100644 --- a/modules/globebrowsing/src/geojson/globegeometryfeature.cpp +++ b/modules/globebrowsing/src/geojson/globegeometryfeature.cpp @@ -27,27 +27,39 @@ #include #include #include -#include #include #include -#include #include -#include #include -#include #include #include +#include +#include #include #include +#include +#include #include #include #include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include #include -#include +#include +#include +#include +#include namespace { - constexpr const char* _loggerCat = "GlobeGeometryFeature"; + constexpr std::string_view _loggerCat = "GlobeGeometryFeature"; constexpr std::chrono::milliseconds HeightUpdateInterval(10000); } // namespace diff --git a/modules/globebrowsing/src/geojson/globegeometryfeature.h b/modules/globebrowsing/src/geojson/globegeometryfeature.h index 71aa18f951..f9e84738a0 100644 --- a/modules/globebrowsing/src/geojson/globegeometryfeature.h +++ b/modules/globebrowsing/src/geojson/globegeometryfeature.h @@ -25,25 +25,29 @@ #ifndef __OPENSPACE_MODULE_GLOBEBROWSING___GLOBEGEOMETRYFEATURE___H__ #define __OPENSPACE_MODULE_GLOBEBROWSING___GLOBEGEOMETRYFEATURE___H__ -#include - -#include #include #include #include #include #include #include +#include +#include #include -namespace openspace::documentation { struct Documentation; } +namespace geos::geom { class Geometry; } +namespace ghoul::opengl { class ProgramObject; } +namespace openspace { + namespace documentation { struct Documentation; } + struct Geodetic2; + struct Geodetic3; + struct RenderData; +} // namespace openspace namespace rendering::helper { struct LightSourceRenderData; struct VertexXYZNormal; } // namespace rendering::helper -namespace geos::geom { class Geometry; } - namespace openspace::globebrowsing { class RenderableGlobe; @@ -54,11 +58,12 @@ class RenderableGlobe; */ class GlobeGeometryFeature { public: + using Vertex = rendering::helper::VertexXYZNormal; + GlobeGeometryFeature(const RenderableGlobe& globe, GeoJsonProperties& defaultProperties, GeoJsonOverrideProperties& overrideProperties); - using Vertex = rendering::helper::VertexXYZNormal; // TODO: Use instead of numbers //enum class RenderPass { diff --git a/modules/globebrowsing/src/geojson/globegeometryhelper.cpp b/modules/globebrowsing/src/geojson/globegeometryhelper.cpp index d4e13d5490..9779649dbf 100644 --- a/modules/globebrowsing/src/geojson/globegeometryhelper.cpp +++ b/modules/globebrowsing/src/geojson/globegeometryhelper.cpp @@ -26,11 +26,23 @@ #include #include +#include +#include #include +#include #include +#include +#include #include +#include +#include #include #include +#include +#include +#include +#include +#include namespace openspace::globebrowsing::geometryhelper { diff --git a/modules/globebrowsing/src/geojson/globegeometryhelper.h b/modules/globebrowsing/src/geojson/globegeometryhelper.h index 7d4782de5b..030f3a6641 100644 --- a/modules/globebrowsing/src/geojson/globegeometryhelper.h +++ b/modules/globebrowsing/src/geojson/globegeometryhelper.h @@ -29,13 +29,11 @@ #include namespace openspace { - struct Geodetic2; - struct Geodetic3; - namespace globebrowsing { class RenderableGlobe; } namespace rendering::helper { struct VertexXYZNormal; } + struct Geodetic2; + struct Geodetic3; } // namespace openspace - namespace geos::geom { class Coordinate; class Geometry; diff --git a/modules/globebrowsing/src/globelabelscomponent.cpp b/modules/globebrowsing/src/globelabelscomponent.cpp index 576e0c0a88..e2ad9f3473 100644 --- a/modules/globebrowsing/src/globelabelscomponent.cpp +++ b/modules/globebrowsing/src/globelabelscomponent.cpp @@ -27,26 +27,28 @@ #include #include #include -#include -#include #include -#include -#include +#include +#include #include #include #include #include #include +#include #include #include #include #include -#include -#include +#include +#include +#include +#include #include #include -#include +#include #include +#include namespace { constexpr std::string_view _loggerCat = "GlobeLabels"; diff --git a/modules/globebrowsing/src/globelabelscomponent.h b/modules/globebrowsing/src/globelabelscomponent.h index 0036635327..b61bdefc53 100644 --- a/modules/globebrowsing/src/globelabelscomponent.h +++ b/modules/globebrowsing/src/globelabelscomponent.h @@ -31,22 +31,24 @@ #include #include #include -#include #include #include #include -#include #include +#include +#include +#include -namespace ghoul { class Dictionary; } -namespace ghoul::opengl { class ProgramObject; } +namespace ghoul { + namespace opengl { class ProgramObject; } + class Dictionary; +} // namespace ghoul namespace openspace { -struct RenderData; - namespace documentation { struct Documentation; } namespace globebrowsing { class RenderableGlobe; } +struct RenderData; class GlobeLabelsComponent : public properties::PropertyOwner, public Fadeable { public: diff --git a/modules/globebrowsing/src/gpulayergroup.cpp b/modules/globebrowsing/src/gpulayergroup.cpp index 6906dcf42d..4528592abf 100644 --- a/modules/globebrowsing/src/gpulayergroup.cpp +++ b/modules/globebrowsing/src/gpulayergroup.cpp @@ -24,11 +24,18 @@ #include +#include #include #include -#include +#include +#include +#include +#include #include +#include #include +#include +#include namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/gpulayergroup.h b/modules/globebrowsing/src/gpulayergroup.h index ec7ae4ec84..6ac2904c99 100644 --- a/modules/globebrowsing/src/gpulayergroup.h +++ b/modules/globebrowsing/src/gpulayergroup.h @@ -27,20 +27,12 @@ #include #include -#include -#include #include namespace ghoul::opengl { class ProgramObject; } namespace openspace::globebrowsing { -struct ChunkTile; -class Layer; -class GPULayer; -struct TileDepthTransform; -struct TileUvTransform; - struct LayerGroup; struct TileIndex; diff --git a/modules/globebrowsing/src/layer.cpp b/modules/globebrowsing/src/layer.cpp index 301089affa..681647c46b 100644 --- a/modules/globebrowsing/src/layer.cpp +++ b/modules/globebrowsing/src/layer.cpp @@ -24,18 +24,17 @@ #include -#include -#include -#include -#include #include -#include #include -#include +#include +#include #include #include - -namespace openspace::globebrowsing { +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "Layer"; @@ -175,6 +174,8 @@ namespace { #include "layer_codegen.cpp" } // namespace +namespace openspace::globebrowsing { + documentation::Documentation Layer::Documentation() { return codegen::doc("globebrowsing_layer"); } diff --git a/modules/globebrowsing/src/layer.h b/modules/globebrowsing/src/layer.h index 3843d45543..c31e682bb3 100644 --- a/modules/globebrowsing/src/layer.h +++ b/modules/globebrowsing/src/layer.h @@ -30,11 +30,17 @@ #include #include +#include #include -#include #include +#include +#include #include +#include +#include +#include +namespace ghoul { class Dictionary; } namespace openspace::documentation { struct Documentation; } namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/layeradjustment.cpp b/modules/globebrowsing/src/layeradjustment.cpp index c30e895cd3..58ba3756f5 100644 --- a/modules/globebrowsing/src/layeradjustment.cpp +++ b/modules/globebrowsing/src/layeradjustment.cpp @@ -25,8 +25,9 @@ #include #include -#include +#include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo ChromaKeyColorInfo = { diff --git a/modules/globebrowsing/src/layeradjustment.h b/modules/globebrowsing/src/layeradjustment.h index d1c1869cdf..07a7751a59 100644 --- a/modules/globebrowsing/src/layeradjustment.h +++ b/modules/globebrowsing/src/layeradjustment.h @@ -31,7 +31,9 @@ #include #include #include +#include +namespace ghoul { class Dictionary; } namespace openspace::documentation { struct Documentation; } namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/layergroup.cpp b/modules/globebrowsing/src/layergroup.cpp index e6c32fd28b..520d928822 100644 --- a/modules/globebrowsing/src/layergroup.cpp +++ b/modules/globebrowsing/src/layergroup.cpp @@ -31,8 +31,14 @@ #include #include #include +#include #include +#include +#include #include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "LayerGroup"; diff --git a/modules/globebrowsing/src/layergroup.h b/modules/globebrowsing/src/layergroup.h index e4dc07f9b9..5f27191c46 100644 --- a/modules/globebrowsing/src/layergroup.h +++ b/modules/globebrowsing/src/layergroup.h @@ -29,11 +29,13 @@ #include #include +#include + +namespace ghoul { class Dictionary; } namespace openspace::globebrowsing { class Layer; -struct TileProvider; /** * Convenience class for dealing with multiple `Layer`s. diff --git a/modules/globebrowsing/src/layergroupid.cpp b/modules/globebrowsing/src/layergroupid.cpp index 9c349e8d4c..887c0161e2 100644 --- a/modules/globebrowsing/src/layergroupid.cpp +++ b/modules/globebrowsing/src/layergroupid.cpp @@ -24,6 +24,8 @@ #include +#include + namespace openspace::globebrowsing::layers { // The order and values of these enums are implicitly used in many places in the code and diff --git a/modules/globebrowsing/src/layergroupid.h b/modules/globebrowsing/src/layergroupid.h index 71e94beaf7..2c3b8bede6 100644 --- a/modules/globebrowsing/src/layergroupid.h +++ b/modules/globebrowsing/src/layergroupid.h @@ -25,9 +25,11 @@ #ifndef __OPENSPACE_MODULE_GLOBEBROWSING___LAYERGROUPID___H__ #define __OPENSPACE_MODULE_GLOBEBROWSING___LAYERGROUPID___H__ -#include +#include +#include +#include #include -#include +#include namespace openspace::globebrowsing::layers { diff --git a/modules/globebrowsing/src/layermanager.cpp b/modules/globebrowsing/src/layermanager.cpp index f555e4002c..9f6a02a80d 100644 --- a/modules/globebrowsing/src/layermanager.cpp +++ b/modules/globebrowsing/src/layermanager.cpp @@ -27,11 +27,13 @@ #include #include #include -#include #include -#include #include #include +#include +#include +#include +#include namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/layermanager.h b/modules/globebrowsing/src/layermanager.h index 06042ca9b0..4427ac5afd 100644 --- a/modules/globebrowsing/src/layermanager.h +++ b/modules/globebrowsing/src/layermanager.h @@ -28,20 +28,17 @@ #include #include -#include #include #include #include namespace ghoul { class Dictionary; } - namespace openspace::documentation { struct Documentation; } namespace openspace::globebrowsing { class Layer; struct LayerGroup; -class TileTextureInitData; /** * Manages multiple LayerGroups. diff --git a/modules/globebrowsing/src/layerrendersettings.cpp b/modules/globebrowsing/src/layerrendersettings.cpp index e7f6d8c4b9..c8e5372fa3 100644 --- a/modules/globebrowsing/src/layerrendersettings.cpp +++ b/modules/globebrowsing/src/layerrendersettings.cpp @@ -24,6 +24,10 @@ #include +#include +#include +#include + namespace { constexpr openspace::properties::Property::PropertyInfo SetDefaultInfo = { "SetDefault", diff --git a/modules/globebrowsing/src/layerrendersettings.h b/modules/globebrowsing/src/layerrendersettings.h index 111fcbc195..d1f0fa048e 100644 --- a/modules/globebrowsing/src/layerrendersettings.h +++ b/modules/globebrowsing/src/layerrendersettings.h @@ -29,6 +29,7 @@ #include #include +#include namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/lrucache.h b/modules/globebrowsing/src/lrucache.h index d9dd2770ba..aa56d20dc8 100644 --- a/modules/globebrowsing/src/lrucache.h +++ b/modules/globebrowsing/src/lrucache.h @@ -27,6 +27,7 @@ #include #include +#include #include namespace openspace::globebrowsing::cache { diff --git a/modules/globebrowsing/src/lruthreadpool.inl b/modules/globebrowsing/src/lruthreadpool.inl index c46de72dd1..c7dca2ba3e 100644 --- a/modules/globebrowsing/src/lruthreadpool.inl +++ b/modules/globebrowsing/src/lruthreadpool.inl @@ -22,6 +22,9 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include +#include + namespace openspace::globebrowsing { template diff --git a/modules/globebrowsing/src/memoryawaretilecache.cpp b/modules/globebrowsing/src/memoryawaretilecache.cpp index 2c4f56936d..509a294ace 100644 --- a/modules/globebrowsing/src/memoryawaretilecache.cpp +++ b/modules/globebrowsing/src/memoryawaretilecache.cpp @@ -25,12 +25,18 @@ #include #include -#include +#include #include +#include #include +#include +#include #include #include +#include +#include #include +#include namespace { constexpr std::string_view _loggerCat = "MemoryAwareTileCache"; diff --git a/modules/globebrowsing/src/memoryawaretilecache.h b/modules/globebrowsing/src/memoryawaretilecache.h index 9f9144a8b7..d75bd291e3 100644 --- a/modules/globebrowsing/src/memoryawaretilecache.h +++ b/modules/globebrowsing/src/memoryawaretilecache.h @@ -22,18 +22,20 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#ifndef __OPENSPACE_MODULE_GLOBEBROWSING___MEMORY_AWARE_TILE_CACHE___H__ -#define __OPENSPACE_MODULE_GLOBEBROWSING___MEMORY_AWARE_TILE_CACHE___H__ +#ifndef __OPENSPACE_MODULE_GLOBEBROWSING___MEMORYAWARETILECACHE___H__ +#define __OPENSPACE_MODULE_GLOBEBROWSING___MEMORYAWARETILECACHE___H__ #include #include #include #include #include -#include #include +#include +#include #include #include +#include #include namespace openspace::globebrowsing { @@ -167,4 +169,4 @@ private: } // namespace openspace::globebrowsing::cache -#endif // __OPENSPACE_MODULE_GLOBEBROWSING___MEMORY_AWARE_TILE_CACHE___H__ +#endif // __OPENSPACE_MODULE_GLOBEBROWSING___MEMORYAWARETILECACHE___H__ diff --git a/modules/globebrowsing/src/prioritizingconcurrentjobmanager.h b/modules/globebrowsing/src/prioritizingconcurrentjobmanager.h index d7319d6a6c..77742644f7 100644 --- a/modules/globebrowsing/src/prioritizingconcurrentjobmanager.h +++ b/modules/globebrowsing/src/prioritizingconcurrentjobmanager.h @@ -27,7 +27,9 @@ #include #include +#include #include +#include namespace openspace { template struct Job; } diff --git a/modules/globebrowsing/src/prioritizingconcurrentjobmanager.inl b/modules/globebrowsing/src/prioritizingconcurrentjobmanager.inl index b9ddd8f4ff..93e434cd28 100644 --- a/modules/globebrowsing/src/prioritizingconcurrentjobmanager.inl +++ b/modules/globebrowsing/src/prioritizingconcurrentjobmanager.inl @@ -23,6 +23,7 @@ ****************************************************************************************/ #include +#include namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/rawtile.h b/modules/globebrowsing/src/rawtile.h index 4152c57e37..d610b04f58 100644 --- a/modules/globebrowsing/src/rawtile.h +++ b/modules/globebrowsing/src/rawtile.h @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -36,8 +35,6 @@ namespace openspace::globebrowsing { -class TileTextureInitData; - struct RawTile { enum class ReadError { None = 0, // = CE_None diff --git a/modules/globebrowsing/src/rawtiledatareader.cpp b/modules/globebrowsing/src/rawtiledatareader.cpp index 11f1abc6dd..180a746ae0 100644 --- a/modules/globebrowsing/src/rawtiledatareader.cpp +++ b/modules/globebrowsing/src/rawtiledatareader.cpp @@ -28,12 +28,28 @@ #include #include #include -#include +#include #include #include #include +#include +#include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #ifdef _MSC_VER #pragma warning (push) @@ -42,182 +58,176 @@ #endif // _MSC_VER #include -#include -#include - #include #ifdef _MSC_VER #pragma warning (pop) #endif // _MSC_VER -#include -#include -#include -#include - namespace openspace::globebrowsing { namespace { constexpr std::string_view _loggerCat = "RawTileDataReader"; -enum class Side { - Left = 0, - Top, - Right, - Bottom -}; - -float interpretFloat(GLenum glType, const std::byte* src) { - switch (glType) { - case GL_UNSIGNED_BYTE: - return static_cast(*reinterpret_cast(src)); - case GL_UNSIGNED_SHORT: - return static_cast(*reinterpret_cast(src)); - case GL_SHORT: - return static_cast(*reinterpret_cast(src)); - case GL_UNSIGNED_INT: - return static_cast(*reinterpret_cast(src)); - case GL_INT: - return static_cast(*reinterpret_cast(src)); - case GL_HALF_FLOAT: - return static_cast(*reinterpret_cast(src)); - case GL_FLOAT: - return static_cast(*reinterpret_cast(src)); - case GL_DOUBLE: - return static_cast(*reinterpret_cast(src)); - default: - throw ghoul::MissingCaseException(); - } -} - -GDALDataType toGDALDataType(GLenum glType) { - switch (glType) { - case GL_UNSIGNED_BYTE: - return GDT_Byte; - case GL_UNSIGNED_SHORT: - return GDT_UInt16; - case GL_SHORT: - return GDT_Int16; - case GL_UNSIGNED_INT: - return GDT_UInt32; - case GL_INT: - return GDT_Int32; - case GL_FLOAT: - return GDT_Float32; - case GL_DOUBLE: - return GDT_Float64; - default: - LERRORC( - "GDALRawTileDataReader", - std::format( - "OpenGL data type unknown to GDAL: {}", static_cast(glType) - ) - ); - throw ghoul::MissingCaseException(); - } -} - -bool isInside(const PixelRegion& lhs, const PixelRegion& rhs) { - const glm::ivec2 e = lhs.start + lhs.numPixels; - const glm::ivec2 re = rhs.start + rhs.numPixels; - return rhs.start.x <= lhs.start.x && e.x <= re.x && - rhs.start.y <= lhs.start.y && e.y <= re.y; -} - -/** - * Returns the geo transform from raster space to projection coordinates as defined - * by GDAL. - */ -std::array geoTransform(int rasterX, int rasterY) { - const GeodeticPatch cov( - Geodetic2{ 0.0, 0.0 }, - Geodetic2{ glm::half_pi(), glm::pi() } - ); - return { - glm::degrees(cov.corner(Quad::NORTH_WEST).lon), - glm::degrees(cov.size().lon) / rasterX, - 0.0, - glm::degrees(cov.corner(Quad::NORTH_WEST).lat), - 0.0, - glm::degrees(-cov.size().lat) / rasterY + enum class Side { + Left = 0, + Top, + Right, + Bottom }; -} -/** - * Get the pixel corresponding to a specific position on the globe defined by the - * Geodetic2 coordinate \p geo. If the dataset has overviews the function returns the - * pixel at the lowest overview (highest resolution). - * - * \param geo The position on the globe to convert to pixel space. - * \return a pixel coordinate in the dataset. - */ -glm::ivec2 geodeticToPixel(const Geodetic2& geo, - const std::array& transform) -{ - const std::array& t = transform; - - const double Y = glm::degrees(geo.lat); - const double X = glm::degrees(geo.lon); - - const double divisor = t[2] * t[4] - t[1] * t[5]; - ghoul_assert(divisor != 0.0, "Division by zero"); - - const double P = (t[0] * t[5] - t[2] * t[3] + t[2] * Y - t[5] * X) / divisor; - const double L = (-t[0] * t[4] + t[1] * t[3] - t[1] * Y + t[4] * X) / divisor; - // ref: https://www.wolframalpha.com/input/?i=X+%3D+a0+%2B+a1P+%2B+a2L, - // +Y+%3D+b0+%2B+b1P+%2B+b2L,+solve+for+P+and+L - - [[maybe_unused]] const double Xp = t[0] + P * t[1] + L * t[2]; - [[maybe_unused]] const double Yp = t[3] + P * t[4] + L * t[5]; - ghoul_assert(std::abs(X - Xp) < 1e-10, "inverse should yield X as before"); - ghoul_assert(std::abs(Y - Yp) < 1e-10, "inverse should yield Y as before"); - - return glm::ivec2(glm::round(P), glm::round(L)); -} - -/** - * Get a pixel region corresponding to the given GeodeticPatch. If the dataset has - * overviews the function returns the pixel region at the lowest overview (highest - * resolution). - * - * \param \p geodeticPatch is a patch covering an area in geodetic coordinates - * \return A PixelRegion covering the given geodetic patch at highest resolution. - */ -PixelRegion highestResPixelRegion(const GeodeticPatch& geodeticPatch, - const std::array& transform) -{ - const Geodetic2 nwCorner = geodeticPatch.corner(Quad::NORTH_WEST); - const Geodetic2 swCorner = geodeticPatch.corner(Quad::SOUTH_EAST); - const glm::ivec2 pixelStart = geodeticToPixel(nwCorner, transform); - const glm::ivec2 pixelEnd = geodeticToPixel(swCorner, transform); - PixelRegion region; - region.start = pixelStart; - region.numPixels = pixelEnd - pixelStart; - return region; -} - -RawTile::ReadError postProcessErrorCheck(const RawTile& rawTile, - [[maybe_unused]] size_t nRasters, - float noDataValue) -{ - ghoul_assert(nRasters == rawTile.tileMetaData.nValues, "Wrong numbers of max values"); - - const bool hasMissingData = std::any_of( - rawTile.tileMetaData.maxValues.begin(), - rawTile.tileMetaData.maxValues.begin() + rawTile.tileMetaData.nValues, - [noDataValue](float v) { return v == noDataValue; } - ); - - const bool onHighLevel = rawTile.tileIndex.level > 6; - if (hasMissingData && onHighLevel) { - return RawTile::ReadError::Fatal; + float interpretFloat(GLenum glType, const std::byte* src) { + switch (glType) { + case GL_UNSIGNED_BYTE: + return static_cast(*reinterpret_cast(src)); + case GL_UNSIGNED_SHORT: + return static_cast(*reinterpret_cast(src)); + case GL_SHORT: + return static_cast(*reinterpret_cast(src)); + case GL_UNSIGNED_INT: + return static_cast(*reinterpret_cast(src)); + case GL_INT: + return static_cast(*reinterpret_cast(src)); + case GL_HALF_FLOAT: + return static_cast(*reinterpret_cast(src)); + case GL_FLOAT: + return static_cast(*reinterpret_cast(src)); + case GL_DOUBLE: + return static_cast(*reinterpret_cast(src)); + default: + throw ghoul::MissingCaseException(); + } } - else { - return RawTile::ReadError::None; - } -} + GDALDataType toGDALDataType(GLenum glType) { + switch (glType) { + case GL_UNSIGNED_BYTE: + return GDT_Byte; + case GL_UNSIGNED_SHORT: + return GDT_UInt16; + case GL_SHORT: + return GDT_Int16; + case GL_UNSIGNED_INT: + return GDT_UInt32; + case GL_INT: + return GDT_Int32; + case GL_FLOAT: + return GDT_Float32; + case GL_DOUBLE: + return GDT_Float64; + default: + LERRORC( + "GDALRawTileDataReader", + std::format( + "OpenGL data type unknown to GDAL: {}", static_cast(glType) + ) + ); + throw ghoul::MissingCaseException(); + } + } + + bool isInside(const PixelRegion& lhs, const PixelRegion& rhs) { + const glm::ivec2 e = lhs.start + lhs.numPixels; + const glm::ivec2 re = rhs.start + rhs.numPixels; + return rhs.start.x <= lhs.start.x && e.x <= re.x && + rhs.start.y <= lhs.start.y && e.y <= re.y; + } + + /** + * Returns the geo transform from raster space to projection coordinates as defined + * by GDAL. + */ + std::array geoTransform(int rasterX, int rasterY) { + const GeodeticPatch cov( + Geodetic2{ 0.0, 0.0 }, + Geodetic2{ glm::half_pi(), glm::pi() } + ); + return { + glm::degrees(cov.corner(Quad::NORTH_WEST).lon), + glm::degrees(cov.size().lon) / rasterX, + 0.0, + glm::degrees(cov.corner(Quad::NORTH_WEST).lat), + 0.0, + glm::degrees(-cov.size().lat) / rasterY + }; + } + + /** + * Get the pixel corresponding to a specific position on the globe defined by the + * Geodetic2 coordinate \p geo. If the dataset has overviews the function returns the + * pixel at the lowest overview (highest resolution). + * + * \param geo The position on the globe to convert to pixel space. + * \return a pixel coordinate in the dataset. + */ + glm::ivec2 geodeticToPixel(const Geodetic2& geo, + const std::array& transform) + { + const std::array& t = transform; + + const double Y = glm::degrees(geo.lat); + const double X = glm::degrees(geo.lon); + + const double divisor = t[2] * t[4] - t[1] * t[5]; + ghoul_assert(divisor != 0.0, "Division by zero"); + + const double P = (t[0] * t[5] - t[2] * t[3] + t[2] * Y - t[5] * X) / divisor; + const double L = (-t[0] * t[4] + t[1] * t[3] - t[1] * Y + t[4] * X) / divisor; + // ref: https://www.wolframalpha.com/input/?i=X+%3D+a0+%2B+a1P+%2B+a2L, + // +Y+%3D+b0+%2B+b1P+%2B+b2L,+solve+for+P+and+L + + [[maybe_unused]] const double Xp = t[0] + P * t[1] + L * t[2]; + [[maybe_unused]] const double Yp = t[3] + P * t[4] + L * t[5]; + ghoul_assert(std::abs(X - Xp) < 1e-10, "inverse should yield X as before"); + ghoul_assert(std::abs(Y - Yp) < 1e-10, "inverse should yield Y as before"); + + return glm::ivec2(glm::round(P), glm::round(L)); + } + + /** + * Get a pixel region corresponding to the given GeodeticPatch. If the dataset has + * overviews the function returns the pixel region at the lowest overview (highest + * resolution). + * + * \param \p geodeticPatch is a patch covering an area in geodetic coordinates + * \return A PixelRegion covering the given geodetic patch at highest resolution. + */ + PixelRegion highestResPixelRegion(const GeodeticPatch& geodeticPatch, + const std::array& transform) + { + const Geodetic2 nwCorner = geodeticPatch.corner(Quad::NORTH_WEST); + const Geodetic2 swCorner = geodeticPatch.corner(Quad::SOUTH_EAST); + const glm::ivec2 pixelStart = geodeticToPixel(nwCorner, transform); + const glm::ivec2 pixelEnd = geodeticToPixel(swCorner, transform); + PixelRegion region; + region.start = pixelStart; + region.numPixels = pixelEnd - pixelStart; + return region; + } + + RawTile::ReadError postProcessErrorCheck(const RawTile& rawTile, + [[maybe_unused]] size_t nRasters, + float noDataValue) + { + ghoul_assert( + nRasters == rawTile.tileMetaData.nValues, + "Wrong numbers of max values" + ); + + const bool hasMissingData = std::any_of( + rawTile.tileMetaData.maxValues.begin(), + rawTile.tileMetaData.maxValues.begin() + rawTile.tileMetaData.nValues, + [noDataValue](float v) { return v == noDataValue; } + ); + + const bool onHighLevel = rawTile.tileIndex.level > 6; + if (hasMissingData && onHighLevel) { + return RawTile::ReadError::Fatal; + } + else { + return RawTile::ReadError::None; + } + } } // namespace RawTileDataReader::RawTileDataReader(std::string filePath, TileTextureInitData initData, diff --git a/modules/globebrowsing/src/rawtiledatareader.h b/modules/globebrowsing/src/rawtiledatareader.h index 37ef58407b..fc2bab4f35 100644 --- a/modules/globebrowsing/src/rawtiledatareader.h +++ b/modules/globebrowsing/src/rawtiledatareader.h @@ -27,20 +27,21 @@ #include #include -#include #include +#include +#include +#include #include -#include -#include #include +#include +#include +#include +#include class GDALDataset; -class GDALRasterBand; namespace openspace::globebrowsing { -class GeodeticPatch; - class RawTileDataReader { public: BooleanType(PerformPreprocessing); @@ -49,11 +50,11 @@ public: * Opens a GDALDataset in readonly mode and calculates meta data required for * reading tile using a TileIndex. * - * \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 + * \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 + * \param preprocess Whether the loaded data should be calculate meta data about the * dataset */ RawTileDataReader(std::string filePath, TileTextureInitData initData, diff --git a/modules/globebrowsing/src/renderableglobe.cpp b/modules/globebrowsing/src/renderableglobe.cpp index f530203e3c..ca55fc9b3d 100644 --- a/modules/globebrowsing/src/renderableglobe.cpp +++ b/modules/globebrowsing/src/renderableglobe.cpp @@ -29,21 +29,26 @@ #include #include #include +#include +#include #include #include -#include #include #include #include #include #include #include +#include #include #include #include #include #include +#include #include +#include +#include #include #include #include @@ -51,18 +56,13 @@ #include #include #include +#include +#include +#include #include -#include -#include - -#if defined(__APPLE__) || (defined(__linux__) && defined(__clang__)) -#include -namespace std { - using namespace experimental; -} // namespace std -#else -#include -#endif +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderableGlobe"; diff --git a/modules/globebrowsing/src/renderableglobe.h b/modules/globebrowsing/src/renderableglobe.h index d89fe4c17c..bbf56b9b6b 100644 --- a/modules/globebrowsing/src/renderableglobe.h +++ b/modules/globebrowsing/src/renderableglobe.h @@ -37,22 +37,22 @@ #include #include #include +#include #include #include #include #include +#include #include +#include #include -#include +#include +#include #include -namespace openspace::documentation { struct Documentation; } - namespace openspace::globebrowsing { -class GPULayerGroup; -class RenderableGlobe; -struct TileIndex; +class Layer; struct BoundingHeights { float min; @@ -61,9 +61,6 @@ struct BoundingHeights { bool tileOK; }; -namespace chunklevelevaluator { class Evaluator; } -namespace culling { class ChunkCuller; } - struct Chunk { enum class Status : uint8_t { DoNothing, @@ -105,9 +102,9 @@ public: void deinitializeGL() override; bool isReady() const override; + void update(const UpdateData& data) override; void render(const RenderData& data, RendererTasks& rendererTask) override; void renderSecondary(const RenderData& data, RendererTasks&) override; - void update(const UpdateData& data) override; SurfacePositionHandle calculateSurfacePositionHandle( const glm::dvec3& targetModelSpace) const override; diff --git a/modules/globebrowsing/src/ringscomponent.cpp b/modules/globebrowsing/src/ringscomponent.cpp index 81feb7d90c..54bbee522f 100644 --- a/modules/globebrowsing/src/ringscomponent.cpp +++ b/modules/globebrowsing/src/ringscomponent.cpp @@ -25,30 +25,29 @@ #include #include -#include #include -#include #include -#include -#include #include #include +#include #include #include -#include -#include +#include #include #include +#include #include #include #include #include #include #include +#include +#include #include -#include -#include -#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "RingsComponent"; diff --git a/modules/globebrowsing/src/ringscomponent.h b/modules/globebrowsing/src/ringscomponent.h index 288beb3277..850ee89b14 100644 --- a/modules/globebrowsing/src/ringscomponent.h +++ b/modules/globebrowsing/src/ringscomponent.h @@ -34,20 +34,21 @@ #include #include #include -#include +#include #include +#include +#include #include #include +#include -namespace ghoul { class Dictionary; } -namespace ghoul::filesystem { class File; } namespace ghoul::opengl { class ProgramObject; } namespace openspace { - struct RenderData; - struct UpdateData; namespace documentation { struct Documentation; } +struct RenderData; +struct UpdateData; class RingsComponent : public properties::PropertyOwner, public Fadeable { public: diff --git a/modules/globebrowsing/src/shadowcomponent.cpp b/modules/globebrowsing/src/shadowcomponent.cpp index ae0e14e74f..9d22d7bc2e 100644 --- a/modules/globebrowsing/src/shadowcomponent.cpp +++ b/modules/globebrowsing/src/shadowcomponent.cpp @@ -25,31 +25,20 @@ #include #include -#include -#include #include -#include #include -#include -#include #include #include +#include #include -#include +#include #include -#include #include #include #include -#include -#include -#include -#include -#include -#include #include -#include -#include +#include +#include namespace { constexpr std::string_view _loggerCat = "ShadowComponent"; diff --git a/modules/globebrowsing/src/shadowcomponent.h b/modules/globebrowsing/src/shadowcomponent.h index 167761bf18..1300c7df19 100644 --- a/modules/globebrowsing/src/shadowcomponent.h +++ b/modules/globebrowsing/src/shadowcomponent.h @@ -28,28 +28,24 @@ #include #include -#include #include #include -#include #include -#include -#include #include -#include -#include -#include -#include +#include +#include -namespace ghoul { class Dictionary; } -namespace ghoul::filesystem { class File; } -namespace ghoul::opengl { class ProgramObject; } +namespace ghoul { + namespace filesystem { class File; } + namespace opengl { class ProgramObject; } + class Dictionary; +} // namespace ghoul namespace openspace { - struct RenderData; - struct UpdateData; namespace documentation { struct Documentation; } +struct RenderData; +struct UpdateData; class ShadowComponent : public properties::PropertyOwner { public: @@ -120,8 +116,6 @@ private: glm::dvec3 _cameraFocus = glm::dvec3(0.0); glm::dquat _cameraRotation = glm::dquat(1.0, 0.0, 0.0, 0.0); - std::stringstream _serializedCamera; - std::unique_ptr _lightCamera; // DEBUG diff --git a/modules/globebrowsing/src/skirtedgrid.cpp b/modules/globebrowsing/src/skirtedgrid.cpp index a5d32707c6..a49119e696 100644 --- a/modules/globebrowsing/src/skirtedgrid.cpp +++ b/modules/globebrowsing/src/skirtedgrid.cpp @@ -24,8 +24,11 @@ #include -#include #include +#include +#include +#include +#include namespace { size_t numElements(int xSegments, int ySegments) { diff --git a/modules/globebrowsing/src/skirtedgrid.h b/modules/globebrowsing/src/skirtedgrid.h index 022d14cbea..84eb8a9f0c 100644 --- a/modules/globebrowsing/src/skirtedgrid.h +++ b/modules/globebrowsing/src/skirtedgrid.h @@ -25,9 +25,7 @@ #ifndef __OPENSPACE_MODULE_GLOBEBROWSING___SKIRTEDGRID___H__ #define __OPENSPACE_MODULE_GLOBEBROWSING___SKIRTEDGRID___H__ -#include #include -#include namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/tileindex.cpp b/modules/globebrowsing/src/tileindex.cpp index 8b9e3c35d1..7890686889 100644 --- a/modules/globebrowsing/src/tileindex.cpp +++ b/modules/globebrowsing/src/tileindex.cpp @@ -24,6 +24,8 @@ #include +#include + namespace openspace::globebrowsing { bool operator==(const TileIndex& lhs, const TileIndex& rhs) { diff --git a/modules/globebrowsing/src/tileindex.h b/modules/globebrowsing/src/tileindex.h index 83469d76c2..3768de81b3 100644 --- a/modules/globebrowsing/src/tileindex.h +++ b/modules/globebrowsing/src/tileindex.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/tileloadjob.cpp b/modules/globebrowsing/src/tileloadjob.cpp index 15257ac386..ca077d3d75 100644 --- a/modules/globebrowsing/src/tileloadjob.cpp +++ b/modules/globebrowsing/src/tileloadjob.cpp @@ -25,6 +25,7 @@ #include #include +#include namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/tileloadjob.h b/modules/globebrowsing/src/tileloadjob.h index 326876e58d..5ff93fa58c 100644 --- a/modules/globebrowsing/src/tileloadjob.h +++ b/modules/globebrowsing/src/tileloadjob.h @@ -26,8 +26,8 @@ #define __OPENSPACE_MODULE_GLOBEBROWSING___TILELOADJOB___H__ #include - #include + #include namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/tileprovider/defaulttileprovider.cpp b/modules/globebrowsing/src/tileprovider/defaulttileprovider.cpp index b1d99ae53d..18c3cc9634 100644 --- a/modules/globebrowsing/src/tileprovider/defaulttileprovider.cpp +++ b/modules/globebrowsing/src/tileprovider/defaulttileprovider.cpp @@ -29,7 +29,16 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo FilePathInfo = { diff --git a/modules/globebrowsing/src/tileprovider/defaulttileprovider.h b/modules/globebrowsing/src/tileprovider/defaulttileprovider.h index de1b514fc8..f297355b25 100644 --- a/modules/globebrowsing/src/tileprovider/defaulttileprovider.h +++ b/modules/globebrowsing/src/tileprovider/defaulttileprovider.h @@ -26,9 +26,13 @@ #define __OPENSPACE_MODULE_GLOBEBROWSING___TILEPROVIDER__DEFAULTTILEPROVIDER___H__ #include -#include + #include -#include +#include +#include +#include +#include +#include namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/tileprovider/imagesequencetileprovider.cpp b/modules/globebrowsing/src/tileprovider/imagesequencetileprovider.cpp index e3128d3d77..cbee800bcb 100644 --- a/modules/globebrowsing/src/tileprovider/imagesequencetileprovider.cpp +++ b/modules/globebrowsing/src/tileprovider/imagesequencetileprovider.cpp @@ -24,8 +24,13 @@ #include +#include #include #include +#include +#include +#include +#include #include namespace { diff --git a/modules/globebrowsing/src/tileprovider/imagesequencetileprovider.h b/modules/globebrowsing/src/tileprovider/imagesequencetileprovider.h index ab26c8389a..89634287a8 100644 --- a/modules/globebrowsing/src/tileprovider/imagesequencetileprovider.h +++ b/modules/globebrowsing/src/tileprovider/imagesequencetileprovider.h @@ -28,6 +28,9 @@ #include #include +#include +#include +#include namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/tileprovider/singleimagetileprovider.cpp b/modules/globebrowsing/src/tileprovider/singleimagetileprovider.cpp index eb8c324d4f..e72e6f93cb 100644 --- a/modules/globebrowsing/src/tileprovider/singleimagetileprovider.cpp +++ b/modules/globebrowsing/src/tileprovider/singleimagetileprovider.cpp @@ -25,7 +25,14 @@ #include #include +#include #include +#include +#include +#include +#include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo FilePathInfo = { diff --git a/modules/globebrowsing/src/tileprovider/singleimagetileprovider.h b/modules/globebrowsing/src/tileprovider/singleimagetileprovider.h index eed769ac3a..ea48cb0e83 100644 --- a/modules/globebrowsing/src/tileprovider/singleimagetileprovider.h +++ b/modules/globebrowsing/src/tileprovider/singleimagetileprovider.h @@ -27,7 +27,8 @@ #include -namespace openspace { struct Documentation; } +#include +#include namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/tileprovider/sizereferencetileprovider.cpp b/modules/globebrowsing/src/tileprovider/sizereferencetileprovider.cpp index 2ebe0e231b..67a413705d 100644 --- a/modules/globebrowsing/src/tileprovider/sizereferencetileprovider.cpp +++ b/modules/globebrowsing/src/tileprovider/sizereferencetileprovider.cpp @@ -25,10 +25,16 @@ #include #include +#include +#include #include #include #include -#include +#include +#include +#include +#include +#include #include #include diff --git a/modules/globebrowsing/src/tileprovider/sizereferencetileprovider.h b/modules/globebrowsing/src/tileprovider/sizereferencetileprovider.h index 622301f8f7..02d6642df3 100644 --- a/modules/globebrowsing/src/tileprovider/sizereferencetileprovider.h +++ b/modules/globebrowsing/src/tileprovider/sizereferencetileprovider.h @@ -27,6 +27,8 @@ #include +#include + namespace openspace::globebrowsing { class SizeReferenceTileProvider : public TextTileProvider { diff --git a/modules/globebrowsing/src/tileprovider/spoutimageprovider.cpp b/modules/globebrowsing/src/tileprovider/spoutimageprovider.cpp index f0080b81f6..626da0fc05 100644 --- a/modules/globebrowsing/src/tileprovider/spoutimageprovider.cpp +++ b/modules/globebrowsing/src/tileprovider/spoutimageprovider.cpp @@ -24,7 +24,12 @@ #include +#include #include +#include +#include +#include +#include #ifdef OPENSPACE_HAS_SPOUT #ifndef WIN32_LEAN_AND_MEAN @@ -175,7 +180,7 @@ void SpoutImageProvider::internalDeinitialize() { Tile SpoutImageProvider::tile(const TileIndex& tileIndex) { ZoneScoped; - spoutUpdate = true; + _spoutUpdate = true; return tiles[tileIndex.x]; } @@ -189,7 +194,7 @@ TileDepthTransform SpoutImageProvider::depthTransform() { void SpoutImageProvider::update() { #ifdef OPENSPACE_HAS_SPOUT - if (!spoutUpdate) { + if (!_spoutUpdate) { return; } diff --git a/modules/globebrowsing/src/tileprovider/spoutimageprovider.h b/modules/globebrowsing/src/tileprovider/spoutimageprovider.h index 31b185c83f..5feeb42408 100644 --- a/modules/globebrowsing/src/tileprovider/spoutimageprovider.h +++ b/modules/globebrowsing/src/tileprovider/spoutimageprovider.h @@ -27,7 +27,13 @@ #include +#include +#include +#include + +#ifdef OPENSPACE_HAS_SPOUT namespace openspace::spout { class SpoutReceiverPropertyProxy; } +#endif // OPENSPACE_HAS_SPOUT namespace openspace::globebrowsing { @@ -57,7 +63,7 @@ private: std::unique_ptr spoutReceiver; #endif // OPENSPACE_HAS_SPOUT - bool spoutUpdate = false; + bool _spoutUpdate = false; }; } // namespace openspace::globebrowsing diff --git a/modules/globebrowsing/src/tileprovider/temporaltileprovider.cpp b/modules/globebrowsing/src/tileprovider/temporaltileprovider.cpp index 29432982e5..344020049d 100644 --- a/modules/globebrowsing/src/tileprovider/temporaltileprovider.cpp +++ b/modules/globebrowsing/src/tileprovider/temporaltileprovider.cpp @@ -26,22 +26,35 @@ #include #include +#include #include +#include #include #include #include #include #include #include +#include #include #include +#include #include #include +#include +#include +#include +#include #include +#include #include +#include +#include +#include #include #include -#include +#include +#include #include namespace { diff --git a/modules/globebrowsing/src/tileprovider/temporaltileprovider.h b/modules/globebrowsing/src/tileprovider/temporaltileprovider.h index cdb064b6ab..4a9fda77e7 100644 --- a/modules/globebrowsing/src/tileprovider/temporaltileprovider.h +++ b/modules/globebrowsing/src/tileprovider/temporaltileprovider.h @@ -28,7 +28,20 @@ #include #include -#include +#include +#include +#include +#include +#include +#include +#include + +namespace ghoul::opengl { + class ProgramObject; + class Texture; +} // namespace ghoul::opengl + +namespace openspace { class Time; } namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/tileprovider/texttileprovider.cpp b/modules/globebrowsing/src/tileprovider/texttileprovider.cpp index ef94b8565a..4277af1d61 100644 --- a/modules/globebrowsing/src/tileprovider/texttileprovider.cpp +++ b/modules/globebrowsing/src/tileprovider/texttileprovider.cpp @@ -26,12 +26,18 @@ #include #include +#include +#include #include #include #include #include #include #include +#include +#include +#include +#include namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/tileprovider/texttileprovider.h b/modules/globebrowsing/src/tileprovider/texttileprovider.h index 0f2acbf2f8..ae9483502c 100644 --- a/modules/globebrowsing/src/tileprovider/texttileprovider.h +++ b/modules/globebrowsing/src/tileprovider/texttileprovider.h @@ -27,8 +27,18 @@ #include +#include +#include + +namespace ghoul::fontrendering { + class Font; + class FontRenderer; +} // namespace ghoul::fontrendering + namespace openspace::globebrowsing { +namespace cache { class MemoryAwareTileCache; } + class TextTileProvider : public TileProvider { public: explicit TextTileProvider(TileTextureInitData initData_, size_t fontSize_ = 48); diff --git a/modules/globebrowsing/src/tileprovider/tileindextileprovider.cpp b/modules/globebrowsing/src/tileprovider/tileindextileprovider.cpp index aa50fbfb04..527c961ef2 100644 --- a/modules/globebrowsing/src/tileprovider/tileindextileprovider.cpp +++ b/modules/globebrowsing/src/tileprovider/tileindextileprovider.cpp @@ -25,6 +25,13 @@ #include #include +#include +#include +#include +#include +#include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo UniqueBackgroundColors = { diff --git a/modules/globebrowsing/src/tileprovider/tileprovider.cpp b/modules/globebrowsing/src/tileprovider/tileprovider.cpp index 057ce06a29..1bc8794397 100644 --- a/modules/globebrowsing/src/tileprovider/tileprovider.cpp +++ b/modules/globebrowsing/src/tileprovider/tileprovider.cpp @@ -24,39 +24,12 @@ #include -#include #include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include #include #include -#include -#include #include -#include -#include "cpl_minixml.h" namespace { std::unique_ptr DefaultTileTexture; diff --git a/modules/globebrowsing/src/tileprovider/tileprovider.h b/modules/globebrowsing/src/tileprovider/tileprovider.h index 08522ebc21..ab8f69fb15 100644 --- a/modules/globebrowsing/src/tileprovider/tileprovider.h +++ b/modules/globebrowsing/src/tileprovider/tileprovider.h @@ -28,34 +28,18 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +namespace ghoul { class Dictionary; } +namespace openspace { struct Documentation; } struct CPLXMLNode; -namespace ghoul::fontrendering { - class Font; - class FontRenderer; -} // namespace ghoul::fontrendering - -namespace openspace { class PixelBuffer; } - namespace openspace::globebrowsing { - class AsyncTileDataProvider; - struct RawTile; - struct TileIndex; - namespace cache { class MemoryAwareTileCache; } -} // namespace openspace::globebrowsing -namespace openspace::globebrowsing { +struct TileIndex; // If you add a new type, also add it to shaders/texturetilemapping.glsl enum class Type { @@ -131,14 +115,11 @@ struct TileProvider : public properties::PropertyOwner { */ virtual float noDataValueAsFloat() = 0; - virtual ChunkTile chunkTile(TileIndex tileIndex, int parents = 0, int maxParents = 1337); ChunkTilePile chunkTilePile(TileIndex tileIndex, int pileSize); - std::string name; - uint16_t uniqueIdentifier = 0; bool isInitialized = false; diff --git a/modules/globebrowsing/src/tileprovider/tileproviderbydate.cpp b/modules/globebrowsing/src/tileprovider/tileproviderbydate.cpp index e7d943f04a..05656d3457 100644 --- a/modules/globebrowsing/src/tileprovider/tileproviderbydate.cpp +++ b/modules/globebrowsing/src/tileprovider/tileproviderbydate.cpp @@ -28,7 +28,12 @@ #include #include #include -#include +#include +#include +#include +#include +#include +#include namespace { struct [[codegen::Dictionary(TileProviderByDate)]] Parameters { diff --git a/modules/globebrowsing/src/tileprovider/tileproviderbydate.h b/modules/globebrowsing/src/tileprovider/tileproviderbydate.h index 89c2f90a5c..17794f186d 100644 --- a/modules/globebrowsing/src/tileprovider/tileproviderbydate.h +++ b/modules/globebrowsing/src/tileprovider/tileproviderbydate.h @@ -27,8 +27,6 @@ #include -#include - namespace openspace::globebrowsing { class TileProviderByDate : public TileProvider { diff --git a/modules/globebrowsing/src/tileprovider/tileproviderbyindex.cpp b/modules/globebrowsing/src/tileprovider/tileproviderbyindex.cpp index e2cd4f918a..6be9b39213 100644 --- a/modules/globebrowsing/src/tileprovider/tileproviderbyindex.cpp +++ b/modules/globebrowsing/src/tileprovider/tileproviderbyindex.cpp @@ -25,6 +25,13 @@ #include #include +#include +#include +#include +#include +#include +#include +#include namespace { // This TileProvider provides the ability to override the contents for tiles at diff --git a/modules/globebrowsing/src/tileprovider/tileproviderbyindex.h b/modules/globebrowsing/src/tileprovider/tileproviderbyindex.h index 5519d41df8..69c4b929f1 100644 --- a/modules/globebrowsing/src/tileprovider/tileproviderbyindex.h +++ b/modules/globebrowsing/src/tileprovider/tileproviderbyindex.h @@ -27,6 +27,9 @@ #include +#include +#include + namespace openspace::globebrowsing { class TileProviderByIndex : public TileProvider { diff --git a/modules/globebrowsing/src/tileprovider/tileproviderbylevel.cpp b/modules/globebrowsing/src/tileprovider/tileproviderbylevel.cpp index df59938b58..9d4df09e52 100644 --- a/modules/globebrowsing/src/tileprovider/tileproviderbylevel.cpp +++ b/modules/globebrowsing/src/tileprovider/tileproviderbylevel.cpp @@ -24,7 +24,13 @@ #include +#include #include +#include +#include +#include +#include +#include namespace { // This tile provider will switch between different tile providers specified within diff --git a/modules/globebrowsing/src/tiletextureinitdata.cpp b/modules/globebrowsing/src/tiletextureinitdata.cpp index 68c69993b1..ed8485829f 100644 --- a/modules/globebrowsing/src/tiletextureinitdata.cpp +++ b/modules/globebrowsing/src/tiletextureinitdata.cpp @@ -24,77 +24,79 @@ #include +#include +#include + namespace { -size_t numberOfRasters(ghoul::opengl::Texture::Format format) { - switch (format) { - case ghoul::opengl::Texture::Format::Red: - return 1; - case ghoul::opengl::Texture::Format::RG: - return 2; - case ghoul::opengl::Texture::Format::RGB: - case ghoul::opengl::Texture::Format::BGR: - return 3; - case ghoul::opengl::Texture::Format::RGBA: - case ghoul::opengl::Texture::Format::BGRA: - return 4; - default: - throw ghoul::MissingCaseException(); + size_t numberOfRasters(ghoul::opengl::Texture::Format format) { + switch (format) { + case ghoul::opengl::Texture::Format::Red: + return 1; + case ghoul::opengl::Texture::Format::RG: + return 2; + case ghoul::opengl::Texture::Format::RGB: + case ghoul::opengl::Texture::Format::BGR: + return 3; + case ghoul::opengl::Texture::Format::RGBA: + case ghoul::opengl::Texture::Format::BGRA: + return 4; + default: + throw ghoul::MissingCaseException(); + } } -} -size_t numberOfBytes(GLenum glType) { - switch (glType) { - case GL_UNSIGNED_BYTE: return sizeof(GLubyte); - case GL_BYTE: return sizeof(GLbyte); - case GL_UNSIGNED_SHORT: return sizeof(GLushort); - case GL_SHORT: return sizeof(GLshort); - case GL_UNSIGNED_INT: return sizeof(GLuint); - case GL_INT: return sizeof(GLint); - case GL_HALF_FLOAT: return sizeof(GLhalf); - case GL_FLOAT: return sizeof(GLfloat); - case GL_DOUBLE: return sizeof(GLdouble); - default: - throw ghoul::MissingCaseException(); + size_t numberOfBytes(GLenum glType) { + switch (glType) { + case GL_UNSIGNED_BYTE: return sizeof(GLubyte); + case GL_BYTE: return sizeof(GLbyte); + case GL_UNSIGNED_SHORT: return sizeof(GLushort); + case GL_SHORT: return sizeof(GLshort); + case GL_UNSIGNED_INT: return sizeof(GLuint); + case GL_INT: return sizeof(GLint); + case GL_HALF_FLOAT: return sizeof(GLhalf); + case GL_FLOAT: return sizeof(GLfloat); + case GL_DOUBLE: return sizeof(GLdouble); + default: + throw ghoul::MissingCaseException(); + } } -} -unsigned int uniqueIdForTextureFormat(ghoul::opengl::Texture::Format textureFormat) { - switch (textureFormat) { - case ghoul::opengl::Texture::Format::Red: return 0; - case ghoul::opengl::Texture::Format::RG: return 1; - case ghoul::opengl::Texture::Format::RGB: return 2; - case ghoul::opengl::Texture::Format::BGR: return 3; - case ghoul::opengl::Texture::Format::RGBA: return 4; - case ghoul::opengl::Texture::Format::BGRA: return 5; - case ghoul::opengl::Texture::Format::DepthComponent: return 6; - default: throw ghoul::MissingCaseException(); + unsigned int uniqueIdForTextureFormat(ghoul::opengl::Texture::Format textureFormat) { + switch (textureFormat) { + case ghoul::opengl::Texture::Format::Red: return 0; + case ghoul::opengl::Texture::Format::RG: return 1; + case ghoul::opengl::Texture::Format::RGB: return 2; + case ghoul::opengl::Texture::Format::BGR: return 3; + case ghoul::opengl::Texture::Format::RGBA: return 4; + case ghoul::opengl::Texture::Format::BGRA: return 5; + case ghoul::opengl::Texture::Format::DepthComponent: return 6; + default: throw ghoul::MissingCaseException(); + } } -} -openspace::globebrowsing::TileTextureInitData::HashKey calculateHashKey( + openspace::globebrowsing::TileTextureInitData::HashKey calculateHashKey( const glm::ivec3& dimensions, const ghoul::opengl::Texture::Format& format, const GLenum& glType) -{ - ghoul_assert(dimensions.x > 0, "Incorrect dimension"); - ghoul_assert(dimensions.y > 0, "Incorrect dimension"); - ghoul_assert(dimensions.x <= 1024, "Incorrect dimension"); - ghoul_assert(dimensions.y <= 1024, "Incorrect dimension"); - ghoul_assert(dimensions.z == 1, "Incorrect dimension"); - const unsigned int formatId = uniqueIdForTextureFormat(format); - ghoul_assert(formatId < 256, "Incorrect format"); + { + ghoul_assert(dimensions.x > 0, "Incorrect dimension"); + ghoul_assert(dimensions.y > 0, "Incorrect dimension"); + ghoul_assert(dimensions.x <= 1024, "Incorrect dimension"); + ghoul_assert(dimensions.y <= 1024, "Incorrect dimension"); + ghoul_assert(dimensions.z == 1, "Incorrect dimension"); + const unsigned int formatId = uniqueIdForTextureFormat(format); + ghoul_assert(formatId < 256, "Incorrect format"); - openspace::globebrowsing::TileTextureInitData::HashKey res = 0ULL; + openspace::globebrowsing::TileTextureInitData::HashKey res = 0ULL; - res |= dimensions.x; - res |= dimensions.y << 10; - res |= static_cast>(glType) << (10 + 16); - res |= formatId << (10 + 16 + 4); - - return res; -} + res |= dimensions.x; + res |= dimensions.y << 10; + res |= static_cast>(glType) << (10 + 16); + res |= formatId << (10 + 16 + 4); + return res; + } } // namespace namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/tiletextureinitdata.h b/modules/globebrowsing/src/tiletextureinitdata.h index 6ce5aec05c..38321acc5d 100644 --- a/modules/globebrowsing/src/tiletextureinitdata.h +++ b/modules/globebrowsing/src/tiletextureinitdata.h @@ -30,6 +30,7 @@ #include #include #include +#include namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/src/timequantizer.cpp b/modules/globebrowsing/src/timequantizer.cpp index 40a2a0f1bf..9e2d6806c1 100644 --- a/modules/globebrowsing/src/timequantizer.cpp +++ b/modules/globebrowsing/src/timequantizer.cpp @@ -34,8 +34,10 @@ #include #include #include -#include -#include +#include +#include +#include +#include // @TODO (abock, 2020-08-07) All of the time handling in this class should be cleaned up // a bit. There are lots of conversions between ISO strings for time and Time diff --git a/modules/globebrowsing/src/timequantizer.h b/modules/globebrowsing/src/timequantizer.h index 62f59f63d2..0dd1727309 100644 --- a/modules/globebrowsing/src/timequantizer.h +++ b/modules/globebrowsing/src/timequantizer.h @@ -25,8 +25,8 @@ #ifndef __OPENSPACE_MODULE_GLOBEBROWSING___TIMEQUANTIZER___H__ #define __OPENSPACE_MODULE_GLOBEBROWSING___TIMEQUANTIZER___H__ -#include #include +#include #include namespace openspace { class Time; } diff --git a/modules/imgui/imguimodule.cpp b/modules/imgui/imguimodule.cpp index 1ee6d88ad1..01cf5bea36 100644 --- a/modules/imgui/imguimodule.cpp +++ b/modules/imgui/imguimodule.cpp @@ -37,9 +37,24 @@ #include #include #include +#include #include #include +#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include // #define SHOW_IMGUI_HELPERS diff --git a/modules/imgui/imguimodule.h b/modules/imgui/imguimodule.h index 338201994f..033095a233 100644 --- a/modules/imgui/imguimodule.h +++ b/modules/imgui/imguimodule.h @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -49,6 +50,8 @@ #include #include #include +#include +#include struct ImGuiContext; diff --git a/modules/imgui/include/guicomponent.h b/modules/imgui/include/guicomponent.h index e4511d836a..ce25e65af3 100644 --- a/modules/imgui/include/guicomponent.h +++ b/modules/imgui/include/guicomponent.h @@ -26,6 +26,7 @@ #define __OPENSPACE_MODULE_IMGUI___GUICOMPONENT___H__ #include + #include namespace openspace::gui { diff --git a/modules/imgui/include/guigibscomponent.h b/modules/imgui/include/guigibscomponent.h index e3a55b4649..4d7d3d4d6a 100644 --- a/modules/imgui/include/guigibscomponent.h +++ b/modules/imgui/include/guigibscomponent.h @@ -27,8 +27,6 @@ #include -#include - namespace openspace::gui { class GuiGIBSComponent : public GuiComponent { diff --git a/modules/imgui/include/guiglobebrowsingcomponent.h b/modules/imgui/include/guiglobebrowsingcomponent.h index eb609dcbf2..9eb0687c37 100644 --- a/modules/imgui/include/guiglobebrowsingcomponent.h +++ b/modules/imgui/include/guiglobebrowsingcomponent.h @@ -27,8 +27,6 @@ #include -#include - namespace openspace::gui { class GuiGlobeBrowsingComponent : public GuiPropertyComponent { diff --git a/modules/imgui/include/guipropertycomponent.h b/modules/imgui/include/guipropertycomponent.h index 3783fd053a..c6df30088d 100644 --- a/modules/imgui/include/guipropertycomponent.h +++ b/modules/imgui/include/guipropertycomponent.h @@ -27,12 +27,9 @@ #include -#include #include #include #include -#include -#include namespace openspace::properties { class Property; diff --git a/modules/imgui/include/guiscenecomponent.h b/modules/imgui/include/guiscenecomponent.h index 7318a0b105..d4232ca226 100644 --- a/modules/imgui/include/guiscenecomponent.h +++ b/modules/imgui/include/guiscenecomponent.h @@ -27,8 +27,6 @@ #include -namespace openspace { class SceneGraphNode; } - namespace openspace::gui { class GuiSceneComponent : public GuiComponent { diff --git a/modules/imgui/include/guispacetimecomponent.h b/modules/imgui/include/guispacetimecomponent.h index e194c5174b..862ece3a3f 100644 --- a/modules/imgui/include/guispacetimecomponent.h +++ b/modules/imgui/include/guispacetimecomponent.h @@ -26,6 +26,7 @@ #define __OPENSPACE_MODULE_IMGUI___GUISPACETIMECOMPONENT___H__ #include + #include namespace openspace::gui { diff --git a/modules/imgui/include/renderproperties.h b/modules/imgui/include/renderproperties.h index e717dc9724..0b6dd5447e 100644 --- a/modules/imgui/include/renderproperties.h +++ b/modules/imgui/include/renderproperties.h @@ -26,85 +26,82 @@ #define __OPENSPACE_MODULE_IMGUI___RENDERPROPERTIES___H__ #include - #include -namespace openspace::properties { class Property; } - namespace openspace { +namespace properties { class Property; } + BooleanType(ShowToolTip); -void executeSetPropertyScript(const std::string& id, const std::string& value); - void renderBoolProperty(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderOptionProperty(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderSelectionProperty(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderStringProperty(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderIntListProperty(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderDoubleListProperty(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderStringListProperty(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderDoubleProperty(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderIntProperty(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderIVec2Property(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderIVec3Property(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderIVec4Property(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderFloatProperty(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderVec2Property(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderVec3Property(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderVec4Property(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderDVec2Property(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderDVec3Property(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderDVec4Property(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderDMat2Property(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderDMat3Property(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderDMat4Property(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); void renderTriggerProperty(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip = ShowToolTip::Yes, double tooltipDelay = 1.0); + ShowToolTip showTooltip = ShowToolTip::Yes, float tooltipDelay = 1.f); } // namespace openspace diff --git a/modules/imgui/src/guiactioncomponent.cpp b/modules/imgui/src/guiactioncomponent.cpp index 80b5307bab..46549f2b6b 100644 --- a/modules/imgui/src/guiactioncomponent.cpp +++ b/modules/imgui/src/guiactioncomponent.cpp @@ -27,10 +27,14 @@ #include #include #include +#include #include #include #include +#include +#include #include +#include namespace openspace::gui { diff --git a/modules/imgui/src/guicomponent.cpp b/modules/imgui/src/guicomponent.cpp index 2daeac8a5f..23201b9ee2 100644 --- a/modules/imgui/src/guicomponent.cpp +++ b/modules/imgui/src/guicomponent.cpp @@ -24,6 +24,8 @@ #include +#include + namespace { constexpr openspace::properties::Property::PropertyInfo EnabledInfo = { "Enabled", diff --git a/modules/imgui/src/guigibscomponent.cpp b/modules/imgui/src/guigibscomponent.cpp index 0f2ff65a05..1ea06f26c2 100644 --- a/modules/imgui/src/guigibscomponent.cpp +++ b/modules/imgui/src/guigibscomponent.cpp @@ -27,7 +27,9 @@ #include #include #include +#include #include +#include namespace { const ImVec2 WindowSize = ImVec2(350, 500); diff --git a/modules/imgui/src/guiglobebrowsingcomponent.cpp b/modules/imgui/src/guiglobebrowsingcomponent.cpp index 5ef2dc2072..fe22014708 100644 --- a/modules/imgui/src/guiglobebrowsingcomponent.cpp +++ b/modules/imgui/src/guiglobebrowsingcomponent.cpp @@ -33,9 +33,20 @@ #include #include #include +#include #include #include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace { const ImVec2 WindowSize = ImVec2(350, 500); diff --git a/modules/imgui/src/guimemorycomponent.cpp b/modules/imgui/src/guimemorycomponent.cpp index 9cba11e5a7..17feca9224 100644 --- a/modules/imgui/src/guimemorycomponent.cpp +++ b/modules/imgui/src/guimemorycomponent.cpp @@ -28,6 +28,7 @@ #include #include #include +#include namespace { const ImVec2 Size = ImVec2(350, 500); diff --git a/modules/imgui/src/guimissioncomponent.cpp b/modules/imgui/src/guimissioncomponent.cpp index 9bb9ba7373..82abcfd4cf 100644 --- a/modules/imgui/src/guimissioncomponent.cpp +++ b/modules/imgui/src/guimissioncomponent.cpp @@ -29,7 +29,9 @@ #include #include #include +#include #include +#include namespace { const ImVec2 Size = ImVec2(350, 500); diff --git a/modules/imgui/src/guiparallelcomponent.cpp b/modules/imgui/src/guiparallelcomponent.cpp index 6588e85827..f68cbc2f9e 100644 --- a/modules/imgui/src/guiparallelcomponent.cpp +++ b/modules/imgui/src/guiparallelcomponent.cpp @@ -28,12 +28,10 @@ #include #include #include +#include #include -#include #include #include -#include -#include namespace { void renderHost() { diff --git a/modules/imgui/src/guipropertycomponent.cpp b/modules/imgui/src/guipropertycomponent.cpp index 130d04ffe3..73a63adc84 100644 --- a/modules/imgui/src/guipropertycomponent.cpp +++ b/modules/imgui/src/guipropertycomponent.cpp @@ -29,8 +29,12 @@ #include #include #include +#include #include #include +#include +#include +#include //#define Debugging_ImGui_TreeNode_Indices diff --git a/modules/imgui/src/guiscenecomponent.cpp b/modules/imgui/src/guiscenecomponent.cpp index 4c9d6068d6..fbbee82137 100644 --- a/modules/imgui/src/guiscenecomponent.cpp +++ b/modules/imgui/src/guiscenecomponent.cpp @@ -31,9 +31,9 @@ #include #include #include +#include #include -#include -#include +#include namespace { const ImVec2 Size = ImVec2(350, 500); diff --git a/modules/imgui/src/guispacetimecomponent.cpp b/modules/imgui/src/guispacetimecomponent.cpp index 60300e5dab..6c1907515d 100644 --- a/modules/imgui/src/guispacetimecomponent.cpp +++ b/modules/imgui/src/guispacetimecomponent.cpp @@ -32,9 +32,18 @@ #include #include #include +#include #include #include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace { const ImVec2 Size = ImVec2(350, 500); diff --git a/modules/imgui/src/renderproperties.cpp b/modules/imgui/src/renderproperties.cpp index edc0317262..41e3f44b5a 100644 --- a/modules/imgui/src/renderproperties.cpp +++ b/modules/imgui/src/renderproperties.cpp @@ -35,9 +35,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -48,35 +50,46 @@ #include #include #include -#include -#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + void renderTooltip(openspace::properties::Property* prop, float delay) { + if (ImGui::IsItemHovered() && (GImGui->HoveredIdTimer > delay)) { + ImGui::BeginTooltip(); + if (!prop->description().empty()) { + ImGui::TextWrapped("%s", prop->description().c_str()); + ImGui::Spacing(); + } + std::string t = std::format("Identifier: {}", prop->uri()); + ImGui::Text("%s", t.c_str()); + ImGui::EndTooltip(); + } + } + + void executeSetPropertyScript(std::string_view id, const std::string& value) { + openspace::global::scriptEngine->queueScript( + std::format("openspace.setPropertyValueSingle('{}', {});", id, value) + ); + } +} // namespace namespace openspace { using namespace properties; -void renderTooltip(Property* prop, double delay) { - if (ImGui::IsItemHovered() && (GImGui->HoveredIdTimer > delay)) { - ImGui::BeginTooltip(); - if (!prop->description().empty()) { - ImGui::TextWrapped("%s", prop->description().c_str()); - ImGui::Spacing(); - } - std::string t = std::format("Identifier: {}", prop->uri()); - ImGui::Text("%s", t.c_str()); - ImGui::EndTooltip(); - } -} - -void executeSetPropertyScript(std::string_view id, const std::string& value) { - global::scriptEngine->queueScript( - std::format("openspace.setPropertyValueSingle('{}', {});", id, value) - ); -} - void renderBoolProperty(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); @@ -97,7 +110,7 @@ void renderBoolProperty(Property* prop, const std::string& ownerName, } void renderOptionProperty(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); @@ -142,7 +155,7 @@ void renderOptionProperty(Property* prop, const std::string& ownerName, } void renderSelectionProperty(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); SelectionProperty* p = static_cast(prop); @@ -186,7 +199,7 @@ void renderSelectionProperty(Property* prop, const std::string& ownerName, } void renderStringProperty(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); StringProperty* p = static_cast(prop); @@ -248,7 +261,7 @@ void renderListProperty(const std::string& name, std::string_view fullIdentifier } void renderDoubleListProperty(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); DoubleListProperty* p = static_cast(prop); @@ -266,7 +279,7 @@ void renderDoubleListProperty(Property* prop, const std::string& ownerName, } void renderIntListProperty(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); IntListProperty* p = static_cast(prop); @@ -284,7 +297,7 @@ void renderIntListProperty(Property* prop, const std::string& ownerName, } void renderStringListProperty(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); StringListProperty* p = static_cast(prop); @@ -302,7 +315,7 @@ void renderStringListProperty(Property* prop, const std::string& ownerName, } void renderDoubleProperty(properties::Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); DoubleProperty* p = static_cast(prop); @@ -338,7 +351,7 @@ void renderDoubleProperty(properties::Property* prop, const std::string& ownerNa } void renderIntProperty(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); IntProperty* p = static_cast(prop); @@ -362,7 +375,7 @@ void renderIntProperty(Property* prop, const std::string& ownerName, } void renderIVec2Property(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); IVec2Property* p = static_cast(prop); @@ -391,7 +404,7 @@ void renderIVec2Property(Property* prop, const std::string& ownerName, } void renderIVec3Property(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); IVec3Property* p = static_cast(prop); @@ -419,7 +432,7 @@ void renderIVec3Property(Property* prop, const std::string& ownerName, } void renderIVec4Property(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); IVec4Property* p = static_cast(prop); @@ -447,7 +460,7 @@ void renderIVec4Property(Property* prop, const std::string& ownerName, } void renderFloatProperty(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); FloatProperty* p = static_cast(prop); @@ -477,7 +490,7 @@ void renderFloatProperty(Property* prop, const std::string& ownerName, } void renderVec2Property(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); Vec2Property* p = static_cast(prop); @@ -513,7 +526,7 @@ void renderVec2Property(Property* prop, const std::string& ownerName, } void renderVec3Property(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); Vec3Property* p = static_cast(prop); @@ -555,7 +568,7 @@ void renderVec3Property(Property* prop, const std::string& ownerName, } void renderVec4Property(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); Vec4Property* p = static_cast(prop); @@ -597,7 +610,7 @@ void renderVec4Property(Property* prop, const std::string& ownerName, } void renderDVec2Property(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); DVec2Property* p = static_cast(prop); @@ -633,7 +646,7 @@ void renderDVec2Property(Property* prop, const std::string& ownerName, } void renderDVec3Property(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); DVec3Property* p = static_cast(prop); @@ -669,7 +682,7 @@ void renderDVec3Property(Property* prop, const std::string& ownerName, } void renderDVec4Property(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); DVec4Property* p = static_cast(prop); @@ -705,7 +718,7 @@ void renderDVec4Property(Property* prop, const std::string& ownerName, } void renderDMat2Property(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); DMat2Property* p = static_cast(prop); @@ -763,7 +776,7 @@ void renderDMat2Property(Property* prop, const std::string& ownerName, } void renderDMat3Property(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); DMat3Property* p = static_cast(prop); @@ -831,7 +844,7 @@ void renderDMat3Property(Property* prop, const std::string& ownerName, } void renderDMat4Property(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); DMat4Property* p = static_cast(prop); @@ -909,7 +922,7 @@ void renderDMat4Property(Property* prop, const std::string& ownerName, } void renderTriggerProperty(Property* prop, const std::string& ownerName, - ShowToolTip showTooltip, double tooltipDelay) + ShowToolTip showTooltip, float tooltipDelay) { ghoul_assert(prop, "prop must not be nullptr"); const std::string& name = prop->guiName(); diff --git a/modules/iswa/iswamodule.cpp b/modules/iswa/iswamodule.cpp index 7c62ab78ff..6e9b114580 100644 --- a/modules/iswa/iswamodule.cpp +++ b/modules/iswa/iswamodule.cpp @@ -32,12 +32,12 @@ #include #include #include -#include #include #include #include #include #include +#include #include #include diff --git a/modules/iswa/iswamodule.h b/modules/iswa/iswamodule.h index b99e35fef4..ca6d2c335c 100644 --- a/modules/iswa/iswamodule.h +++ b/modules/iswa/iswamodule.h @@ -22,12 +22,12 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ - #ifndef __OPENSPACE_MODULE_ISWA___ISWAMODULE___H__ - #define __OPENSPACE_MODULE_ISWA___ISWAMODULE___H__ +#ifndef __OPENSPACE_MODULE_ISWA___ISWAMODULE___H__ +#define __OPENSPACE_MODULE_ISWA___ISWAMODULE___H__ - #include +#include - namespace openspace { +namespace openspace { class IswaModule : public OpenSpaceModule { public: diff --git a/modules/iswa/rendering/iswabasegroup.cpp b/modules/iswa/rendering/iswabasegroup.cpp index c3edc9ddde..5a6a94bd1b 100644 --- a/modules/iswa/rendering/iswabasegroup.cpp +++ b/modules/iswa/rendering/iswabasegroup.cpp @@ -24,12 +24,12 @@ #include -#include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "IswaBaseGroup"; - using json = nlohmann::json; constexpr openspace::properties::Property::PropertyInfo EnabledInfo = { "Enabled", diff --git a/modules/iswa/rendering/iswabasegroup.h b/modules/iswa/rendering/iswabasegroup.h index da9f5e5cd7..d3e1c2f6e1 100644 --- a/modules/iswa/rendering/iswabasegroup.h +++ b/modules/iswa/rendering/iswabasegroup.h @@ -31,16 +31,19 @@ #include #include #include +#include + +namespace ghoul { class Dictionary; } namespace openspace { class DataProcessor; -class IswaCygnet; class IswaBaseGroup : public properties::PropertyOwner { public: IswaBaseGroup(std::string name, std::string type); ~IswaBaseGroup(); + bool isType(const std::string& type) const; void updateGroup(); @@ -61,6 +64,7 @@ protected: std::shared_ptr _dataProcessor; bool _registered = false; + private: std::string _iswaType; }; diff --git a/modules/iswa/rendering/iswadatagroup.cpp b/modules/iswa/rendering/iswadatagroup.cpp index 02da3afb02..65736093a4 100644 --- a/modules/iswa/rendering/iswadatagroup.cpp +++ b/modules/iswa/rendering/iswadatagroup.cpp @@ -31,12 +31,11 @@ #include #include #include -#include #include +#include namespace { constexpr std::string_view _loggerCat = "IswaDataGroup"; - using json = nlohmann::json; constexpr openspace::properties::Property::PropertyInfo UseLogInfo = { "UseLog", diff --git a/modules/iswa/rendering/iswadatagroup.h b/modules/iswa/rendering/iswadatagroup.h index b38c2d8502..357060b442 100644 --- a/modules/iswa/rendering/iswadatagroup.h +++ b/modules/iswa/rendering/iswadatagroup.h @@ -29,7 +29,9 @@ #include #include +#include #include +#include namespace openspace { diff --git a/modules/iswa/rendering/iswakameleongroup.cpp b/modules/iswa/rendering/iswakameleongroup.cpp index 2651117299..9940835a1d 100644 --- a/modules/iswa/rendering/iswakameleongroup.cpp +++ b/modules/iswa/rendering/iswakameleongroup.cpp @@ -28,13 +28,17 @@ #include #include #include +#include #include +#include #include +#include +#include #include +#include namespace { constexpr std::string_view _loggerCat = "IswaDataGroup"; - using json = nlohmann::json; constexpr openspace::properties::Property::PropertyInfo ResolutionInfo = { "Resolution", @@ -117,10 +121,13 @@ void IswaKameleonGroup::readFieldlinePaths(const std::filesystem::path& indexFil try { //Parse and add each fieldline as an selection - json fieldlines = json::parse(fileContent); + nlohmann::json fieldlines = nlohmann::json::parse(fileContent); int i = 0; - for (json::iterator it = fieldlines.begin(); it != fieldlines.end(); it++) { + for (nlohmann::json::iterator it = fieldlines.begin(); + it != fieldlines.end(); + it++) + { _fieldlines.addOption(it.key()); _fieldlineState[i] = std::make_tuple( identifier() + "/" + it.key(), @@ -130,7 +137,8 @@ void IswaKameleonGroup::readFieldlinePaths(const std::filesystem::path& indexFil i++; } - } catch (const std::exception& e) { + } + catch (const std::exception& e) { LERROR( "Error when reading json file with paths to seedpoints: " + std::string(e.what()) diff --git a/modules/iswa/rendering/iswakameleongroup.h b/modules/iswa/rendering/iswakameleongroup.h index b23f2b5451..4ed891de2e 100644 --- a/modules/iswa/rendering/iswakameleongroup.h +++ b/modules/iswa/rendering/iswakameleongroup.h @@ -27,6 +27,11 @@ #include +#include +#include +#include +#include + namespace openspace { class IswaKameleonGroup : public IswaDataGroup { diff --git a/modules/iswa/rendering/renderabledatacygnet.cpp b/modules/iswa/rendering/renderabledatacygnet.cpp index 4dfa83ba21..0e4983ff35 100644 --- a/modules/iswa/rendering/renderabledatacygnet.cpp +++ b/modules/iswa/rendering/renderabledatacygnet.cpp @@ -28,14 +28,22 @@ #include #include #include +#include #include +#include #include #include +#include +#include #include #include #include #include +#include #include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "DataCygnet"; diff --git a/modules/iswa/rendering/renderabledatacygnet.h b/modules/iswa/rendering/renderabledatacygnet.h index 1214625676..25ba8434d9 100644 --- a/modules/iswa/rendering/renderabledatacygnet.h +++ b/modules/iswa/rendering/renderabledatacygnet.h @@ -29,13 +29,13 @@ #include #include +#include #include #include namespace openspace { class DataProcessor; -namespace documentation { struct Documentation; } /** * This class abstracts away the the loading of data and creation of textures for all data diff --git a/modules/iswa/rendering/renderabledataplane.h b/modules/iswa/rendering/renderabledataplane.h index 5bb94df7a8..4cac4d0aa7 100644 --- a/modules/iswa/rendering/renderabledataplane.h +++ b/modules/iswa/rendering/renderabledataplane.h @@ -31,8 +31,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - /** * DataPlane is a concrete IswaCygnet with data files as its input source. The class * handles creation, destruction and rendering of a plane geometry. It also specifies what @@ -50,9 +48,6 @@ public: static documentation::Documentation Documentation(); private: - /** - * Creates a plane geometry. - */ bool createGeometry() override; bool destroyGeometry() override; void renderGeometry() const override; diff --git a/modules/iswa/rendering/renderabledatasphere.cpp b/modules/iswa/rendering/renderabledatasphere.cpp index 615ff5aa8c..e2a14e64da 100644 --- a/modules/iswa/rendering/renderabledatasphere.cpp +++ b/modules/iswa/rendering/renderabledatasphere.cpp @@ -31,8 +31,10 @@ #include #include #include -#include #include +#include +#include +#include namespace { struct [[codegen::Dictionary(RenderableDataSphere)]] Parameters { diff --git a/modules/iswa/rendering/renderabledatasphere.h b/modules/iswa/rendering/renderabledatasphere.h index d4b7f2fcdb..fb622898f4 100644 --- a/modules/iswa/rendering/renderabledatasphere.h +++ b/modules/iswa/rendering/renderabledatasphere.h @@ -30,7 +30,6 @@ namespace openspace { class Sphere; -namespace documentation { struct Documentation; } /** * DataSphere is a concrete IswaCygnet with data files as its input source. The class @@ -48,9 +47,6 @@ public: static documentation::Documentation Documentation(); protected: - /** - * Creates a sphere geometry. - */ bool createGeometry() override; bool destroyGeometry() override; void renderGeometry() const override; diff --git a/modules/iswa/rendering/renderableiswacygnet.cpp b/modules/iswa/rendering/renderableiswacygnet.cpp index d71eac0b57..9f7a08050e 100644 --- a/modules/iswa/rendering/renderableiswacygnet.cpp +++ b/modules/iswa/rendering/renderableiswacygnet.cpp @@ -29,16 +29,20 @@ #include #include #include +#include #include #include #include #include #include #include -#include +#include #include #include -#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "IswaCygnet"; diff --git a/modules/iswa/rendering/renderableiswacygnet.h b/modules/iswa/rendering/renderableiswacygnet.h index 86a006ce00..f82f58cc44 100644 --- a/modules/iswa/rendering/renderableiswacygnet.h +++ b/modules/iswa/rendering/renderableiswacygnet.h @@ -29,19 +29,18 @@ #include #include -#include +#include #include +#include #include #include -#include +#include namespace openspace { class IswaBaseGroup; class TransferFunction; -namespace documentation { struct Documentation; } - class RenderableIswaCygnet : public Renderable { public: explicit RenderableIswaCygnet(const ghoul::Dictionary& dictionary); diff --git a/modules/iswa/rendering/renderablekameleonplane.cpp b/modules/iswa/rendering/renderablekameleonplane.cpp index fc2caeaa12..4072e62c2a 100644 --- a/modules/iswa/rendering/renderablekameleonplane.cpp +++ b/modules/iswa/rendering/renderablekameleonplane.cpp @@ -33,15 +33,23 @@ #include #include #include +#include #include +#include #include +#include #include +#include #include #include +#include +#include +#include #include +#include +#include namespace { - using json = nlohmann::json; constexpr std::string_view _loggerCat = "KameleonPlane"; constexpr openspace::properties::Property::PropertyInfo FieldLineSeedsInfo = { @@ -357,11 +365,14 @@ void RenderableKameleonPlane::readFieldlinePaths(const std::filesystem::path& in else { try { //Parse and add each fieldline as an selection - json fieldlines = json::parse(seedFile); + nlohmann::json fieldlines = nlohmann::json::parse(seedFile); int i = 0; const std::string& fullName = identifier(); std::string partName = fullName.substr(0,fullName.find_last_of("-")); - for (json::iterator it = fieldlines.begin(); it != fieldlines.end(); it++) { + for (nlohmann::json::iterator it = fieldlines.begin(); + it != fieldlines.end(); + it++) + { _fieldlines.addOption(it.key()); _fieldlineState[i] = std::make_tuple( partName + "/" + it.key(), diff --git a/modules/iswa/rendering/renderablekameleonplane.h b/modules/iswa/rendering/renderablekameleonplane.h index 6b51f7c8f8..6ee72bc68b 100644 --- a/modules/iswa/rendering/renderablekameleonplane.h +++ b/modules/iswa/rendering/renderablekameleonplane.h @@ -28,7 +28,10 @@ #include #include +#include #include +#include +#include namespace openspace { @@ -50,9 +53,6 @@ public: static documentation::Documentation Documentation(); private: - /** - * Creates a plane geometry. - */ bool createGeometry() override; bool destroyGeometry() override; bool updateTextureResource() override; @@ -78,7 +78,6 @@ private: void subscribeToGroup(); void changeKwPath(std::string path); - static int id(); properties::SelectionProperty _fieldlines; properties::FloatProperty _resolution; diff --git a/modules/iswa/rendering/renderabletexturecygnet.cpp b/modules/iswa/rendering/renderabletexturecygnet.cpp index 818f23727f..97d9b40af4 100644 --- a/modules/iswa/rendering/renderabletexturecygnet.cpp +++ b/modules/iswa/rendering/renderabletexturecygnet.cpp @@ -26,9 +26,14 @@ #include #include +#include #include #include #include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "TextureCygnet"; diff --git a/modules/iswa/rendering/renderabletexturecygnet.h b/modules/iswa/rendering/renderabletexturecygnet.h index ba53897829..3d5df7245c 100644 --- a/modules/iswa/rendering/renderabletexturecygnet.h +++ b/modules/iswa/rendering/renderabletexturecygnet.h @@ -27,9 +27,9 @@ #include -namespace openspace { +#include -namespace documentation { struct Documentation; } +namespace openspace { /** * This class exist to abstract away the loading of images from iSWA and updating of the diff --git a/modules/iswa/rendering/renderabletextureplane.cpp b/modules/iswa/rendering/renderabletextureplane.cpp index bb110acccc..672589f314 100644 --- a/modules/iswa/rendering/renderabletextureplane.cpp +++ b/modules/iswa/rendering/renderabletextureplane.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include diff --git a/modules/iswa/rendering/renderabletextureplane.h b/modules/iswa/rendering/renderabletextureplane.h index c56f061137..c20d8e1fff 100644 --- a/modules/iswa/rendering/renderabletextureplane.h +++ b/modules/iswa/rendering/renderabletextureplane.h @@ -31,8 +31,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - /** * TexturePlane is a "concrete" IswaCygnet with texture as its input source. It handles * the creation, destruction and rendering of a plane geometry. It also specifies which diff --git a/modules/iswa/rendering/screenspacecygnet.cpp b/modules/iswa/rendering/screenspacecygnet.cpp index 2a12dfca1b..6fc581a931 100644 --- a/modules/iswa/rendering/screenspacecygnet.cpp +++ b/modules/iswa/rendering/screenspacecygnet.cpp @@ -25,9 +25,13 @@ #include #include +#include #include #include #include +#include +#include +#include namespace { struct [[codegen::Dictionary(ScreenSpaceCygnet)]] Parameters { diff --git a/modules/iswa/rendering/screenspacecygnet.h b/modules/iswa/rendering/screenspacecygnet.h index 72b7bc0e14..cc64bcdcbc 100644 --- a/modules/iswa/rendering/screenspacecygnet.h +++ b/modules/iswa/rendering/screenspacecygnet.h @@ -27,13 +27,10 @@ #include -#include #include namespace openspace { -namespace documentation { struct Documentation; } - class ScreenSpaceCygnet : public ScreenSpaceImageOnline { public: explicit ScreenSpaceCygnet(const ghoul::Dictionary& dictionary); diff --git a/modules/iswa/util/dataprocessor.cpp b/modules/iswa/util/dataprocessor.cpp index 580eaba557..501d836047 100644 --- a/modules/iswa/util/dataprocessor.cpp +++ b/modules/iswa/util/dataprocessor.cpp @@ -26,8 +26,10 @@ #include #include -#include #include +#include +#include +#include namespace openspace { diff --git a/modules/iswa/util/dataprocessor.h b/modules/iswa/util/dataprocessor.h index 3fc5942621..d0cc76bac4 100644 --- a/modules/iswa/util/dataprocessor.h +++ b/modules/iswa/util/dataprocessor.h @@ -25,6 +25,7 @@ #ifndef __OPENSPACE_MODULE_ISWA___DATAPROCESSOR___H__ #define __OPENSPACE_MODULE_ISWA___DATAPROCESSOR___H__ +#include #include #include #include @@ -36,8 +37,6 @@ namespace openspace { namespace properties { class SelectionProperty; } -class Histogram; - class DataProcessor { public: DataProcessor() = default; diff --git a/modules/iswa/util/dataprocessorjson.cpp b/modules/iswa/util/dataprocessorjson.cpp index 27892dfe21..8a89ce1467 100644 --- a/modules/iswa/util/dataprocessorjson.cpp +++ b/modules/iswa/util/dataprocessorjson.cpp @@ -26,9 +26,10 @@ #include #include -#include - -using json = nlohmann::json; +#include +#include +#include +#include namespace openspace { @@ -41,14 +42,17 @@ std::vector DataProcessorJson::readMetadata(const std::string& data { std::vector options = std::vector(); if (!data.empty()) { - const json& j = json::parse(data); - json variables = j["variables"]; + const nlohmann::json& j = nlohmann::json::parse(data); + nlohmann::json variables = j["variables"]; - for (json::iterator it = variables.begin(); it != variables.end(); it++) { + for (nlohmann::json::iterator it = variables.begin(); + it != variables.end(); + it++) + { std::string option = it.key(); if (option == "ep") { - const json& row = it.value(); - const json& col = row.at(0); + const nlohmann::json& row = it.value(); + const nlohmann::json& col = row.at(0); dimensions = glm::size3_t(col.size(), row.size(), 1); } @@ -68,19 +72,19 @@ void DataProcessorJson::addDataValues(const std::string& data, initializeVectors(numOptions); if (!data.empty()) { - const json& j = json::parse(data); - json variables = j["variables"]; + const nlohmann::json& j = nlohmann::json::parse(data); + nlohmann::json variables = j["variables"]; std::vector sum(numOptions, 0.f); std::vector> optionValues(numOptions, std::vector()); const std::vector& options = dataOptions.options(); for (int i = 0; i < numOptions; i++) { - const json& row = variables[options[i]]; + const nlohmann::json& row = variables[options[i]]; // int rowsize = row.size(); for (size_t y = 0; y < row.size(); y++) { - const json& col = row.at(y); + const nlohmann::json& col = row.at(y); const int colsize = static_cast(col.size()); for (int x = 0; x < colsize; x++) { @@ -104,8 +108,8 @@ std::vector DataProcessorJson::processData(const std::string& data, if (data.empty()) { return std::vector(); } - const json& j = json::parse(data); - json variables = j["variables"]; + const nlohmann::json& j = nlohmann::json::parse(data); + nlohmann::json variables = j["variables"]; const std::set& selectedOptions = optionProp; const std::vector& options = optionProp.options(); @@ -123,11 +127,11 @@ std::vector DataProcessorJson::processData(const std::string& data, // other mechanism (std::vector most likely) dataOptions[option] = new float[dimensions.x * dimensions.y] { 0.f }; - json row = variables[options[option]]; + nlohmann::json row = variables[options[option]]; const int rowsize = static_cast(row.size()); for (int y = 0; y < rowsize; y++) { - json col = row.at(y); + nlohmann::json col = row.at(y); const int colsize = static_cast(col.size()); for (int x = 0; x < colsize; x++) { diff --git a/modules/iswa/util/dataprocessorjson.h b/modules/iswa/util/dataprocessorjson.h index 1adc708c32..10f84c45b6 100644 --- a/modules/iswa/util/dataprocessorjson.h +++ b/modules/iswa/util/dataprocessorjson.h @@ -29,6 +29,8 @@ namespace openspace { +namespace properties { class SelectionProperty; } + class DataProcessorJson : public DataProcessor { public: DataProcessorJson(); diff --git a/modules/iswa/util/dataprocessorkameleon.cpp b/modules/iswa/util/dataprocessorkameleon.cpp index 2bdba7c69b..093d17d297 100644 --- a/modules/iswa/util/dataprocessorkameleon.cpp +++ b/modules/iswa/util/dataprocessorkameleon.cpp @@ -26,12 +26,14 @@ #include #include -#include -#include -#include #include +#include +#include #include #include +#include +#include +#include namespace openspace { diff --git a/modules/iswa/util/dataprocessorkameleon.h b/modules/iswa/util/dataprocessorkameleon.h index 366caeff39..32f4c75624 100644 --- a/modules/iswa/util/dataprocessorkameleon.h +++ b/modules/iswa/util/dataprocessorkameleon.h @@ -29,6 +29,7 @@ namespace openspace { +namespace properties { class SelectionProperty; } class KameleonWrapper; class DataProcessorKameleon : public DataProcessor { diff --git a/modules/iswa/util/dataprocessortext.cpp b/modules/iswa/util/dataprocessortext.cpp index 06b451548f..84152e340f 100644 --- a/modules/iswa/util/dataprocessortext.cpp +++ b/modules/iswa/util/dataprocessortext.cpp @@ -25,9 +25,12 @@ #include #include -#include +#include #include #include +#include +#include +#include #include namespace openspace { diff --git a/modules/iswa/util/dataprocessortext.h b/modules/iswa/util/dataprocessortext.h index 80a6c52c19..b73d1bf746 100644 --- a/modules/iswa/util/dataprocessortext.h +++ b/modules/iswa/util/dataprocessortext.h @@ -29,6 +29,8 @@ namespace openspace { +namespace properties { class SelectionProperty; } + class DataProcessorText : public DataProcessor { public: DataProcessorText(); diff --git a/modules/iswa/util/iswamanager.cpp b/modules/iswa/util/iswamanager.cpp index 67e1c37dd4..88dbb1e1a6 100644 --- a/modules/iswa/util/iswamanager.cpp +++ b/modules/iswa/util/iswamanager.cpp @@ -29,24 +29,30 @@ #include #include #include -#include #include #include #include #include #include #include -#include #include +#include #include #include -#include +#include #include +#include #include -#include +#include +#include #include -#include +#include +#include +#include #include +#include +#include +#include #include "iswamanager_lua.inl" diff --git a/modules/iswa/util/iswamanager.h b/modules/iswa/util/iswamanager.h index b07beda666..3645d5da31 100644 --- a/modules/iswa/util/iswamanager.h +++ b/modules/iswa/util/iswamanager.h @@ -29,9 +29,9 @@ #include #include +#include #include #include -#include namespace ccmc { class Kameleon; } @@ -40,7 +40,6 @@ namespace openspace { namespace scripting { struct LuaLibrary; } class IswaBaseGroup; -class IswaCygnet; struct CdfInfo { std::string name; diff --git a/modules/iswa/util/iswamanager_lua.inl b/modules/iswa/util/iswamanager_lua.inl index 63df455293..fd394cf578 100644 --- a/modules/iswa/util/iswamanager_lua.inl +++ b/modules/iswa/util/iswamanager_lua.inl @@ -22,7 +22,14 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include +#include +#include +#include #include +#include +#include +#include namespace { diff --git a/modules/kameleon/include/kameleonhelper.h b/modules/kameleon/include/kameleonhelper.h index 00c11d06ac..7b14cc2412 100644 --- a/modules/kameleon/include/kameleonhelper.h +++ b/modules/kameleon/include/kameleonhelper.h @@ -30,7 +30,7 @@ namespace ccmc { class Kameleon; } -namespace openspace::kameleonHelper { +namespace openspace::kameleonhelper { /** * Opens a ccmc::Kameleon object from the provided path to a .cdf file. Path should be @@ -41,6 +41,6 @@ namespace openspace::kameleonHelper { std::unique_ptr createKameleonObject(const std::string& cdfFilePath); double getTime(ccmc::Kameleon* kameleon, double manualOffset); -} //namespace openspace::kameleonHelper +} //namespace openspace::kameleonhelper #endif // __OPENSPACE_MODULE_KAMELEON___KAMELEONHELPER___H__ diff --git a/modules/kameleon/include/kameleonwrapper.h b/modules/kameleon/include/kameleonwrapper.h index 3d83151e82..665ce2a445 100644 --- a/modules/kameleon/include/kameleonwrapper.h +++ b/modules/kameleon/include/kameleonwrapper.h @@ -62,7 +62,7 @@ public: enum class TraceDirection { FORWARD = 1, - BACK = -1 + BACK = -1 }; enum class FieldlineEnd { diff --git a/modules/kameleon/src/kameleonhelper.cpp b/modules/kameleon/src/kameleonhelper.cpp index b621710f8c..a83e325a7e 100644 --- a/modules/kameleon/src/kameleonhelper.cpp +++ b/modules/kameleon/src/kameleonhelper.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #ifdef _MSC_VER #pragma warning (push) @@ -34,6 +35,7 @@ #pragma warning (disable : 4619) #endif // _MSC_VER +#include #include #include @@ -46,7 +48,7 @@ namespace { constexpr std::string_view _loggerCat = "KameleonHelper"; } // namespace -namespace openspace::kameleonHelper { +namespace openspace::kameleonhelper { std::unique_ptr createKameleonObject(const std::string& cdfFilePath) { auto kameleon = std::make_unique(); @@ -167,4 +169,4 @@ double getTime(ccmc::Kameleon* kameleon, double manualOffset) { return seqStartDbl + stateStartOffset + manualOffset; } -} // namespace openspace::kameleonHelper { +} // namespace openspace::kameleonhelper { diff --git a/modules/kameleon/src/kameleonwrapper.cpp b/modules/kameleon/src/kameleonwrapper.cpp index 06c8766ce9..c0334cfada 100644 --- a/modules/kameleon/src/kameleonwrapper.cpp +++ b/modules/kameleon/src/kameleonwrapper.cpp @@ -24,14 +24,20 @@ #include -#include -#include #include #include #include #include #include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #ifdef WIN32 #pragma warning (push) diff --git a/modules/kameleonvolume/kameleonvolumemodule.cpp b/modules/kameleonvolume/kameleonvolumemodule.cpp index e797f10b0a..9cbb3e1d65 100644 --- a/modules/kameleonvolume/kameleonvolumemodule.cpp +++ b/modules/kameleonvolume/kameleonvolumemodule.cpp @@ -30,7 +30,9 @@ #include #include #include +#include #include +#include #include namespace openspace { diff --git a/modules/kameleonvolume/kameleonvolumemodule.h b/modules/kameleonvolume/kameleonvolumemodule.h index 62bca23d0e..b0c78ff2c0 100644 --- a/modules/kameleonvolume/kameleonvolumemodule.h +++ b/modules/kameleonvolume/kameleonvolumemodule.h @@ -27,12 +27,8 @@ #include -#include - namespace openspace { -namespace documentation { struct Documentation; } - class KameleonVolumeModule : public OpenSpaceModule { public: constexpr static const char* Name = "KameleonVolume"; diff --git a/modules/kameleonvolume/kameleonvolumereader.cpp b/modules/kameleonvolume/kameleonvolumereader.cpp index 4e2b6d64f8..035b3ea244 100644 --- a/modules/kameleonvolume/kameleonvolumereader.cpp +++ b/modules/kameleonvolume/kameleonvolumereader.cpp @@ -27,12 +27,12 @@ #include #include #include -#include -#include #include -#include #include +#include #include +#include +#include #ifdef WIN32 #pragma warning (push) @@ -81,7 +81,7 @@ KameleonVolumeReader::KameleonVolumeReader(std::filesystem::path path) if (!std::filesystem::is_regular_file(_path)) { throw ghoul::FileNotFoundError(_path); } - _kameleon = kameleonHelper::createKameleonObject(_path.string()); + _kameleon = kameleonhelper::createKameleonObject(_path.string()); const long status = _kameleon->open(_path.string()); if (status != ccmc::FileReader::OK) { throw ghoul::RuntimeError(std::format( diff --git a/modules/kameleonvolume/kameleonvolumereader.h b/modules/kameleonvolume/kameleonvolumereader.h index 2a555e2952..e0149e6825 100644 --- a/modules/kameleonvolume/kameleonvolumereader.h +++ b/modules/kameleonvolume/kameleonvolumereader.h @@ -26,6 +26,7 @@ #define __OPENSPACE_MODULE_KAMELEONVOLUME___KAMELEONVOLUMEREADER___H__ #include +#include #include #include #include @@ -35,8 +36,7 @@ namespace ccmc { class Attribute; class Interpolator; class Kameleon; -} // namespce ccmc - +} // namespace ccmc namespace ghoul { class Dictionary; } namespace openspace::volume { template class RawVolume; } diff --git a/modules/kameleonvolume/rendering/renderablekameleonvolume.cpp b/modules/kameleonvolume/rendering/renderablekameleonvolume.cpp index d09a3b5fe1..3fe19a1621 100644 --- a/modules/kameleonvolume/rendering/renderablekameleonvolume.cpp +++ b/modules/kameleonvolume/rendering/renderablekameleonvolume.cpp @@ -26,27 +26,25 @@ #include #include -#include -#include #include #include #include -#include #include -#include #include -#include #include -#include +#include #include #include #include #include -#include #include +#include #include +#include #include +#include #include +#include namespace { constexpr std::string_view _loggerCat = "RenderableKameleonVolume"; diff --git a/modules/kameleonvolume/rendering/renderablekameleonvolume.h b/modules/kameleonvolume/rendering/renderablekameleonvolume.h index 818f0e3387..f22c82e771 100644 --- a/modules/kameleonvolume/rendering/renderablekameleonvolume.h +++ b/modules/kameleonvolume/rendering/renderablekameleonvolume.h @@ -29,19 +29,19 @@ #include #include +#include +#include #include #include #include +#include +#include -namespace openspace { - struct RenderData; - class TransferFunction; -} // namespace openspace +namespace openspace { class TransferFunction; } namespace openspace::volume { class BasicVolumeRaycaster; template class RawVolume; - class TransferFunctionHandler; class VolumeClipPlanes; } // openspace::volume @@ -97,7 +97,7 @@ private: std::unique_ptr _raycaster; std::shared_ptr _volumeTexture; - std::shared_ptr _transferFunction; + std::shared_ptr _transferFunction; }; } // namespace openspace::kameleonvolume diff --git a/modules/kameleonvolume/tasks/kameleondocumentationtask.cpp b/modules/kameleonvolume/tasks/kameleondocumentationtask.cpp index 6afa3f12dd..62be18356b 100644 --- a/modules/kameleonvolume/tasks/kameleondocumentationtask.cpp +++ b/modules/kameleonvolume/tasks/kameleondocumentationtask.cpp @@ -26,11 +26,17 @@ #include #include -#include +#include +#include #include +#include +#include #include -#include +#include #include +#include +#include +#include namespace { constexpr std::string_view MainTemplateFilename = diff --git a/modules/kameleonvolume/tasks/kameleondocumentationtask.h b/modules/kameleonvolume/tasks/kameleondocumentationtask.h index 218b0dd684..c4822a06a6 100644 --- a/modules/kameleonvolume/tasks/kameleondocumentationtask.h +++ b/modules/kameleonvolume/tasks/kameleondocumentationtask.h @@ -28,7 +28,6 @@ #include #include -#include namespace openspace::kameleonvolume { diff --git a/modules/kameleonvolume/tasks/kameleonmetadatatojsontask.cpp b/modules/kameleonvolume/tasks/kameleonmetadatatojsontask.cpp index a13af5ce2d..3cd155dc25 100644 --- a/modules/kameleonvolume/tasks/kameleonmetadatatojsontask.cpp +++ b/modules/kameleonvolume/tasks/kameleonmetadatatojsontask.cpp @@ -25,12 +25,14 @@ #include #include -#include +#include +#include #include #include +#include #include -#include #include +#include namespace { struct [[codegen::Dictionary(KameleonMetadataToJsonTask)]] Parameters { diff --git a/modules/kameleonvolume/tasks/kameleonmetadatatojsontask.h b/modules/kameleonvolume/tasks/kameleonmetadatatojsontask.h index b82aafa668..59c6b58d15 100644 --- a/modules/kameleonvolume/tasks/kameleonmetadatatojsontask.h +++ b/modules/kameleonvolume/tasks/kameleonmetadatatojsontask.h @@ -28,7 +28,6 @@ #include #include -#include namespace openspace::kameleonvolume { diff --git a/modules/kameleonvolume/tasks/kameleonvolumetorawtask.cpp b/modules/kameleonvolume/tasks/kameleonvolumetorawtask.cpp index ca5f226fb5..fc0c0575f3 100644 --- a/modules/kameleonvolume/tasks/kameleonvolumetorawtask.cpp +++ b/modules/kameleonvolume/tasks/kameleonvolumetorawtask.cpp @@ -25,14 +25,16 @@ #include #include +#include #include -#include +#include #include #include +#include #include #include -#include #include +#include namespace { struct [[codegen::Dictionary(KameleonVolumeToRawTask)]] Parameters { diff --git a/modules/kameleonvolume/tasks/kameleonvolumetorawtask.h b/modules/kameleonvolume/tasks/kameleonvolumetorawtask.h index c91b9e6901..9ce1b708cf 100644 --- a/modules/kameleonvolume/tasks/kameleonvolumetorawtask.h +++ b/modules/kameleonvolume/tasks/kameleonvolumetorawtask.h @@ -29,7 +29,6 @@ #include #include -#include namespace openspace::kameleonvolume { diff --git a/modules/multiresvolume/CMakeLists.txt b/modules/multiresvolume/CMakeLists.txt index b7bc7a1027..0517e3016d 100644 --- a/modules/multiresvolume/CMakeLists.txt +++ b/modules/multiresvolume/CMakeLists.txt @@ -47,6 +47,7 @@ set(SOURCE_FILES rendering/atlasmanager.cpp rendering/brickcover.cpp rendering/brickmanager.cpp + rendering/brickselector.cpp rendering/brickselection.cpp rendering/multiresvolumeraycaster.cpp rendering/shenbrickselector.cpp diff --git a/modules/multiresvolume/multiresvolumemodule.cpp b/modules/multiresvolume/multiresvolumemodule.cpp index 8df8828ae7..a7a76972cc 100644 --- a/modules/multiresvolume/multiresvolumemodule.cpp +++ b/modules/multiresvolume/multiresvolumemodule.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include namespace openspace { diff --git a/modules/multiresvolume/rendering/atlasmanager.cpp b/modules/multiresvolume/rendering/atlasmanager.cpp index 247c0dcfae..f3bab577c1 100644 --- a/modules/multiresvolume/rendering/atlasmanager.cpp +++ b/modules/multiresvolume/rendering/atlasmanager.cpp @@ -26,7 +26,10 @@ #include #include +#include #include +#include +#include #include namespace openspace { diff --git a/modules/multiresvolume/rendering/atlasmanager.h b/modules/multiresvolume/rendering/atlasmanager.h index e68de45c4e..91bf11902a 100644 --- a/modules/multiresvolume/rendering/atlasmanager.h +++ b/modules/multiresvolume/rendering/atlasmanager.h @@ -25,11 +25,10 @@ #ifndef __OPENSPACE_MODULE_MULTIRESVOLUME___ATLASMANAGER___H__ #define __OPENSPACE_MODULE_MULTIRESVOLUME___ATLASMANAGER___H__ -#include #include +#include #include #include -#include #include namespace ghoul::opengl { class Texture; } diff --git a/modules/multiresvolume/rendering/brickmanager.cpp b/modules/multiresvolume/rendering/brickmanager.cpp index d44182bb55..a94cea8cd6 100644 --- a/modules/multiresvolume/rendering/brickmanager.cpp +++ b/modules/multiresvolume/rendering/brickmanager.cpp @@ -29,6 +29,10 @@ #include #include #include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "BrickManager"; @@ -157,8 +161,7 @@ bool BrickManager::initialize() { return true; } -bool BrickManager::buildBrickList(BUFFER_INDEX bufferIndex, - std::vector &brickRequest) +bool BrickManager::buildBrickList(BufferIndex bufferIndex, std::vector& brickRequest) { // Keep track of number bricks used and number of bricks cached // (for benchmarking) @@ -281,7 +284,7 @@ void BrickManager::coordinatesFromLinear(int idx, int& x, int& y, int& z) { z = idx; } -bool BrickManager::diskToPBO(BUFFER_INDEX pboIndex) { +bool BrickManager::diskToPBO(BufferIndex pboIndex) { // Map PBO glBindBuffer(GL_PIXEL_UNPACK_BUFFER, _pboHandle[pboIndex]); glBufferData(GL_PIXEL_UNPACK_BUFFER, _volumeSize, nullptr, GL_STREAM_DRAW); @@ -406,8 +409,8 @@ bool BrickManager::diskToPBO(BUFFER_INDEX pboIndex) { return true; } -bool BrickManager::pboToAtlas(BUFFER_INDEX _pboIndex) { - glBindBuffer(GL_PIXEL_UNPACK_BUFFER, _pboHandle[_pboIndex]); +bool BrickManager::pboToAtlas(BufferIndex pboIndex) { + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, _pboHandle[pboIndex]); glm::size3_t dim = _textureAtlas->dimensions(); glBindTexture(GL_TEXTURE_3D, *_textureAtlas); glTexSubImage3D( @@ -433,11 +436,11 @@ ghoul::opengl::Texture* BrickManager::textureAtlas() { return _textureAtlas; } -unsigned int BrickManager::pbo(BUFFER_INDEX pboIndex) const { +unsigned int BrickManager::pbo(BufferIndex pboIndex) const { return _pboHandle[pboIndex]; } -const std::vector& BrickManager::brickList(BUFFER_INDEX index) const { +const std::vector& BrickManager::brickList(BufferIndex index) const { return _brickLists.at(index); } diff --git a/modules/multiresvolume/rendering/brickmanager.h b/modules/multiresvolume/rendering/brickmanager.h index 8269f46495..8acab7bd71 100644 --- a/modules/multiresvolume/rendering/brickmanager.h +++ b/modules/multiresvolume/rendering/brickmanager.h @@ -26,7 +26,6 @@ #define __OPENSPACE_MODULE_MULTIRESVOLUME___BRICKMANAGER___H__ #include - #include namespace ghoul::opengl { class Texture; } @@ -35,7 +34,7 @@ namespace openspace { class BrickManager { public: - enum BUFFER_INDEX { EVEN = 0, ODD = 1 }; + enum BufferIndex { EVEN = 0, ODD = 1 }; explicit BrickManager(TSP* tsp); ~BrickManager(); @@ -44,16 +43,16 @@ public: bool initialize(); - bool buildBrickList(BUFFER_INDEX bufferIndex, std::vector& brickRequest); + bool buildBrickList(BufferIndex bufferIndex, std::vector& brickRequest); bool fillVolume(float* in, float* out, unsigned int x, unsigned int y, unsigned int z); - bool diskToPBO(BUFFER_INDEX pboIndex); - bool pboToAtlas(BUFFER_INDEX pboIndex); + bool diskToPBO(BufferIndex pboIndex); + bool pboToAtlas(BufferIndex pboIndex); ghoul::opengl::Texture* textureAtlas(); - unsigned int pbo(BUFFER_INDEX pboIndex) const; - const std::vector& brickList(BUFFER_INDEX index) const; + unsigned int pbo(BufferIndex pboIndex) const; + const std::vector& brickList(BufferIndex index) const; private: void incrementCoordinates(); diff --git a/modules/multiresvolume/rendering/brickselection.h b/modules/multiresvolume/rendering/brickselection.h index 41db300770..38ea33cf9c 100644 --- a/modules/multiresvolume/rendering/brickselection.h +++ b/modules/multiresvolume/rendering/brickselection.h @@ -32,8 +32,8 @@ namespace openspace { struct BrickSelection { enum SplitType { None = 0, - Temporal = 1, - Spatial = 2 + Temporal, + Spatial }; BrickSelection(); diff --git a/modules/multiresvolume/rendering/brickselector.cpp b/modules/multiresvolume/rendering/brickselector.cpp new file mode 100644 index 0000000000..426202d362 --- /dev/null +++ b/modules/multiresvolume/rendering/brickselector.cpp @@ -0,0 +1,33 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2025 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#include + +namespace openspace { + +BrickSelector::~BrickSelector() {} + +bool BrickSelector::initialize() { return true; } + +} // namespace openspace diff --git a/modules/multiresvolume/rendering/brickselector.h b/modules/multiresvolume/rendering/brickselector.h index df7b31a7cf..6d9c94d864 100644 --- a/modules/multiresvolume/rendering/brickselector.h +++ b/modules/multiresvolume/rendering/brickselector.h @@ -31,8 +31,8 @@ namespace openspace { class BrickSelector { public: - virtual ~BrickSelector() {} - virtual bool initialize() { return true; } + virtual ~BrickSelector(); + virtual bool initialize(); virtual void selectBricks(int timestep, std::vector& bricks) = 0; }; diff --git a/modules/multiresvolume/rendering/errorhistogrammanager.cpp b/modules/multiresvolume/rendering/errorhistogrammanager.cpp index 9e24526862..aeb8ded73b 100644 --- a/modules/multiresvolume/rendering/errorhistogrammanager.cpp +++ b/modules/multiresvolume/rendering/errorhistogrammanager.cpp @@ -25,9 +25,14 @@ #include #include +#include #include -#include #include +#include +#include +#include +#include +#include namespace openspace { @@ -44,9 +49,9 @@ bool ErrorHistogramManager::buildHistograms(int numBins) { _maxBin = 1.f; // Should be calculated from tsp file as (maxValue - minValue) unsigned int numOtLevels = _tsp->numOTLevels(); - unsigned int numOtLeaves = static_cast(pow(8, numOtLevels - 1)); + unsigned int numOtLeaves = static_cast(std::pow(8, numOtLevels - 1)); unsigned int numBstLeaves = static_cast( - pow(2, _tsp->numBSTLevels() - 1) + std::pow(2, _tsp->numBSTLevels() - 1) ); _numInnerNodes = _tsp->numTotalNodes() - numOtLeaves * numBstLeaves; @@ -58,7 +63,7 @@ bool ErrorHistogramManager::buildHistograms(int numBins) { // All TSP Leaves int numOtNodes = _tsp->numOTNodes(); - int otOffset = static_cast((pow(8, numOtLevels - 1) - 1) / 7); + int otOffset = static_cast((std::pow(8, numOtLevels - 1) - 1) / 7); int numBstNodes = _tsp->numBSTNodes(); int bstOffset = numBstNodes / 2; @@ -123,7 +128,7 @@ bool ErrorHistogramManager::buildFromLeaf(unsigned int bstOffset, ancestorVoxels = it->second; } - float voxelScale = static_cast(pow(2.f, octreeLevel)); + float voxelScale = static_cast(std::pow(2.f, octreeLevel)); float invVoxelScale = 1.f / voxelScale; // Calculate leaf offset in ancestor sized voxels @@ -162,7 +167,7 @@ bool ErrorHistogramManager::buildFromLeaf(unsigned int bstOffset, octreeLastOnly &= octreeChild == 7; octreeNode = parentOffset(octreeNode, 8); - int childSize = static_cast(pow(2, octreeLevel) * brickDim); + int childSize = static_cast(std::pow(2, octreeLevel) * brickDim); leafOffset.x += (octreeChild % 2) * childSize; leafOffset.y += ((octreeChild / 2) % 2) * childSize; leafOffset.z += (octreeChild / 4) * childSize; @@ -181,7 +186,7 @@ bool ErrorHistogramManager::buildFromLeaf(unsigned int bstOffset, } bool ErrorHistogramManager::loadFromFile(const std::filesystem::path& filename) { - std::ifstream file(filename, std::ios::in | std::ios::binary); + std::ifstream file = std::ifstream(filename, std::ios::in | std::ios::binary); if (!file.is_open()) { return false; } @@ -206,13 +211,12 @@ bool ErrorHistogramManager::loadFromFile(const std::filesystem::path& filename) delete[] histogramData; // No need to deallocate histogram data, since histograms take ownership. - file.close(); return true; } bool ErrorHistogramManager::saveToFile(const std::filesystem::path& filename) { - std::ofstream file(filename, std::ios::out | std::ios::binary); + std::ofstream file = std::ofstream(filename, std::ios::out | std::ios::binary); if (!file.is_open()) { return false; } @@ -233,7 +237,6 @@ bool ErrorHistogramManager::saveToFile(const std::filesystem::path& filename) { file.write(reinterpret_cast(histogramData), sizeof(float) * nFloats); delete[] histogramData; - file.close(); return true; } @@ -302,14 +305,14 @@ int ErrorHistogramManager::parentOffset(int offset, int base) const { return -1; } const int depth = static_cast( - floor(log1p(((base - 1) * offset)) / log(base)) + std::floor(std::log1p(((base - 1) * offset)) / std::log(base)) ); - const int firstInLevel = static_cast((pow(base, depth) - 1) / (base - 1)); + const int firstInLevel = static_cast((std::pow(base, depth) - 1) / (base - 1)); const int inLevelOffset = offset - firstInLevel; const int parentDepth = depth - 1; const int firstInParentLevel = static_cast( - (pow(base, parentDepth) - 1) / (base - 1) + (std::pow(base, parentDepth) - 1) / (base - 1) ); const int parentInLevelOffset = inLevelOffset / base; @@ -339,14 +342,14 @@ unsigned int ErrorHistogramManager::brickToInnerNodeIndex(unsigned int brickInde const unsigned int numBstLevels = _tsp->numBSTLevels(); const unsigned int numInnerBstNodes = static_cast( - (pow(2, numBstLevels - 1) - 1) * numOtNodes + (std::pow(2, numBstLevels - 1) - 1) * numOtNodes ); if (brickIndex < numInnerBstNodes) { return brickIndex; } const unsigned int numOtLeaves = static_cast( - pow(8, _tsp->numOTLevels() - 1) + std::pow(8, _tsp->numOTLevels() - 1) ); const unsigned int numOtInnerNodes = (numOtNodes - numOtLeaves); @@ -375,14 +378,14 @@ unsigned int ErrorHistogramManager::innerNodeToBrickIndex( const unsigned int numBstLevels = _tsp->numBSTLevels(); const unsigned int numInnerBstNodes = static_cast( - (pow(2, numBstLevels - 1) - 1) * numOtNodes + (std::pow(2, numBstLevels - 1) - 1) * numOtNodes ); if (innerNodeIndex < numInnerBstNodes) { return innerNodeIndex; } const unsigned int numOtLeaves = static_cast( - pow(8, _tsp->numOTLevels() - 1) + std::pow(8, _tsp->numOTLevels() - 1) ); const unsigned int numOtInnerNodes = (numOtNodes - numOtLeaves); diff --git a/modules/multiresvolume/rendering/errorhistogrammanager.h b/modules/multiresvolume/rendering/errorhistogrammanager.h index 50d69f9f89..1d1f0d6f33 100644 --- a/modules/multiresvolume/rendering/errorhistogrammanager.h +++ b/modules/multiresvolume/rendering/errorhistogrammanager.h @@ -28,8 +28,9 @@ #include #include #include -#include +#include #include +#include namespace openspace { @@ -47,17 +48,6 @@ public: bool saveToFile(const std::filesystem::path& filename); private: - TSP* _tsp; - std::ifstream* _file; - - std::vector _histograms; - unsigned int _numInnerNodes; - float _minBin; - float _maxBin; - int _numBins; - - std::map> _voxelCache; - bool buildFromLeaf(unsigned int bstOffset, unsigned int octreeOffset); std::vector readValues(unsigned int brickIndex) const; @@ -71,6 +61,17 @@ private: float interpolate(const glm::vec3& samplePoint, const std::vector& voxels) const; + + TSP* _tsp; + std::ifstream* _file; + + std::vector _histograms; + unsigned int _numInnerNodes; + float _minBin; + float _maxBin; + int _numBins; + + std::map> _voxelCache; }; } // namespace openspace diff --git a/modules/multiresvolume/rendering/histogrammanager.cpp b/modules/multiresvolume/rendering/histogrammanager.cpp index 10c9783b64..e406b59be3 100644 --- a/modules/multiresvolume/rendering/histogrammanager.cpp +++ b/modules/multiresvolume/rendering/histogrammanager.cpp @@ -25,8 +25,10 @@ #include #include +#include #include -#include +#include +#include namespace openspace { @@ -52,7 +54,7 @@ Histogram* HistogramManager::histogram(unsigned int brickIndex) { } bool HistogramManager::buildHistogram(TSP* tsp, unsigned int brickIndex) { - Histogram histogram(_minBin, _maxBin, _numBins); + Histogram histogram = Histogram(_minBin, _maxBin, _numBins); const bool isBstLeaf = tsp->isBstLeaf(brickIndex); const bool isOctreeLeaf = tsp->isOctreeLeaf(brickIndex); @@ -122,7 +124,7 @@ std::vector HistogramManager::readValues(TSP* tsp, unsigned int brickInde } bool HistogramManager::loadFromFile(const std::filesystem::path& filename) { - std::ifstream file(filename, std::ios::in | std::ios::binary); + std::ifstream file = std::ifstream(filename, std::ios::in | std::ios::binary); if (!file.is_open()) { return false; } @@ -147,12 +149,11 @@ bool HistogramManager::loadFromFile(const std::filesystem::path& filename) { _histograms[i] = Histogram(_minBin, _maxBin, _numBins, data); } - file.close(); return true; } bool HistogramManager::saveToFile(const std::filesystem::path& filename) { - std::ofstream file(filename, std::ios::out | std::ios::binary); + std::ofstream file = std::ofstream(filename, std::ios::out | std::ios::binary); if (!file.is_open()) { return false; } @@ -173,7 +174,6 @@ bool HistogramManager::saveToFile(const std::filesystem::path& filename) { file.write(reinterpret_cast(histogramData.data()), sizeof(float) * nFloats); - file.close(); return true; } diff --git a/modules/multiresvolume/rendering/histogrammanager.h b/modules/multiresvolume/rendering/histogrammanager.h index e6843fac31..019f65d986 100644 --- a/modules/multiresvolume/rendering/histogrammanager.h +++ b/modules/multiresvolume/rendering/histogrammanager.h @@ -27,6 +27,7 @@ #include #include +#include namespace openspace { diff --git a/modules/multiresvolume/rendering/localerrorhistogrammanager.cpp b/modules/multiresvolume/rendering/localerrorhistogrammanager.cpp index bab44421e4..aed3fc0532 100644 --- a/modules/multiresvolume/rendering/localerrorhistogrammanager.cpp +++ b/modules/multiresvolume/rendering/localerrorhistogrammanager.cpp @@ -25,9 +25,16 @@ #include #include +#include #include -#include #include +#include +#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "LocalErrorHistogramManager"; diff --git a/modules/multiresvolume/rendering/localerrorhistogrammanager.h b/modules/multiresvolume/rendering/localerrorhistogrammanager.h index df0235e37b..0373dbd1cb 100644 --- a/modules/multiresvolume/rendering/localerrorhistogrammanager.h +++ b/modules/multiresvolume/rendering/localerrorhistogrammanager.h @@ -28,8 +28,9 @@ #include #include #include -#include +#include #include +#include namespace openspace { @@ -47,16 +48,6 @@ public: bool saveToFile(const std::filesystem::path& filename); private: - TSP* _tsp = nullptr; - std::ifstream* _file; - - std::vector _spatialHistograms; - std::vector _temporalHistograms; - unsigned int _numInnerNodes = 0; - float _minBin = 0.f; - float _maxBin = 0.f; - int _numBins = 0; - std::map> _voxelCache; bool buildFromOctreeChild(unsigned int bstOffset, unsigned int octreeOffset); @@ -73,6 +64,16 @@ private: unsigned int linearCoords(glm::ivec3 coords) const; float interpolate(glm::vec3 samplePoint, const std::vector& voxels) const; + + TSP* _tsp = nullptr; + std::ifstream* _file; + + std::vector _spatialHistograms; + std::vector _temporalHistograms; + unsigned int _numInnerNodes = 0; + float _minBin = 0.f; + float _maxBin = 0.f; + int _numBins = 0; }; } // namespace openspace diff --git a/modules/multiresvolume/rendering/localtfbrickselector.cpp b/modules/multiresvolume/rendering/localtfbrickselector.cpp index 1265978247..481114df14 100644 --- a/modules/multiresvolume/rendering/localtfbrickselector.cpp +++ b/modules/multiresvolume/rendering/localtfbrickselector.cpp @@ -24,11 +24,14 @@ #include -#include +#include #include +#include #include +#include #include #include +#include namespace { bool compareSplitPoints(const openspace::BrickSelection& a, diff --git a/modules/multiresvolume/rendering/localtfbrickselector.h b/modules/multiresvolume/rendering/localtfbrickselector.h index ce1a03226b..797d22b0b9 100644 --- a/modules/multiresvolume/rendering/localtfbrickselector.h +++ b/modules/multiresvolume/rendering/localtfbrickselector.h @@ -55,11 +55,6 @@ public: bool calculateBrickErrors(); private: - TSP* _tsp; - LocalErrorHistogramManager* _histogramManager; - TransferFunction* _transferFunction; - std::vector _brickErrors; - float spatialSplitPoints(unsigned int brickIndex) const; float temporalSplitPoints(unsigned int brickIndex) const; float splitPoints(unsigned int brickIndex, BrickSelection::SplitType& splitType); @@ -67,6 +62,10 @@ private: int linearCoordinates(int x, int y, int z) const; void writeSelection(BrickSelection coveredBricks, std::vector& bricks); + TSP* _tsp; + LocalErrorHistogramManager* _histogramManager; + TransferFunction* _transferFunction; + std::vector _brickErrors; int _memoryBudget; int _streamingBudget; }; diff --git a/modules/multiresvolume/rendering/multiresvolumeraycaster.cpp b/modules/multiresvolume/rendering/multiresvolumeraycaster.cpp index 7ddb2c86aa..37e882346c 100644 --- a/modules/multiresvolume/rendering/multiresvolumeraycaster.cpp +++ b/modules/multiresvolume/rendering/multiresvolumeraycaster.cpp @@ -26,12 +26,15 @@ #include #include -#include #include #include #include +#include #include #include +#include +#include +#include namespace { constexpr std::string_view GlslRaycastPath = diff --git a/modules/multiresvolume/rendering/multiresvolumeraycaster.h b/modules/multiresvolume/rendering/multiresvolumeraycaster.h index e394fe0002..b9e21b6607 100644 --- a/modules/multiresvolume/rendering/multiresvolumeraycaster.h +++ b/modules/multiresvolume/rendering/multiresvolumeraycaster.h @@ -31,20 +31,13 @@ #include #include #include -#include - -namespace ghoul::opengl { - class Texture; - class ProgramObject; -} // namespace ghoul::opengl +#include namespace openspace { class AtlasManager; -struct RenderData; -struct RaycastData; -class TSP; class TransferFunction; +class TSP; class MultiresVolumeRaycaster : public VolumeRaycaster { public: @@ -72,7 +65,6 @@ public: std::filesystem::path helperPath() const override; void setModelTransform(glm::mat4 transform); - //void setTime(double time); void setStepSizeCoefficient(float coefficient); private: @@ -89,8 +81,7 @@ private: std::unique_ptr< ghoul::opengl::BufferBinding > _atlasMapBinding; - -}; // MultiresVolumeRaycaster +}; } // namespace openspace diff --git a/modules/multiresvolume/rendering/renderablemultiresvolume.cpp b/modules/multiresvolume/rendering/renderablemultiresvolume.cpp index 2221517c38..fb3217f2d3 100644 --- a/modules/multiresvolume/rendering/renderablemultiresvolume.cpp +++ b/modules/multiresvolume/rendering/renderablemultiresvolume.cpp @@ -24,20 +24,17 @@ #include -#include #include #include #include #include #include #include -#include #include #include #include #include #include -#include #include #include #include @@ -48,17 +45,15 @@ #include #include #include -#include #include #include -#include -#include -#include +#include #include #include #include #include -#include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderableMultiresVolume"; diff --git a/modules/multiresvolume/rendering/renderablemultiresvolume.h b/modules/multiresvolume/rendering/renderablemultiresvolume.h index 61f9b9b6e7..f1e93028f6 100644 --- a/modules/multiresvolume/rendering/renderablemultiresvolume.h +++ b/modules/multiresvolume/rendering/renderablemultiresvolume.h @@ -34,18 +34,11 @@ #include #include #include - -namespace ghoul { class Dictionary; } -namespace ghoul::filesystem { class File; } -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl +#include namespace openspace { class AtlasManager; -class BrickSelector; class ErrorHistogramManager; class HistogramManager; class LocalErrorHistogramManager; @@ -78,12 +71,6 @@ public: virtual void update(const UpdateData& data) override; virtual void render(const RenderData& data, RendererTasks& tasks) override; - //virtual void preResolve(ghoul::opengl::ProgramObject* program) override; - //virtual std::string getHeaderPath() override; - //virtual std::string getHelperPath() override; - //virtual std::vector getTextures() override; - //virtual std::vector getBuffers() override; - private: properties::BoolProperty _useGlobalTime; properties::BoolProperty _loop; @@ -104,7 +91,6 @@ private: double _startTime; double _endTime; - // Stats timers std::string _statsFileName; bool _gatheringStats = false; diff --git a/modules/multiresvolume/rendering/shenbrickselector.h b/modules/multiresvolume/rendering/shenbrickselector.h index 6b323c8d62..961b68a330 100644 --- a/modules/multiresvolume/rendering/shenbrickselector.h +++ b/modules/multiresvolume/rendering/shenbrickselector.h @@ -28,7 +28,6 @@ #include #include -#include namespace openspace { @@ -43,10 +42,6 @@ public: void selectBricks(int timestep, std::vector& bricks) override; private: - TSP* _tsp; - float _spatialTolerance; - float _temporalTolerance; - void traverseOT(int timestep, unsigned int brickIndex, BrickCover coveredBricks, std::vector& bricks); @@ -62,6 +57,10 @@ private: void selectCover(BrickCover coveredBricks, unsigned int brickIndex, std::vector& bricks) const; + + TSP* _tsp; + float _spatialTolerance; + float _temporalTolerance; }; } // namespace openspace diff --git a/modules/multiresvolume/rendering/simpletfbrickselector.cpp b/modules/multiresvolume/rendering/simpletfbrickselector.cpp index 245e8d4052..bc4365701a 100644 --- a/modules/multiresvolume/rendering/simpletfbrickselector.cpp +++ b/modules/multiresvolume/rendering/simpletfbrickselector.cpp @@ -24,12 +24,15 @@ #include -#include +#include #include +#include #include #include #include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "SimpleTfBrickSelector"; diff --git a/modules/multiresvolume/rendering/simpletfbrickselector.h b/modules/multiresvolume/rendering/simpletfbrickselector.h index 7da6e9ba7f..441544d341 100644 --- a/modules/multiresvolume/rendering/simpletfbrickselector.h +++ b/modules/multiresvolume/rendering/simpletfbrickselector.h @@ -28,7 +28,6 @@ #include #include -#include namespace openspace { diff --git a/modules/multiresvolume/rendering/tfbrickselector.cpp b/modules/multiresvolume/rendering/tfbrickselector.cpp index 22c2f3bcd8..70e179ef85 100644 --- a/modules/multiresvolume/rendering/tfbrickselector.cpp +++ b/modules/multiresvolume/rendering/tfbrickselector.cpp @@ -24,12 +24,14 @@ #include +#include #include #include #include #include #include #include +#include namespace { bool compareSplitPoints(const openspace::BrickSelection& a, diff --git a/modules/multiresvolume/rendering/tfbrickselector.h b/modules/multiresvolume/rendering/tfbrickselector.h index 2e4fa43da1..19606dcec0 100644 --- a/modules/multiresvolume/rendering/tfbrickselector.h +++ b/modules/multiresvolume/rendering/tfbrickselector.h @@ -28,13 +28,12 @@ #include #include -#include namespace openspace { -class TSP; class ErrorHistogramManager; class TransferFunction; +class TSP; class TfBrickSelector : public BrickSelector { public: @@ -50,11 +49,6 @@ public: bool calculateBrickErrors(); private: - TSP* _tsp; - ErrorHistogramManager* _histogramManager; - TransferFunction* _transferFunction; - std::vector _brickErrors; - float spatialSplitPoints(unsigned int brickIndex); float temporalSplitPoints(unsigned int brickIndex); float splitPoints(unsigned int brickIndex, BrickSelection::SplitType& splitType); @@ -62,6 +56,11 @@ private: int linearCoords(int x, int y, int z) const; void writeSelection(BrickSelection coveredBricks, std::vector& bricks) const; + TSP* _tsp; + ErrorHistogramManager* _histogramManager; + TransferFunction* _transferFunction; + std::vector _brickErrors; + int _memoryBudget; int _streamingBudget; }; diff --git a/modules/multiresvolume/rendering/tsp.cpp b/modules/multiresvolume/rendering/tsp.cpp index 0c995f587f..7bf2546d0c 100644 --- a/modules/multiresvolume/rendering/tsp.cpp +++ b/modules/multiresvolume/rendering/tsp.cpp @@ -24,15 +24,18 @@ #include -#include #include #include #include #include #include +#include +#include #include +#include #include #include +#include namespace { constexpr std::string_view _loggerCat = "TSP"; diff --git a/modules/multiresvolume/rendering/tsp.h b/modules/multiresvolume/rendering/tsp.h index 0cd2e247ed..291db8853f 100644 --- a/modules/multiresvolume/rendering/tsp.h +++ b/modules/multiresvolume/rendering/tsp.h @@ -28,8 +28,8 @@ #include #include #include +#include #include -#include #include namespace openspace { @@ -109,11 +109,6 @@ private: */ std::list coveredBSTLeafBricks(unsigned int brickIndex) const; - /** - * Return a list of eight children brick incices given a brick index. - */ - std::list childBricks(unsigned int brickIndex); - std::filesystem::path _filename; std::ifstream _file; std::streampos _dataOffset; diff --git a/modules/opensoundcontrol/CMakeLists.txt b/modules/opensoundcontrol/CMakeLists.txt index e797a2f522..3074e31731 100644 --- a/modules/opensoundcontrol/CMakeLists.txt +++ b/modules/opensoundcontrol/CMakeLists.txt @@ -53,6 +53,6 @@ else () target_compile_options(oscpack PRIVATE "-w") endif () -target_include_directories(openspace-module-opensoundcontrol SYSTEM PRIVATE ext/oscpack) -target_link_libraries(openspace-module-opensoundcontrol PRIVATE oscpack) +target_include_directories(openspace-module-opensoundcontrol SYSTEM PUBLIC ext/oscpack) +target_link_libraries(openspace-module-opensoundcontrol PUBLIC oscpack) end_dependency("oscpack") diff --git a/modules/opensoundcontrol/include/opensoundcontrolconnection.h b/modules/opensoundcontrol/include/opensoundcontrolconnection.h index c2a76ae6fa..28758f4008 100644 --- a/modules/opensoundcontrol/include/opensoundcontrolconnection.h +++ b/modules/opensoundcontrol/include/opensoundcontrolconnection.h @@ -25,8 +25,9 @@ #ifndef __OPENSPACE_MODULE_OPENSOUNDCONTROL___OPENSOUNDCONTROLCONNECTION___H__ #define __OPENSPACE_MODULE_OPENSOUNDCONTROL___OPENSOUNDCONTROLCONNECTION___H__ -#include -#include +#include +#include +#include #include #include #include @@ -42,6 +43,7 @@ public: void send(const std::string& label, const std::vector& data); + private: UdpTransmitSocket _socket; char* _buffer = nullptr; diff --git a/modules/opensoundcontrol/opensoundcontrolmodule.cpp b/modules/opensoundcontrol/opensoundcontrolmodule.cpp index b67e2c454e..68a84469fb 100644 --- a/modules/opensoundcontrol/opensoundcontrolmodule.cpp +++ b/modules/opensoundcontrol/opensoundcontrolmodule.cpp @@ -24,7 +24,6 @@ #include - namespace openspace { OpenSoundControlModule::OpenSoundControlModule() : OpenSpaceModule("OpenSoundControl") {} diff --git a/modules/opensoundcontrol/opensoundcontrolmodule.h b/modules/opensoundcontrol/opensoundcontrolmodule.h index f420dad013..ce5ed442ab 100644 --- a/modules/opensoundcontrol/opensoundcontrolmodule.h +++ b/modules/opensoundcontrol/opensoundcontrolmodule.h @@ -25,7 +25,7 @@ #ifndef __OPENSPACE_MODULE_OPENSOUNDCONTROL___OPENSOUNDCONTROLMODULE___H__ #define __OPENSPACE_MODULE_OPENSOUNDCONTROL___OPENSOUNDCONTROLMODULE___H__ -#include "openspace/util/openspacemodule.h" +#include namespace openspace { diff --git a/modules/opensoundcontrol/src/opensoundcontrolconnection.cpp b/modules/opensoundcontrol/src/opensoundcontrolconnection.cpp index d3a7e0665d..2c959e5886 100644 --- a/modules/opensoundcontrol/src/opensoundcontrolconnection.cpp +++ b/modules/opensoundcontrol/src/opensoundcontrolconnection.cpp @@ -25,6 +25,8 @@ #include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "OpenSoundControlConnection"; diff --git a/modules/server/include/connection.h b/modules/server/include/connection.h index 63abaa03d2..da2b3c4b3a 100644 --- a/modules/server/include/connection.h +++ b/modules/server/include/connection.h @@ -27,6 +27,7 @@ #include #include +#include #include #include #include diff --git a/modules/server/include/connectionpool.h b/modules/server/include/connectionpool.h index 605152ecdc..46d50ac623 100644 --- a/modules/server/include/connectionpool.h +++ b/modules/server/include/connectionpool.h @@ -51,10 +51,10 @@ public: private: void disconnectAllConnections(); - std::mutex _connectionMutex; void removeDisconnectedSockets(); void acceptNewSockets(); + std::mutex _connectionMutex; SocketHandleFunc _handleSocket; std::vector> _socketServers; std::vector> _sockets; diff --git a/modules/server/include/jsonconverters.h b/modules/server/include/jsonconverters.h index b35e4075ed..dc7bdfaa66 100644 --- a/modules/server/include/jsonconverters.h +++ b/modules/server/include/jsonconverters.h @@ -27,7 +27,6 @@ #include #include -#include namespace openspace::properties { @@ -63,6 +62,8 @@ void to_json(nlohmann::json& j, const Renderable* pR); namespace ghoul { +class Dictionary; + void to_json(nlohmann::json& j, const Dictionary& d); void to_json(nlohmann::json& j, const Dictionary* d); diff --git a/modules/server/include/logging/notificationlog.h b/modules/server/include/logging/notificationlog.h index 09a369fe47..75ef89e915 100644 --- a/modules/server/include/logging/notificationlog.h +++ b/modules/server/include/logging/notificationlog.h @@ -29,6 +29,7 @@ #include #include +#include namespace openspace { diff --git a/modules/server/include/serverinterface.h b/modules/server/include/serverinterface.h index 42117f5297..d02ef53372 100644 --- a/modules/server/include/serverinterface.h +++ b/modules/server/include/serverinterface.h @@ -26,12 +26,16 @@ #define __OPENSPACE_MODULE_SERVER___SERVERINTERFACE___H__ #include + #include #include #include #include #include #include +#include + +namespace ghoul { class Dictionary; } namespace openspace { diff --git a/modules/server/include/topics/bouncetopic.h b/modules/server/include/topics/bouncetopic.h index 2b7107e36c..1c25b5c566 100644 --- a/modules/server/include/topics/bouncetopic.h +++ b/modules/server/include/topics/bouncetopic.h @@ -29,8 +29,6 @@ namespace openspace { -class Connection; - class BounceTopic : public Topic { public: BounceTopic() = default; diff --git a/modules/server/include/topics/camerapathtopic.h b/modules/server/include/topics/camerapathtopic.h index 855ac14741..ed383c2c51 100644 --- a/modules/server/include/topics/camerapathtopic.h +++ b/modules/server/include/topics/camerapathtopic.h @@ -26,6 +26,7 @@ #define __OPENSPACE_MODULE_SERVER___CAMERAPATHTOPIC___H__ #include + #include namespace openspace { diff --git a/modules/server/include/topics/cameratopic.h b/modules/server/include/topics/cameratopic.h index 058f98f602..fa30ed11fa 100644 --- a/modules/server/include/topics/cameratopic.h +++ b/modules/server/include/topics/cameratopic.h @@ -26,6 +26,8 @@ #define __OPENSPACE_MODULE_SERVER___CAMERATOPIC___H__ #include + +#include #include namespace openspace { diff --git a/modules/server/include/topics/downloadeventtopic.h b/modules/server/include/topics/downloadeventtopic.h index 8b3b65dcd0..5ed4cf9268 100644 --- a/modules/server/include/topics/downloadeventtopic.h +++ b/modules/server/include/topics/downloadeventtopic.h @@ -28,6 +28,7 @@ #include #include +#include namespace openspace { @@ -41,7 +42,7 @@ public: private: bool _isSubscribedTo = false; int _subscriptionID = -1; - std::unordered_map _lastCallBack; + std::unordered_map _lastCallback; }; } // namespace openspace diff --git a/modules/server/include/topics/errorlogtopic.h b/modules/server/include/topics/errorlogtopic.h index 163df34f2e..dc383d0d6d 100644 --- a/modules/server/include/topics/errorlogtopic.h +++ b/modules/server/include/topics/errorlogtopic.h @@ -26,7 +26,10 @@ #define __OPENSPACE_MODULE_SERVER___ERRORLOGTOPIC____H__ #include -#include + +#include + +namespace ghoul::logging { class Log; } namespace openspace { @@ -46,7 +49,8 @@ private: void createLog(ghoul::logging::LogLevel logLevel); bool _isSubscribedTo = false; - // Non owning but we remove the log from LogManager on destruction + + // Non-owning but we remove the log from LogManager on destruction ghoul::logging::Log* _log = nullptr; }; diff --git a/modules/server/include/topics/eventtopic.h b/modules/server/include/topics/eventtopic.h index bfb589c231..2e203e56e3 100644 --- a/modules/server/include/topics/eventtopic.h +++ b/modules/server/include/topics/eventtopic.h @@ -28,6 +28,7 @@ #include #include +#include namespace openspace::properties { class Property; } diff --git a/modules/server/include/topics/flightcontrollertopic.h b/modules/server/include/topics/flightcontrollertopic.h index 6d6d84ed33..20aef6424f 100644 --- a/modules/server/include/topics/flightcontrollertopic.h +++ b/modules/server/include/topics/flightcontrollertopic.h @@ -29,11 +29,6 @@ #include -namespace openspace::interaction { - struct WebsocketInputStates; - struct WebsocketInputState; -} // namespace openspace::interaction - namespace openspace { class FlightControllerTopic : public Topic { @@ -49,16 +44,6 @@ public: void handleAutopilot(const nlohmann::json &json); private: - bool _isDone = false; - bool _autopilotEngaged; - nlohmann::json _payload; - nlohmann::json _focusNodes; - nlohmann::json _allNodes; - nlohmann::json _interestingTimes; - - openspace::interaction::WebsocketInputStates _inputStates; - openspace::interaction::WebsocketInputState _inputState; - void connect(); void disconnect(); void processInputState(const nlohmann::json& json); @@ -70,6 +55,16 @@ private: void setFriction(const nlohmann::json& json) const; void setFriction(bool roll, bool rotation, bool zoom) const; void setFriction(bool all) const; + + bool _isDone = false; + bool _autopilotEngaged; + nlohmann::json _payload; + nlohmann::json _focusNodes; + nlohmann::json _allNodes; + nlohmann::json _interestingTimes; + + openspace::interaction::WebsocketInputStates _inputStates; + openspace::interaction::WebsocketInputState _inputState; }; } // namespace openspace diff --git a/modules/server/include/topics/missiontopic.h b/modules/server/include/topics/missiontopic.h index 40610daf51..4ac2a87d2e 100644 --- a/modules/server/include/topics/missiontopic.h +++ b/modules/server/include/topics/missiontopic.h @@ -27,12 +27,10 @@ #include -#include - -using nlohmann::json; - namespace openspace { +class MissionPhase; + class MissionTopic : public Topic { public: MissionTopic() = default; diff --git a/modules/server/include/topics/profiletopic.h b/modules/server/include/topics/profiletopic.h index fe932a9abb..b8c085a055 100644 --- a/modules/server/include/topics/profiletopic.h +++ b/modules/server/include/topics/profiletopic.h @@ -27,8 +27,6 @@ #include -using nlohmann::json; - namespace openspace { class ProfileTopic : public Topic { diff --git a/modules/server/include/topics/skybrowsertopic.h b/modules/server/include/topics/skybrowsertopic.h index 12d542465f..9c43584bf9 100644 --- a/modules/server/include/topics/skybrowsertopic.h +++ b/modules/server/include/topics/skybrowsertopic.h @@ -26,6 +26,7 @@ #define __OPENSPACE_MODULE_SERVER___SKY_BROWSER_TOPIC___H__ #include + #include namespace openspace { diff --git a/modules/server/include/topics/subscriptiontopic.h b/modules/server/include/topics/subscriptiontopic.h index 1e4da57f73..a39ad5f809 100644 --- a/modules/server/include/topics/subscriptiontopic.h +++ b/modules/server/include/topics/subscriptiontopic.h @@ -27,10 +27,10 @@ #include -namespace openspace::properties { class Property; } - namespace openspace { +namespace properties { class Property; } + class SubscriptionTopic : public Topic { public: SubscriptionTopic() = default; diff --git a/modules/server/include/topics/timetopic.h b/modules/server/include/topics/timetopic.h index ff2c20aff7..fb465f5b43 100644 --- a/modules/server/include/topics/timetopic.h +++ b/modules/server/include/topics/timetopic.h @@ -26,7 +26,9 @@ #define __OPENSPACE_MODULE_SERVER___TIME_TOPIC___H__ #include + #include +#include namespace openspace { diff --git a/modules/server/include/topics/topic.h b/modules/server/include/topics/topic.h index 9099845f52..8eb9db814f 100644 --- a/modules/server/include/topics/topic.h +++ b/modules/server/include/topics/topic.h @@ -26,6 +26,8 @@ #define __OPENSPACE_MODULE_SERVER___TOPIC___H__ #include +#include +#include namespace openspace { diff --git a/modules/server/servermodule.cpp b/modules/server/servermodule.cpp index 50eca6d3d1..ab14054f27 100644 --- a/modules/server/servermodule.cpp +++ b/modules/server/servermodule.cpp @@ -24,22 +24,21 @@ #include -#include #include #include -#include #include #include -#include -#include #include #include -#include +#include #include -#include -#include +#include +#include #include -#include +#include +#include +#include +#include namespace { struct [[codegen::Dictionary(ServerModule)]] Parameters { @@ -58,7 +57,7 @@ documentation::Documentation ServerModule::Documentation() { ServerModule::ServerModule() : OpenSpaceModule(ServerModule::Name) - , _interfaceOwner({"Interfaces", "Interfaces", "Server Interfaces"}) + , _interfaceOwner({ "Interfaces", "Interfaces", "Server Interfaces" }) { addPropertySubOwner(_interfaceOwner); diff --git a/modules/server/servermodule.h b/modules/server/servermodule.h index aa46637ced..8e241f7689 100644 --- a/modules/server/servermodule.h +++ b/modules/server/servermodule.h @@ -28,10 +28,11 @@ #include #include - #include +#include #include #include +#include namespace openspace { @@ -41,11 +42,6 @@ constexpr int SOCKET_API_VERSION_PATCH = 0; class Connection; -struct Message { - std::weak_ptr connection; - std::string messageString; -}; - class ServerModule : public OpenSpaceModule { public: static constexpr const char* Name = "Server"; @@ -68,6 +64,11 @@ protected: void internalInitialize(const ghoul::Dictionary& configuration) override; private: + struct Message { + std::weak_ptr connection; + std::string messageString; + }; + struct ConnectionData { std::shared_ptr connection; bool isMarkedForRemoval = false; diff --git a/modules/server/src/connection.cpp b/modules/server/src/connection.cpp index ff99ccf5ff..ed3f9ea3f5 100644 --- a/modules/server/src/connection.cpp +++ b/modules/server/src/connection.cpp @@ -24,6 +24,7 @@ #include +#include #include #include #include @@ -37,24 +38,28 @@ #include #include #include +#include #include #include -#include #include #include #include #include #include #include -#include -#include #include #include #include -#include -#include #include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "ServerModule: Connection"; @@ -62,7 +67,6 @@ namespace { constexpr std::string_view MessageKeyType = "type"; constexpr std::string_view MessageKeyPayload = "payload"; constexpr std::string_view MessageKeyTopic = "topic"; - } // namespace namespace openspace { diff --git a/modules/server/src/connectionpool.cpp b/modules/server/src/connectionpool.cpp index 52da146c18..91e26d4e06 100644 --- a/modules/server/src/connectionpool.cpp +++ b/modules/server/src/connectionpool.cpp @@ -27,6 +27,7 @@ #include #include #include +#include namespace openspace { diff --git a/modules/server/src/jsonconverters.cpp b/modules/server/src/jsonconverters.cpp index 69805ab5b9..59fbf9702b 100644 --- a/modules/server/src/jsonconverters.cpp +++ b/modules/server/src/jsonconverters.cpp @@ -26,9 +26,12 @@ #include #include +#include #include #include -#include +#include +#include +#include using json = nlohmann::json; diff --git a/modules/server/src/logging/notificationlog.cpp b/modules/server/src/logging/notificationlog.cpp index 028700408e..822fb23e6f 100644 --- a/modules/server/src/logging/notificationlog.cpp +++ b/modules/server/src/logging/notificationlog.cpp @@ -24,6 +24,8 @@ #include +#include + namespace openspace { NotificationLog::NotificationLog(CallbackFunction callbackFunction, diff --git a/modules/server/src/serverinterface.cpp b/modules/server/src/serverinterface.cpp index f600a8591c..dff25afd82 100644 --- a/modules/server/src/serverinterface.cpp +++ b/modules/server/src/serverinterface.cpp @@ -25,9 +25,11 @@ #include #include +#include #include #include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo EnabledInfo = { diff --git a/modules/server/src/topics/actionkeybindtopic.cpp b/modules/server/src/topics/actionkeybindtopic.cpp index 8021a9fead..05ec121e78 100644 --- a/modules/server/src/topics/actionkeybindtopic.cpp +++ b/modules/server/src/topics/actionkeybindtopic.cpp @@ -29,12 +29,29 @@ #include #include #include -#include +#include +#include +#include +#include +#include +#include +#include using nlohmann::json; namespace openspace { +void ActionKeybindTopic::handleJson(const nlohmann::json& input) { + const std::string& event = input.at("event").get(); + if (event == "get_all") { + sendData(allActionsKeybinds()); + } + else if (event == "get_action") { + const std::string& identifier = input.at("identifier").get(); + sendData(action(identifier)); + } +} + bool ActionKeybindTopic::isDone() const { return true; } @@ -116,15 +133,4 @@ void ActionKeybindTopic::sendData(nlohmann::json data) const { _connection->sendJson(std::move(payload)); } -void ActionKeybindTopic::handleJson(const nlohmann::json& input) { - const std::string& event = input.at("event").get(); - if (event == "get_all") { - sendData(allActionsKeybinds()); - } - else if (event == "get_action") { - const std::string& identifier = input.at("identifier").get(); - sendData(action(identifier)); - } -} - } // namespace openspace diff --git a/modules/server/src/topics/authorizationtopic.cpp b/modules/server/src/topics/authorizationtopic.cpp index 75451cb6e2..c797dde96a 100644 --- a/modules/server/src/topics/authorizationtopic.cpp +++ b/modules/server/src/topics/authorizationtopic.cpp @@ -25,9 +25,10 @@ #include #include -#include -#include #include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "AuthorizationTopic"; diff --git a/modules/server/src/topics/camerapathtopic.cpp b/modules/server/src/topics/camerapathtopic.cpp index c5a565e95d..68f817d700 100644 --- a/modules/server/src/topics/camerapathtopic.cpp +++ b/modules/server/src/topics/camerapathtopic.cpp @@ -32,7 +32,10 @@ #include #include #include -#include +#include +#include +#include +#include namespace { constexpr std::string_view SubscribeEvent = "start_subscription"; @@ -55,10 +58,6 @@ CameraPathTopic::~CameraPathTopic() { } } -bool CameraPathTopic::isDone() const { - return _isDone; -} - void CameraPathTopic::handleJson(const nlohmann::json& json) { const std::string event = json.at("event").get(); @@ -82,6 +81,10 @@ void CameraPathTopic::handleJson(const nlohmann::json& json) { ); } +bool CameraPathTopic::isDone() const { + return _isDone; +} + void CameraPathTopic::sendCameraPathData() { const interaction::PathNavigator& pathNavigator = global::navigationHandler->pathNavigator(); diff --git a/modules/server/src/topics/cameratopic.cpp b/modules/server/src/topics/cameratopic.cpp index 27c9622179..8075d548ec 100644 --- a/modules/server/src/topics/cameratopic.cpp +++ b/modules/server/src/topics/cameratopic.cpp @@ -24,24 +24,19 @@ #include -#ifdef OPENSPACE_MODULE_SPACE_ENABLED -#include -#endif // OPENSPACE_MODULE_SPACE_ENABLED #include #include #include #include -#include #include #include -#include +#include +#include namespace { constexpr std::string_view SubscribeEvent = "start_subscription"; } // namespace -using nlohmann::json; - namespace openspace { CameraTopic::CameraTopic() diff --git a/modules/server/src/topics/documentationtopic.cpp b/modules/server/src/topics/documentationtopic.cpp index d813f9971c..cf4ef83f2d 100644 --- a/modules/server/src/topics/documentationtopic.cpp +++ b/modules/server/src/topics/documentationtopic.cpp @@ -25,15 +25,8 @@ #include #include -#include #include -#include #include -#include -#include -#include - -using nlohmann::json; namespace openspace { diff --git a/modules/server/src/topics/downloadeventtopic.cpp b/modules/server/src/topics/downloadeventtopic.cpp index dbfc2f5fb4..f594b56acb 100644 --- a/modules/server/src/topics/downloadeventtopic.cpp +++ b/modules/server/src/topics/downloadeventtopic.cpp @@ -27,7 +27,7 @@ #include #include #include -#include +#include namespace { constexpr std::string_view StartSubscription = "start_subscription"; @@ -44,10 +44,6 @@ DownloadEventTopic::~DownloadEventTopic() { } } -bool DownloadEventTopic::isDone() const { - return !_isSubscribedTo; -} - void DownloadEventTopic::handleJson(const nlohmann::json& json) { const std::string& event = json.at("event").get(); @@ -58,7 +54,7 @@ void DownloadEventTopic::handleJson(const nlohmann::json& json) { // Limit how often we send data to frontend to reduce traffic if (event.type == DownloadEventEngine::DownloadEvent::Type::Progress) { const auto now = std::chrono::steady_clock::now(); - auto& last = _lastCallBack[event.id]; + auto& last = _lastCallback[event.id]; if (now - last >= CallbackUpdateInterval) { last = now; @@ -87,4 +83,8 @@ void DownloadEventTopic::handleJson(const nlohmann::json& json) { } } +bool DownloadEventTopic::isDone() const { + return !_isSubscribedTo; +} + } // namespace openspace diff --git a/modules/server/src/topics/enginemodetopic.cpp b/modules/server/src/topics/enginemodetopic.cpp index 744200c342..6fccc7f305 100644 --- a/modules/server/src/topics/enginemodetopic.cpp +++ b/modules/server/src/topics/enginemodetopic.cpp @@ -26,8 +26,8 @@ #include #include -#include #include +#include namespace { constexpr std::string_view _loggerCat = "EngineModeTopic"; @@ -51,10 +51,6 @@ EngineModeTopic::~EngineModeTopic() { } } -bool EngineModeTopic::isDone() const { - return _isDone; -} - void EngineModeTopic::handleJson(const nlohmann::json& json) { const std::string event = json.at("event").get(); if (event != SubscribeEvent && event != UnsubscribeEvent && @@ -85,6 +81,10 @@ void EngineModeTopic::handleJson(const nlohmann::json& json) { } } +bool EngineModeTopic::isDone() const { + return _isDone; +} + void EngineModeTopic::sendJsonData() { const OpenSpaceEngine::Mode mode = global::openSpaceEngine->currentMode(); std::string modeString; diff --git a/modules/server/src/topics/errorlogtopic.cpp b/modules/server/src/topics/errorlogtopic.cpp index c6d0790004..7a225f34fa 100644 --- a/modules/server/src/topics/errorlogtopic.cpp +++ b/modules/server/src/topics/errorlogtopic.cpp @@ -25,7 +25,11 @@ #include #include +#include #include +#include +#include +#include namespace { constexpr std::string_view StartSubscription = "start_subscription"; diff --git a/modules/server/src/topics/eventtopic.cpp b/modules/server/src/topics/eventtopic.cpp index 9c3f5c2f9e..9af3580809 100644 --- a/modules/server/src/topics/eventtopic.cpp +++ b/modules/server/src/topics/eventtopic.cpp @@ -31,6 +31,11 @@ #include #include #include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "EventTopic"; @@ -43,10 +48,6 @@ using nlohmann::json; namespace openspace { -bool EventTopic::isDone() const { - return !isSubscribed(); -} - void EventTopic::handleJson(const nlohmann::json& json) { std::vector events; @@ -106,6 +107,10 @@ void EventTopic::handleJson(const nlohmann::json& json) { } } +bool EventTopic::isDone() const { + return !isSubscribed(); +} + bool EventTopic::isSubscribed() const { if (_subscribedEvents.empty()) { return false; diff --git a/modules/server/src/topics/flightcontrollertopic.cpp b/modules/server/src/topics/flightcontrollertopic.cpp index 1c2c364e6c..683409178b 100644 --- a/modules/server/src/topics/flightcontrollertopic.cpp +++ b/modules/server/src/topics/flightcontrollertopic.cpp @@ -25,7 +25,6 @@ #include #include -#include #include #include #include @@ -36,14 +35,15 @@ #include #include #include -#include -#include -#include #include #include #include #include #include +#include +#include +#include +#include namespace { enum class Command { diff --git a/modules/server/src/topics/luascripttopic.cpp b/modules/server/src/topics/luascripttopic.cpp index a5f31b41bd..dbf7ad96dd 100644 --- a/modules/server/src/topics/luascripttopic.cpp +++ b/modules/server/src/topics/luascripttopic.cpp @@ -24,14 +24,17 @@ #include -#include #include -#include +#include #include #include +#include #include #include #include +#include +#include +#include namespace { constexpr std::string_view KeyScript = "script"; diff --git a/modules/server/src/topics/missiontopic.cpp b/modules/server/src/topics/missiontopic.cpp index 6011bdf496..34ef9b09c0 100644 --- a/modules/server/src/topics/missiontopic.cpp +++ b/modules/server/src/topics/missiontopic.cpp @@ -25,18 +25,22 @@ #include #include -#include #include #include +#include #include #include #include #include - -using nlohmann::json; +#include namespace openspace { +void MissionTopic::handleJson(const nlohmann::json&) { + const nlohmann::json data = { {"missions", missionJson()} }; + _connection->sendJson(wrappedPayload(data)); +} + bool MissionTopic::isDone() const { return true; } @@ -56,7 +60,7 @@ nlohmann::json MissionTopic::missionJson() const { ); captureTimesString[i] = std::move(str); } - json json; + nlohmann::json json; for (auto const& [identifier, mission] : missions) { nlohmann::json missionJson = createPhaseJson(mission); missionJson["capturetimes"] = captureTimesString; @@ -66,16 +70,16 @@ nlohmann::json MissionTopic::missionJson() const { } nlohmann::json MissionTopic::createPhaseJson(const MissionPhase& phase) const { - json phases = json::array(); + nlohmann::json phases = nlohmann::json::array(); for (const MissionPhase& missionPhase : phase.phases()) { - json subphaseJson = createPhaseJson(missionPhase); + nlohmann::json subphaseJson = createPhaseJson(missionPhase); phases.push_back(std::move(subphaseJson)); } - json milestones = json::array(); + nlohmann::json milestones = nlohmann::json::array(); const std::vector& dates = phase.milestones(); for (const Milestone& date : dates) { - json jsonDate = { + nlohmann::json jsonDate = { { "date", std::string(date.date.ISO8601()) }, { "name", date.name } }; @@ -115,9 +119,4 @@ nlohmann::json MissionTopic::createPhaseJson(const MissionPhase& phase) const { return phaseJson; } -void MissionTopic::handleJson(const nlohmann::json&) { - const nlohmann::json data = { {"missions", missionJson()} }; - _connection->sendJson(wrappedPayload(data)); -} - } // namespace openspace diff --git a/modules/server/src/topics/profiletopic.cpp b/modules/server/src/topics/profiletopic.cpp index 3cf8b9d370..47b8df17bb 100644 --- a/modules/server/src/topics/profiletopic.cpp +++ b/modules/server/src/topics/profiletopic.cpp @@ -25,7 +25,6 @@ #include #include -#include #include #include #include @@ -33,10 +32,6 @@ namespace openspace { -bool ProfileTopic::isDone() const { - return true; -} - void ProfileTopic::handleJson(const nlohmann::json&) { // @TODO (2025-04-30, emmbr) If we expose the json converters from profile.cpp, we // could use those here instead and minimize the risk of getting the serialization of @@ -65,4 +60,8 @@ void ProfileTopic::handleJson(const nlohmann::json&) { _connection->sendJson(wrappedPayload(data)); } +bool ProfileTopic::isDone() const { + return true; +} + } // namespace openspace diff --git a/modules/server/src/topics/sessionrecordingtopic.cpp b/modules/server/src/topics/sessionrecordingtopic.cpp index 0b95bf9082..93f745fcda 100644 --- a/modules/server/src/topics/sessionrecordingtopic.cpp +++ b/modules/server/src/topics/sessionrecordingtopic.cpp @@ -26,8 +26,8 @@ #include #include -#include #include +#include namespace { constexpr std::string_view _loggerCat = "SessionRecordingTopic"; @@ -41,8 +41,6 @@ namespace { constexpr const char* StateKey = "state"; } // namespace -using nlohmann::json; - namespace openspace { SessionRecordingTopic::SessionRecordingTopic() { @@ -55,10 +53,6 @@ SessionRecordingTopic::~SessionRecordingTopic() { } } -bool SessionRecordingTopic::isDone() const { - return _isDone; -} - void SessionRecordingTopic::handleJson(const nlohmann::json& json) { const std::string event = json.at("event").get(); if (event != SubscribeEvent && event != UnsubscribeEvent && @@ -112,8 +106,12 @@ void SessionRecordingTopic::handleJson(const nlohmann::json& json) { } } +bool SessionRecordingTopic::isDone() const { + return _isDone; +} + void SessionRecordingTopic::sendJsonData() { - json stateJson; + nlohmann::json stateJson; using SessionRecordingHandler = interaction::SessionRecordingHandler; if (_sendState) { std::string stateString; diff --git a/modules/server/src/topics/setpropertytopic.cpp b/modules/server/src/topics/setpropertytopic.cpp index 94e39d55b6..6a7efa66ba 100644 --- a/modules/server/src/topics/setpropertytopic.cpp +++ b/modules/server/src/topics/setpropertytopic.cpp @@ -24,14 +24,15 @@ #include -#include #include #include -#include #include #include #include #include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "SetPropertyTopic"; diff --git a/modules/server/src/topics/skybrowsertopic.cpp b/modules/server/src/topics/skybrowsertopic.cpp index 4afc27f17b..4ae66ea919 100644 --- a/modules/server/src/topics/skybrowsertopic.cpp +++ b/modules/server/src/topics/skybrowsertopic.cpp @@ -30,10 +30,11 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view SubscribeEvent = "start_subscription"; @@ -62,10 +63,6 @@ SkyBrowserTopic::~SkyBrowserTopic() { } } -bool SkyBrowserTopic::isDone() const { - return _isDone; -} - void SkyBrowserTopic::handleJson(const nlohmann::json& json) { const std::string event = json.at("event").get(); if (event == UnsubscribeEvent) { @@ -90,6 +87,10 @@ void SkyBrowserTopic::handleJson(const nlohmann::json& json) { ); } +bool SkyBrowserTopic::isDone() const { + return _isDone; +} + void SkyBrowserTopic::sendBrowserData() { using namespace openspace; diff --git a/modules/server/src/topics/subscriptiontopic.cpp b/modules/server/src/topics/subscriptiontopic.cpp index d6e011bbda..2fa1b4f059 100644 --- a/modules/server/src/topics/subscriptiontopic.cpp +++ b/modules/server/src/topics/subscriptiontopic.cpp @@ -25,12 +25,11 @@ #include #include -#include #include #include -#include #include #include +#include namespace { constexpr std::string_view _loggerCat = "SubscriptionTopic"; @@ -47,28 +46,6 @@ SubscriptionTopic::~SubscriptionTopic() { resetCallbacks(); } -bool SubscriptionTopic::isDone() const { - return !_requestedResourceIsSubscribable || !_isSubscribedTo; -} - -void SubscriptionTopic::resetCallbacks() { - if (!_prop) { - return; - } - if (_onChangeHandle != UnsetCallbackHandle) { - _prop->removeOnChange(_onChangeHandle); - _onChangeHandle = UnsetCallbackHandle; - } - if (_onMetaDataChangeHandle != UnsetCallbackHandle) { - _prop->removeOnMetaDataChange(_onMetaDataChangeHandle); - _onMetaDataChangeHandle = UnsetCallbackHandle; - } - if (_onDeleteHandle != UnsetCallbackHandle) { - _prop->removeOnDelete(_onDeleteHandle); - _onDeleteHandle = UnsetCallbackHandle; - } -} - void SubscriptionTopic::handleJson(const nlohmann::json& json) { const std::string& event = json.at("event").get(); @@ -117,4 +94,26 @@ void SubscriptionTopic::handleJson(const nlohmann::json& json) { } } +bool SubscriptionTopic::isDone() const { + return !_requestedResourceIsSubscribable || !_isSubscribedTo; +} + +void SubscriptionTopic::resetCallbacks() { + if (!_prop) { + return; + } + if (_onChangeHandle != UnsetCallbackHandle) { + _prop->removeOnChange(_onChangeHandle); + _onChangeHandle = UnsetCallbackHandle; + } + if (_onMetaDataChangeHandle != UnsetCallbackHandle) { + _prop->removeOnMetaDataChange(_onMetaDataChangeHandle); + _onMetaDataChangeHandle = UnsetCallbackHandle; + } + if (_onDeleteHandle != UnsetCallbackHandle) { + _prop->removeOnDelete(_onDeleteHandle); + _onDeleteHandle = UnsetCallbackHandle; + } +} + } // namespace openspace diff --git a/modules/server/src/topics/timetopic.cpp b/modules/server/src/topics/timetopic.cpp index 6ffc50fdd5..ae5d546c45 100644 --- a/modules/server/src/topics/timetopic.cpp +++ b/modules/server/src/topics/timetopic.cpp @@ -26,10 +26,11 @@ #include #include -#include -#include #include -#include +#include +#include +#include +#include namespace { constexpr std::string_view SubscribeEvent = "start_subscription"; @@ -59,10 +60,6 @@ TimeTopic::~TimeTopic() { } } -bool TimeTopic::isDone() const { - return _isDone; -} - void TimeTopic::handleJson(const nlohmann::json& json) { const std::string event = json.at("event").get(); if (event == UnsubscribeEvent) { @@ -110,6 +107,10 @@ void TimeTopic::handleJson(const nlohmann::json& json) { ); } +bool TimeTopic::isDone() const { + return _isDone; +} + json TimeTopic::getNextPrevDeltaTimeStepJson() { const std::optional nextStep = global::timeManager->nextDeltaTimeStep(); const std::optional prevStep = global::timeManager->previousDeltaTimeStep(); diff --git a/modules/server/src/topics/topic.cpp b/modules/server/src/topics/topic.cpp index eebed65e5a..0a3b36d785 100644 --- a/modules/server/src/topics/topic.cpp +++ b/modules/server/src/topics/topic.cpp @@ -24,9 +24,10 @@ #include -#include +#include #include #include +#include namespace openspace { diff --git a/modules/server/src/topics/triggerpropertytopic.cpp b/modules/server/src/topics/triggerpropertytopic.cpp index 40aa9a362b..f2bcaf048c 100644 --- a/modules/server/src/topics/triggerpropertytopic.cpp +++ b/modules/server/src/topics/triggerpropertytopic.cpp @@ -24,12 +24,13 @@ #include -#include -#include -#include -#include #include #include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "TriggerPropertyTopic"; diff --git a/modules/server/src/topics/versiontopic.cpp b/modules/server/src/topics/versiontopic.cpp index 598d2cb285..5ee1a55b9e 100644 --- a/modules/server/src/topics/versiontopic.cpp +++ b/modules/server/src/topics/versiontopic.cpp @@ -32,10 +32,6 @@ namespace openspace { -bool VersionTopic::isDone() const { - return true; -} - void VersionTopic::handleJson(const nlohmann::json&) { nlohmann::json versionJson = { { @@ -70,4 +66,8 @@ void VersionTopic::handleJson(const nlohmann::json&) { _connection->sendJson(wrappedPayload(versionJson)); } +bool VersionTopic::isDone() const { + return true; +} + } // namespace openspace diff --git a/modules/skybrowser/include/renderableskytarget.h b/modules/skybrowser/include/renderableskytarget.h index ef2147a114..c1f9729151 100644 --- a/modules/skybrowser/include/renderableskytarget.h +++ b/modules/skybrowser/include/renderableskytarget.h @@ -27,15 +27,13 @@ #include -#include +#include +#include #include - -namespace openspace::documentation { struct Documentation; } +#include namespace openspace { -class ScreenSpaceSkyBrowser; - class RenderableSkyTarget : public RenderablePlane { public: explicit RenderableSkyTarget(const ghoul::Dictionary& dictionary); diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index bf15beae2e..fcbb3a8298 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -26,12 +26,13 @@ #define __OPENSPACE_MODULE_SKYBROWSER___SCREENSPACESKYBROWSER___H__ #include -#include -#include +#include #include -#include +#include #include +#include +#include namespace openspace { @@ -84,7 +85,8 @@ public: static documentation::Documentation Documentation(); private: - static constexpr int RadiusTimeOut = 25; + static constexpr int RadiusTimeout = 25; + properties::BoolProperty _isHidden; properties::BoolProperty _isPointingSpacecraft; properties::BoolProperty _updateDuringTargetAnimation; diff --git a/modules/skybrowser/include/targetbrowserpair.h b/modules/skybrowser/include/targetbrowserpair.h index b5956d07de..215329b0c0 100644 --- a/modules/skybrowser/include/targetbrowserpair.h +++ b/modules/skybrowser/include/targetbrowserpair.h @@ -26,16 +26,19 @@ #define __OPENSPACE_MODULE_SKYBROWSER___TARGETBROWSERPAIR___H__ #include +#include +#include +#include +#include namespace ghoul { class Dictionary; } namespace openspace { struct ImageData; +class RenderableSkyTarget; class SceneGraphNode; class ScreenSpaceSkyBrowser; -class RenderableSkyTarget; -class ScreenSpaceRenderable; class TargetBrowserPair { public: @@ -105,6 +108,7 @@ public: void loadImageCollection(const std::string& collection); void setImageOpacity(const std::string& imageUrl, float opacity); void hideChromeInterface(); + private: // Target and browser RenderableSkyTarget* _targetRenderable = nullptr; diff --git a/modules/skybrowser/include/utility.h b/modules/skybrowser/include/utility.h index 38fcf78926..b50371d838 100644 --- a/modules/skybrowser/include/utility.h +++ b/modules/skybrowser/include/utility.h @@ -25,10 +25,12 @@ #ifndef __OPENSPACE_MODULE_SKYBROWSER___UTILITY___H__ #define __OPENSPACE_MODULE_SKYBROWSER___UTILITY___H__ -#include #include +#include #include #include +#include +#include namespace openspace::skybrowser { diff --git a/modules/skybrowser/include/wwtcommunicator.h b/modules/skybrowser/include/wwtcommunicator.h index 2495ea56bc..daef9b7815 100644 --- a/modules/skybrowser/include/wwtcommunicator.h +++ b/modules/skybrowser/include/wwtcommunicator.h @@ -25,13 +25,17 @@ #ifndef __OPENSPACE_MODULE_SKYBROWSER___WWTCOMMUNICATOR___H__ #define __OPENSPACE_MODULE_SKYBROWSER___WWTCOMMUNICATOR___H__ -#include -#include - +#include #include +#include +#include +#include + +namespace ghoul { class Dictionary; } namespace openspace { -using SelectedImageDeque = std::deque>; + +class BrowserInstance; class WwtCommunicator { public: @@ -58,15 +62,15 @@ public: void setBorderRadius(double radius); void setIdInBrowser(const std::string& id) const; - SelectedImageDeque::iterator findSelectedImage(const std::string& imageUrl); + std::deque>::iterator findSelectedImage( + const std::string& imageUrl); private: void executeJavascript(const std::string& script) const; void sendMessageToWwt(const ghoul::Dictionary& msg) const; bool _isImageCollectionLoaded = false; - SelectedImageDeque _selectedImages; - + std::deque> _selectedImages; BrowserInstance* _browserInstance = nullptr; }; diff --git a/modules/skybrowser/include/wwtdatahandler.h b/modules/skybrowser/include/wwtdatahandler.h index c3d13e7007..992891d155 100644 --- a/modules/skybrowser/include/wwtdatahandler.h +++ b/modules/skybrowser/include/wwtdatahandler.h @@ -25,16 +25,16 @@ #ifndef __OPENSPACE_MODULE_SKYBROWSER___WWTDATAHANDLER___H__ #define __OPENSPACE_MODULE_SKYBROWSER___WWTDATAHANDLER___H__ +#include #include -#include +#include #include +#include namespace tinyxml2 { class XMLElement; } namespace openspace { -namespace documentation { struct Documentation; } - struct ImageData { std::string name; std::string thumbnailUrl; diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 10786f8837..25c7417ba6 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -27,19 +27,32 @@ #include #include #include -#include #include +#include +#include #include -#include #include +#include #include #include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "skybrowsermodule_lua.inl" namespace { - constexpr openspace::properties::Property::PropertyInfo AllowRotationInfo = { "AllowCameraRotation", "Allow camera rotation", @@ -108,7 +121,6 @@ namespace { openspace::properties::Property::Visibility::AdvancedUser }; - struct [[codegen::Dictionary(SkyBrowserModule)]] Parameters { // [[codegen::verbatim(AllowRotationInfo.description)]] std::optional allowCameraRotation; diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index 035cc4a0fb..7f40ab0e01 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -32,13 +32,12 @@ #include #include #include +#include #include namespace openspace { -struct ImageData; class SceneGraphNode; -class ScreenSpaceImageLocal; class TargetBrowserPair; class SkyBrowserModule : public OpenSpaceModule { diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 0c2e31df03..72f8bb1a05 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -24,17 +24,13 @@ #include -#include #include -#include #include -#include #include #include #include #include #include -#include #include #include diff --git a/modules/skybrowser/src/renderableskytarget.cpp b/modules/skybrowser/src/renderableskytarget.cpp index 795059ddb2..b23451a152 100644 --- a/modules/skybrowser/src/renderableskytarget.cpp +++ b/modules/skybrowser/src/renderableskytarget.cpp @@ -24,22 +24,20 @@ #include -#include -#include #include #include +#include #include -#include #include -#include #include -#include -#include #include #include +#include +#include #include -#include -#include +#include +#include +#include namespace { enum BlendMode { diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index 42ac08d865..ac0c44584b 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -25,17 +25,19 @@ #include #include -#include #include +#include +#include #include #include #include -#include -#include -#include -#include -#include +#include +#include #include +#include +#include +#include +#include #include namespace { @@ -462,7 +464,7 @@ void ScreenSpaceSkyBrowser::update() { } // After the texture has been updated, wait a little bit before updating the border // radius so the browser has time to update its size - if (_radiusIsDirty && _isInitialized && _borderRadiusTimer > RadiusTimeOut) { + if (_radiusIsDirty && _isInitialized && _borderRadiusTimer > RadiusTimeout) { _wwtCommunicator.setBorderRadius(_borderRadius); _radiusIsDirty = false; _borderRadiusTimer = -1; diff --git a/modules/skybrowser/src/targetbrowserpair.cpp b/modules/skybrowser/src/targetbrowserpair.cpp index d6b2e1e390..53c933023a 100644 --- a/modules/skybrowser/src/targetbrowserpair.cpp +++ b/modules/skybrowser/src/targetbrowserpair.cpp @@ -34,11 +34,15 @@ #include #include #include +#include #include +#include #include -#include -#include +#include +#include #include +#include +#include namespace { void aimTargetGalactic(std::string_view id, const glm::dvec3& direction) { diff --git a/modules/skybrowser/src/utility.cpp b/modules/skybrowser/src/utility.cpp index eff7639ab4..460837f63c 100644 --- a/modules/skybrowser/src/utility.cpp +++ b/modules/skybrowser/src/utility.cpp @@ -29,7 +29,9 @@ #include #include #include +#include #include +#include namespace { // Galactic coordinates are projected onto the celestial sphere diff --git a/modules/skybrowser/src/wwtcommunicator.cpp b/modules/skybrowser/src/wwtcommunicator.cpp index 8cdb886433..b3e5c71280 100644 --- a/modules/skybrowser/src/wwtcommunicator.cpp +++ b/modules/skybrowser/src/wwtcommunicator.cpp @@ -24,13 +24,12 @@ #include -#include -#include -#include -#include -#include +#include +#include #include -#include +#include +#include +#include namespace { // WWT messages @@ -197,7 +196,7 @@ bool WwtCommunicator::isImageCollectionLoaded() const { return _isImageCollectionLoaded; } -SelectedImageDeque::iterator WwtCommunicator::findSelectedImage( +std::deque>::iterator WwtCommunicator::findSelectedImage( const std::string& imageUrl) { auto it = std::find_if( diff --git a/modules/skybrowser/src/wwtdatahandler.cpp b/modules/skybrowser/src/wwtdatahandler.cpp index 25d2c41deb..f8b57715e6 100644 --- a/modules/skybrowser/src/wwtdatahandler.cpp +++ b/modules/skybrowser/src/wwtdatahandler.cpp @@ -27,8 +27,17 @@ #include #include #include -#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "WwtDataHandler"; diff --git a/modules/space/horizonsfile.cpp b/modules/space/horizonsfile.cpp index 8f174f436d..4f576297ca 100644 --- a/modules/space/horizonsfile.cpp +++ b/modules/space/horizonsfile.cpp @@ -27,14 +27,15 @@ #include #include #include -#include #include #include #include -#include +#include #include - -using json = nlohmann::json; +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "HorizonsFile"; @@ -116,7 +117,9 @@ std::string constructHorizonsUrl(HorizonsType type, const std::string& target, return url; } -json sendHorizonsRequest(const std::string& url, const std::filesystem::path& filePath) { +nlohmann::json sendHorizonsRequest(const std::string& url, + const std::filesystem::path& filePath) +{ // Set up HTTP request and download result const auto download = std::make_unique( url, @@ -155,10 +158,10 @@ nlohmann::json convertHorizonsDownloadToJson(const std::filesystem::path& filePa answer.append(buf, 0, stream.gcount()); // convert to a json object - return json::parse(answer); + return nlohmann::json::parse(answer); } -HorizonsResultCode isValidHorizonsAnswer(const json& answer) { +HorizonsResultCode isValidHorizonsAnswer(const nlohmann::json& answer) { // Signature, source and version if (auto signature = answer.find("signature"); signature != answer.end()) { if (auto source = signature->find("source"); source != signature->end()) { diff --git a/modules/space/horizonsfile.h b/modules/space/horizonsfile.h index 9cc9d20ca9..b46a0a737d 100644 --- a/modules/space/horizonsfile.h +++ b/modules/space/horizonsfile.h @@ -30,13 +30,14 @@ #include #include #include +#include namespace openspace { /** * A Horizons file is a text file generated from NASA JPL HORIZONS Website - * (https://ssd.jpl.nasa.gov/horizons.cgi). The implementation supports both Vector - * and Observer as Horizons data table. + * (https://ssd.jpl.nasa.gov/horizons.cgi). The implementation supports both Vector and + * Observer as Horizons data table. * * In case of Vector table data the implementation expects a file with format: * TIME(JulianDayNumber = A.D. YYYY-MM-DD HH:MM:SS TDB) @@ -126,8 +127,7 @@ private: // Free functions std::string constructHorizonsUrl(HorizonsType type, const std::string& target, const std::string& observer, const std::string& startTime, - const std::string& stopTime, const std::string& stepSize, - const std::string& unit); + const std::string& stopTime, const std::string& stepSize, const std::string& unit); nlohmann::json sendHorizonsRequest(const std::string& url, const std::filesystem::path& filePath); nlohmann::json convertHorizonsDownloadToJson(const std::filesystem::path& filePath); diff --git a/modules/space/kepler.h b/modules/space/kepler.h index f79ff64fcf..2d8f4f4994 100644 --- a/modules/space/kepler.h +++ b/modules/space/kepler.h @@ -106,6 +106,7 @@ enum class Format { SBDB, ///< Small-Body Database MPC ///< Minor Planet Center }; + /** * Reads the object information from the provided file. * diff --git a/modules/space/rendering/renderableconstellationbounds.cpp b/modules/space/rendering/renderableconstellationbounds.cpp index 39e9e70989..f69e7bb363 100644 --- a/modules/space/rendering/renderableconstellationbounds.cpp +++ b/modules/space/rendering/renderableconstellationbounds.cpp @@ -29,12 +29,21 @@ #include #include #include +#include #include +#include +#include #include #include +#include "SpiceUsr.h" +#include +#include +#include #include #include -#include "SpiceUsr.h" +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderableConstellationBounds"; diff --git a/modules/space/rendering/renderableconstellationbounds.h b/modules/space/rendering/renderableconstellationbounds.h index 7e6dea4a7e..efeac1ea1c 100644 --- a/modules/space/rendering/renderableconstellationbounds.h +++ b/modules/space/rendering/renderableconstellationbounds.h @@ -27,14 +27,13 @@ #include +#include +#include +#include #include -namespace ghoul::opengl { class ProgramObject; } - namespace openspace { -namespace documentation { struct Documentation; } - /** * This class renders the constellation bounds as defined in * http://cdsarc.u-strasbg.fr/viz-bin/Cat?cat=VI%2F49. It contains the bounds on the diff --git a/modules/space/rendering/renderableconstellationlines.cpp b/modules/space/rendering/renderableconstellationlines.cpp index fc5e4e2be5..50c7a448c8 100644 --- a/modules/space/rendering/renderableconstellationlines.cpp +++ b/modules/space/rendering/renderableconstellationlines.cpp @@ -24,21 +24,29 @@ #include +#include #include #include #include #include #include +#include #include #include +#include +#include #include #include #include #include -#include +#include #include #include #include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderableConstellationLines"; diff --git a/modules/space/rendering/renderableconstellationlines.h b/modules/space/rendering/renderableconstellationlines.h index 4910cb75c3..2edd08bc97 100644 --- a/modules/space/rendering/renderableconstellationlines.h +++ b/modules/space/rendering/renderableconstellationlines.h @@ -27,20 +27,15 @@ #include +#include +#include +#include +#include #include #include -namespace ghoul::filesystem { class File; } -namespace ghoul::fontrendering { class Font; } -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl - namespace openspace { -namespace documentation { struct Documentation; } - class RenderableConstellationLines : public RenderableConstellationsBase { public: explicit RenderableConstellationLines(const ghoul::Dictionary& dictionary); diff --git a/modules/space/rendering/renderableconstellationsbase.cpp b/modules/space/rendering/renderableconstellationsbase.cpp index 0a594d8a1e..0523742caf 100644 --- a/modules/space/rendering/renderableconstellationsbase.cpp +++ b/modules/space/rendering/renderableconstellationsbase.cpp @@ -24,18 +24,20 @@ #include +#include #include -#include -#include -#include #include -#include +#include #include #include #include -#include +#include +#include +#include #include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderableConstellationsBase"; diff --git a/modules/space/rendering/renderableconstellationsbase.h b/modules/space/rendering/renderableconstellationsbase.h index 63e69d40ab..e55575503c 100644 --- a/modules/space/rendering/renderableconstellationsbase.h +++ b/modules/space/rendering/renderableconstellationsbase.h @@ -27,23 +27,14 @@ #include -#include #include -#include -#include +#include +#include #include -#include -#include -#include -#include -#include - -namespace ghoul::opengl { class ProgramObject; } +#include namespace openspace { -namespace documentation { struct Documentation; } - /** * This is a base class for constellation lines and bounds. */ diff --git a/modules/space/rendering/renderableeclipsecone.cpp b/modules/space/rendering/renderableeclipsecone.cpp index 60924dd83a..c0beb2fbde 100644 --- a/modules/space/rendering/renderableeclipsecone.cpp +++ b/modules/space/rendering/renderableeclipsecone.cpp @@ -26,12 +26,17 @@ #include #include -#include #include #include #include #include #include +#include +#include +#include +#include +#include +#include namespace { struct VBOLayout { diff --git a/modules/space/rendering/renderableeclipsecone.h b/modules/space/rendering/renderableeclipsecone.h index df0afdd74c..cef5d9549e 100644 --- a/modules/space/rendering/renderableeclipsecone.h +++ b/modules/space/rendering/renderableeclipsecone.h @@ -27,23 +27,16 @@ #include -#include #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: explicit RenderableEclipseCone(const ghoul::Dictionary& dictionary); diff --git a/modules/space/rendering/renderablefluxnodes.cpp b/modules/space/rendering/renderablefluxnodes.cpp index 41f4786874..a199258340 100644 --- a/modules/space/rendering/renderablefluxnodes.cpp +++ b/modules/space/rendering/renderablefluxnodes.cpp @@ -24,27 +24,32 @@ #include +#include #include #include -#include -#include #include -#include -#include +#include +#include +#include #include #include #include +#include #include -#include -#include +#include +#include #include #include #include +#include +#include +#include +#include #include -#include +#include +#include #include -#include -#include +#include namespace { constexpr std::string_view _loggerCat = "RenderableFluxNodes"; diff --git a/modules/space/rendering/renderablefluxnodes.h b/modules/space/rendering/renderablefluxnodes.h index 26b9fff32e..01cd61bf15 100644 --- a/modules/space/rendering/renderablefluxnodes.h +++ b/modules/space/rendering/renderablefluxnodes.h @@ -29,14 +29,17 @@ #include #include -#include +#include +#include #include #include #include #include +#include #include -#include +#include #include +#include namespace openspace { @@ -69,33 +72,38 @@ private: std::vector _lineCount; std::vector _lineStart; + // Used to determine if lines should be colored UNIFORMLY or by Flux Value enum class ColorMethod { ByFluxValue = 0, - Uniform = 1 + Uniform }; + enum class GoesEnergyBins { Emin01 = 0, - Emin03 = 1 + Emin03 }; + enum class ScalingMethod { Flux = 0, - RFlux = 1, - R2Flux = 2, - Log10RFlux = 3, - LnRFlux = 4 + RFlux, + R2Flux, + Log10RFlux, + LnRFlux }; + enum class NodeSkipMethod { Uniform = 0, - Flux = 1, - Radius = 2, - Streamnumber = 3 + Flux, + Radius, + Streamnumber }; + enum class EnhanceMethod { SizeScaling = 0, - ColorTables = 1, - SizeAndColor = 2, - Illuminance = 3, + ColorTables, + SizeAndColor, + Illuminance }; UniformCache(streamColor, nodeSize, proximityNodesSize, diff --git a/modules/space/rendering/renderablehabitablezone.cpp b/modules/space/rendering/renderablehabitablezone.cpp index c09aac4a60..489fa2b49c 100644 --- a/modules/space/rendering/renderablehabitablezone.cpp +++ b/modules/space/rendering/renderablehabitablezone.cpp @@ -25,18 +25,17 @@ #include #include -#include #include #include -#include -#include #include #include -#include #include +#include #include #include #include +#include +#include #include namespace { diff --git a/modules/space/rendering/renderablehabitablezone.h b/modules/space/rendering/renderablehabitablezone.h index 01c5091bb1..9b8164e67d 100644 --- a/modules/space/rendering/renderablehabitablezone.h +++ b/modules/space/rendering/renderablehabitablezone.h @@ -26,14 +26,14 @@ #define __OPENSPACE_MODULE_SPACE___RENDERABLEHABITABLEZONE___H__ #include + #include #include #include +#include namespace openspace { -namespace documentation { struct Documentation; } - class RenderableHabitableZone : public RenderableDisc { public: explicit RenderableHabitableZone(const ghoul::Dictionary& dictionary); diff --git a/modules/space/rendering/renderableorbitalkepler.cpp b/modules/space/rendering/renderableorbitalkepler.cpp index 5f24936354..a72e759cc4 100644 --- a/modules/space/rendering/renderableorbitalkepler.cpp +++ b/modules/space/rendering/renderableorbitalkepler.cpp @@ -26,24 +26,35 @@ #include #include -#include #include #include #include -#include #include #include #include -#include -#include #include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include #include -#include +#include +#include +#include +#include #include -#include +#include namespace { // The possible values for the _renderingModes property diff --git a/modules/space/rendering/renderableorbitalkepler.h b/modules/space/rendering/renderableorbitalkepler.h index 4dd17876ce..3e8651adcb 100644 --- a/modules/space/rendering/renderableorbitalkepler.h +++ b/modules/space/rendering/renderableorbitalkepler.h @@ -27,19 +27,18 @@ #include -#include #include -#include +#include #include +#include +#include #include -#include -#include +#include #include +#include namespace openspace { -namespace documentation { struct Documentation; } - class RenderableOrbitalKepler : public Renderable { public: explicit RenderableOrbitalKepler(const ghoul::Dictionary& dictionary); @@ -56,6 +55,7 @@ public: private: struct Appearance : properties::PropertyOwner { Appearance(); + /// Specifies the base color of the line/point properties::Vec3Property color; /// Line width for the line rendering part diff --git a/modules/space/rendering/renderablerings.cpp b/modules/space/rendering/renderablerings.cpp index eab49a5090..725d66b5f8 100644 --- a/modules/space/rendering/renderablerings.cpp +++ b/modules/space/rendering/renderablerings.cpp @@ -25,18 +25,24 @@ #include #include -#include #include #include #include +#include #include #include +#include #include #include +#include #include #include #include +#include +#include +#include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo TextureInfo = { diff --git a/modules/space/rendering/renderablerings.h b/modules/space/rendering/renderablerings.h index 2baebf077d..2593129956 100644 --- a/modules/space/rendering/renderablerings.h +++ b/modules/space/rendering/renderablerings.h @@ -30,20 +30,15 @@ #include #include #include - -#include +#include #include +#include +#include namespace ghoul::filesystem { class File; } -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl namespace openspace { -namespace documentation { struct Documentation; } - class RenderableRings : public Renderable { public: explicit RenderableRings(const ghoul::Dictionary& dictionary); diff --git a/modules/space/rendering/renderablestars.cpp b/modules/space/rendering/renderablestars.cpp index f11ac7fca8..7ecd2a6c16 100644 --- a/modules/space/rendering/renderablestars.cpp +++ b/modules/space/rendering/renderablestars.cpp @@ -25,27 +25,27 @@ #include #include -#include #include #include -#include #include #include #include #include -#include #include #include #include #include #include +#include +#include +#include +#include +#include #include -#include +#include #include -#include -#include #include -#include +#include namespace { constexpr std::string_view _loggerCat = "RenderableStars"; diff --git a/modules/space/rendering/renderablestars.h b/modules/space/rendering/renderablestars.h index 8b6f67f81f..af44e687bb 100644 --- a/modules/space/rendering/renderablestars.h +++ b/modules/space/rendering/renderablestars.h @@ -28,26 +28,22 @@ #include #include -#include #include +#include #include +#include +#include #include #include #include #include #include -#include +#include namespace ghoul::filesystem { class File; } -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl namespace openspace { -namespace documentation { struct Documentation; } - class RenderableStars : public Renderable { public: explicit RenderableStars(const ghoul::Dictionary& dictionary); diff --git a/modules/space/rendering/renderabletravelspeed.cpp b/modules/space/rendering/renderabletravelspeed.cpp index 6ec09ddd69..7227090742 100644 --- a/modules/space/rendering/renderabletravelspeed.cpp +++ b/modules/space/rendering/renderabletravelspeed.cpp @@ -34,6 +34,11 @@ #include #include #include +#include +#include +#include +#include +#include #include namespace { diff --git a/modules/space/rendering/renderabletravelspeed.h b/modules/space/rendering/renderabletravelspeed.h index 89a3cd3725..421d85d58e 100644 --- a/modules/space/rendering/renderabletravelspeed.h +++ b/modules/space/rendering/renderabletravelspeed.h @@ -27,7 +27,8 @@ #include -#include +#include +#include #include #include #include @@ -36,8 +37,6 @@ namespace openspace { class SceneGraphNode; -namespace documentation { struct Documentation; } - class RenderableTravelSpeed : public Renderable { public: explicit RenderableTravelSpeed(const ghoul::Dictionary& dictionary); @@ -57,6 +56,7 @@ private: void calculateDirectionVector(); void updateVertexData(); void reinitiateTravel(); + UniformCache(lineColor, opacity) _uniformCache; properties::StringProperty _targetName; diff --git a/modules/space/rotation/spicerotation.cpp b/modules/space/rotation/spicerotation.cpp index 4d963ce1e0..64b85466fa 100644 --- a/modules/space/rotation/spicerotation.cpp +++ b/modules/space/rotation/spicerotation.cpp @@ -25,11 +25,10 @@ #include #include -#include #include #include #include -#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo SourceInfo = { diff --git a/modules/space/rotation/spicerotation.h b/modules/space/rotation/spicerotation.h index 2728c9089e..eb2554713d 100644 --- a/modules/space/rotation/spicerotation.h +++ b/modules/space/rotation/spicerotation.h @@ -33,8 +33,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class SpiceRotation : public Rotation { public: explicit SpiceRotation(const ghoul::Dictionary& dictionary); diff --git a/modules/space/spacemodule.cpp b/modules/space/spacemodule.cpp index ec5591d8e7..273d9ca661 100644 --- a/modules/space/spacemodule.cpp +++ b/modules/space/spacemodule.cpp @@ -41,14 +41,19 @@ #include #include #include -#include +#include +#include +#include #include -#include #include #include #include #include +#include +#include #include +#include +#include #include "spacemodule_lua.inl" diff --git a/modules/space/spacemodule_lua.inl b/modules/space/spacemodule_lua.inl index f0b9538790..be1fc64a6f 100644 --- a/modules/space/spacemodule_lua.inl +++ b/modules/space/spacemodule_lua.inl @@ -23,6 +23,7 @@ ****************************************************************************************/ #include +#include #include namespace { diff --git a/modules/space/timeframe/timeframekernel.cpp b/modules/space/timeframe/timeframekernel.cpp index 7b6d69ad25..4b12e485bb 100644 --- a/modules/space/timeframe/timeframekernel.cpp +++ b/modules/space/timeframe/timeframekernel.cpp @@ -24,10 +24,20 @@ #include +#include #include #include #include +#include +#include +#include #include "SpiceUsr.h" +#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "TimeFrameKernel"; @@ -424,7 +434,6 @@ bool TimeFrameKernel::initialize() { ); } - // Extract the SPK file/files if they were specified if (p.spk.has_value()) { std::vector kernels; diff --git a/modules/space/timeframe/timeframekernel.h b/modules/space/timeframe/timeframekernel.h index 0bbc04c9ed..f4c884befc 100644 --- a/modules/space/timeframe/timeframekernel.h +++ b/modules/space/timeframe/timeframekernel.h @@ -28,6 +28,7 @@ #include #include +#include namespace openspace { diff --git a/modules/space/translation/gptranslation.cpp b/modules/space/translation/gptranslation.cpp index a03b0dac0b..4d43dd3ea6 100644 --- a/modules/space/translation/gptranslation.cpp +++ b/modules/space/translation/gptranslation.cpp @@ -25,7 +25,10 @@ #include #include -#include +#include +#include +#include +#include #include #include diff --git a/modules/space/translation/horizonstranslation.cpp b/modules/space/translation/horizonstranslation.cpp index cf01698403..434af051bb 100644 --- a/modules/space/translation/horizonstranslation.cpp +++ b/modules/space/translation/horizonstranslation.cpp @@ -24,8 +24,8 @@ #include +#include #include -#include #include #include #include @@ -33,9 +33,17 @@ #include #include #include -#include +#include +#include +#include +#include +#include +#include #include +#include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "HorizonsTranslation"; diff --git a/modules/space/translation/horizonstranslation.h b/modules/space/translation/horizonstranslation.h index a0f755a57f..56079ace64 100644 --- a/modules/space/translation/horizonstranslation.h +++ b/modules/space/translation/horizonstranslation.h @@ -29,20 +29,18 @@ #include #include -#include #include -#include -#include +#include +#include namespace openspace { -namespace documentation { struct Documentation; } - +class HorizonsFile; /** * The HorizonsTranslation is based on text files generated from NASA JPL HORIZONS Website - * (https://ssd.jpl.nasa.gov/horizons.cgi). The implementation supports both Vector - * and Observer as Horizons data table. + * (https://ssd.jpl.nasa.gov/horizons.cgi). The implementation supports both Vector and + * Observer as Horizons data table. * * In case of Vector table data the implementation expects a file with format: * TIME(JulianDayNumber = A.D. YYYY-MM-DD HH:MM:SS TDB) diff --git a/modules/space/translation/keplertranslation.cpp b/modules/space/translation/keplertranslation.cpp index ae4d4288ab..e843b72382 100644 --- a/modules/space/translation/keplertranslation.cpp +++ b/modules/space/translation/keplertranslation.cpp @@ -24,11 +24,18 @@ #include -#include +#include #include #include +#include #include +#include +#include +#include #include +#include +#include +#include namespace { struct RangeError final : public ghoul::RuntimeError { diff --git a/modules/space/translation/keplertranslation.h b/modules/space/translation/keplertranslation.h index 0c1177b97b..c12376bb65 100644 --- a/modules/space/translation/keplertranslation.h +++ b/modules/space/translation/keplertranslation.h @@ -28,10 +28,7 @@ #include #include -#include #include -#include -#include namespace openspace { @@ -58,10 +55,10 @@ public: ~KeplerTranslation() override = default; /** - * Method returning the translation vector at a given time. - * - * \param data Provides information from the engine about, for example, the time - */ + * Method returning the translation vector at a given time. + * + * \param data Provides information from the engine about, for example, the time + */ glm::dvec3 position(const UpdateData& data) const override; /** @@ -164,9 +161,9 @@ private: class KeplerCalculator { public: - KeplerCalculator(double eccentricity, double semiMajorAxis, - double inclination, double ascendingNode, double argumentOfPeriapsis, - double meanAnomalyAtEpoch, double orbitalPeriod, double epoch); + KeplerCalculator(double eccentricity, double semiMajorAxis, double inclination, + double ascendingNode, double argumentOfPeriapsis, double meanAnomalyAtEpoch, + double orbitalPeriod, double epoch); glm::dvec3 position(double time) const; diff --git a/modules/space/translation/spicetranslation.cpp b/modules/space/translation/spicetranslation.cpp index 3ecd7d5815..15a24d3d31 100644 --- a/modules/space/translation/spicetranslation.cpp +++ b/modules/space/translation/spicetranslation.cpp @@ -25,14 +25,10 @@ #include #include -#include #include #include #include -#include -#include -#include -#include +#include #include #include #include diff --git a/modules/spacecraftinstruments/dashboard/dashboarditeminstruments.cpp b/modules/spacecraftinstruments/dashboard/dashboarditeminstruments.cpp index 471ef64331..fcafd0fc7c 100644 --- a/modules/spacecraftinstruments/dashboard/dashboarditeminstruments.cpp +++ b/modules/spacecraftinstruments/dashboard/dashboarditeminstruments.cpp @@ -26,17 +26,19 @@ #include #include -#include #include -#include #include #include #include #include -#include #include +#include +#include #include +#include #include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo ActiveColorInfo = { diff --git a/modules/spacecraftinstruments/dashboard/dashboarditeminstruments.h b/modules/spacecraftinstruments/dashboard/dashboarditeminstruments.h index 748838170c..12adab943c 100644 --- a/modules/spacecraftinstruments/dashboard/dashboarditeminstruments.h +++ b/modules/spacecraftinstruments/dashboard/dashboarditeminstruments.h @@ -27,8 +27,6 @@ #include -#include -#include #include namespace openspace { diff --git a/modules/spacecraftinstruments/rendering/renderablecrawlingline.cpp b/modules/spacecraftinstruments/rendering/renderablecrawlingline.cpp index 1e49f32af6..d8faf928c5 100644 --- a/modules/spacecraftinstruments/rendering/renderablecrawlingline.cpp +++ b/modules/spacecraftinstruments/rendering/renderablecrawlingline.cpp @@ -26,13 +26,16 @@ #include #include -#include #include #include #include #include #include #include +#include +#include +#include +#include namespace { struct VBOData { diff --git a/modules/spacecraftinstruments/rendering/renderablecrawlingline.h b/modules/spacecraftinstruments/rendering/renderablecrawlingline.h index 7bd61247f1..cfd33d6745 100644 --- a/modules/spacecraftinstruments/rendering/renderablecrawlingline.h +++ b/modules/spacecraftinstruments/rendering/renderablecrawlingline.h @@ -29,11 +29,10 @@ #include #include +#include namespace openspace { -namespace documentation { struct Documentation; } - class RenderableCrawlingLine : public Renderable { public: explicit RenderableCrawlingLine(const ghoul::Dictionary& dictionary); diff --git a/modules/spacecraftinstruments/rendering/renderablefov.cpp b/modules/spacecraftinstruments/rendering/renderablefov.cpp index 0e8d614d5c..200d6c1215 100644 --- a/modules/spacecraftinstruments/rendering/renderablefov.cpp +++ b/modules/spacecraftinstruments/rendering/renderablefov.cpp @@ -27,15 +27,25 @@ #include #include #include -#include #include #include #include #include #include +#include #include +#include +#include +#include +#include +#include #include #include +#include +#include +#include +#include +#include namespace { constexpr int InterpolationSteps = 5; @@ -205,28 +215,48 @@ RenderableFov::RenderableFov(const ghoul::Dictionary& dictionary) , _alwaysDrawFov(AlwaysDrawFovInfo, false) , _colors({ properties::PropertyOwner({"Colors", "Colors"}), - { DefaultStartColorInfo, glm::vec3(0.4f), glm::vec3(0.f), glm::vec3(1.f) }, - { ColorDefaultEndInfo, glm::vec3(0.85f), glm::vec3(0.f), glm::vec3(1.f) }, - { ColorActiveInfo, glm::vec3(0.f, 1.f, 0.f), glm::vec3(0.f), glm::vec3(1.f) }, - { + properties::Vec3Property( + DefaultStartColorInfo, + glm::vec3(0.4f), + glm::vec3(0.f), + glm::vec3(1.f) + ), + properties::Vec3Property( + ColorDefaultEndInfo, + glm::vec3(0.85f), + glm::vec3(0.f), + glm::vec3(1.f) + ), + properties::Vec3Property( + ColorActiveInfo, + glm::vec3(0.f, 1.f, 0.f), + glm::vec3(0.f), + glm::vec3(1.f) + ), + properties::Vec3Property( ColorTargetInFovInfo, glm::vec3(0.f, 0.5f, 0.7f), glm::vec3(0.f), glm::vec3(1.f) - }, - { + ), + properties::Vec3Property( ColorIntersectionStartInfo, glm::vec3(1.f, 0.89f, 0.f), glm::vec3(0.f), glm::vec3(1.f) - }, - { + ), + properties::Vec3Property( ColorIntersectionEndInfo, glm::vec3(1.f, 0.29f, 0.f), glm::vec3(0.f), glm::vec3(1.f) - }, - { SquareColorInfo, glm::vec3(0.85f), glm::vec3(0.f), glm::vec3(1.f) } + ), + properties::Vec3Property( + SquareColorInfo, + glm::vec3(0.85f), + glm::vec3(0.f), + glm::vec3(1.f) + ) }) { const Parameters p = codegen::bake(dictionary); diff --git a/modules/spacecraftinstruments/rendering/renderablefov.h b/modules/spacecraftinstruments/rendering/renderablefov.h index c84a5a1c6d..f3916b63ee 100644 --- a/modules/spacecraftinstruments/rendering/renderablefov.h +++ b/modules/spacecraftinstruments/rendering/renderablefov.h @@ -35,16 +35,11 @@ #include #include #include - -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl +#include +#include namespace openspace { -namespace documentation { struct Documentation; } - class RenderableFov : public Renderable { public: explicit RenderableFov(const ghoul::Dictionary& dictionary); @@ -76,7 +71,6 @@ private: glm::dvec3 orthogonalProjection(const glm::dvec3& vecFov, double time, const std::string& target) const; - // properties properties::FloatProperty _lineWidth; properties::DoubleProperty _standOffDistance; properties::BoolProperty _alwaysDrawFov; diff --git a/modules/spacecraftinstruments/rendering/renderablemodelprojection.cpp b/modules/spacecraftinstruments/rendering/renderablemodelprojection.cpp index 4b02f6586e..894ebaf40c 100644 --- a/modules/spacecraftinstruments/rendering/renderablemodelprojection.cpp +++ b/modules/spacecraftinstruments/rendering/renderablemodelprojection.cpp @@ -24,19 +24,28 @@ #include +#include #include #include -#include #include #include #include +#include #include +#include #include #include #include #include #include +#include +#include +#include +#include #include +#include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo PerformShadingInfo = { diff --git a/modules/spacecraftinstruments/rendering/renderablemodelprojection.h b/modules/spacecraftinstruments/rendering/renderablemodelprojection.h index d363993b32..ec310d5c93 100644 --- a/modules/spacecraftinstruments/rendering/renderablemodelprojection.h +++ b/modules/spacecraftinstruments/rendering/renderablemodelprojection.h @@ -29,25 +29,13 @@ #include #include -#include -#include -#include #include - -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl +#include namespace ghoul::modelgeometry { class ModelGeometry; } namespace openspace { -namespace documentation { struct Documentation; } - -struct RenderData; -struct UpdateData; - class RenderableModelProjection : public Renderable { public: explicit RenderableModelProjection(const ghoul::Dictionary& dictionary); diff --git a/modules/spacecraftinstruments/rendering/renderableplaneprojection.cpp b/modules/spacecraftinstruments/rendering/renderableplaneprojection.cpp index 172c239eca..3cb8bb73be 100644 --- a/modules/spacecraftinstruments/rendering/renderableplaneprojection.cpp +++ b/modules/spacecraftinstruments/rendering/renderableplaneprojection.cpp @@ -25,21 +25,28 @@ #include #include +#include #include #include #include #include #include -#include #include #include +#include #include #include #include +#include #include #include #include #include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderablePlaneProjection"; diff --git a/modules/spacecraftinstruments/rendering/renderableplaneprojection.h b/modules/spacecraftinstruments/rendering/renderableplaneprojection.h index 0562e53f4e..ba776817cb 100644 --- a/modules/spacecraftinstruments/rendering/renderableplaneprojection.h +++ b/modules/spacecraftinstruments/rendering/renderableplaneprojection.h @@ -32,17 +32,10 @@ #include namespace ghoul::filesystem { class File; } -namespace ghoul::opengl { - class ProgramObject; - class Texture; -} // namespace ghoul::opengl namespace openspace { struct Image; -struct LinePoint; -struct RenderData; -struct UpdateData; class RenderablePlaneProjection : public Renderable { public: diff --git a/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp b/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp index 77b288fa28..bde0b2b132 100644 --- a/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp +++ b/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp @@ -31,12 +31,19 @@ #include #include #include +#include #include #include #include +#include #include #include #include +#include +#include +#include +#include +#include namespace { constexpr std::string_view NoImageText = "No Image"; @@ -295,8 +302,6 @@ RenderablePlanetProjection::RenderablePlanetProjection(const ghoul::Dictionary& addProperty(_segments); } -RenderablePlanetProjection::~RenderablePlanetProjection() {} - void RenderablePlanetProjection::initializeGL() { _programObject = SpacecraftInstrumentsModule::ProgramObjectManager.request( "ProjectiveProgram", diff --git a/modules/spacecraftinstruments/rendering/renderableplanetprojection.h b/modules/spacecraftinstruments/rendering/renderableplanetprojection.h index e5f74d5836..4ff462932e 100644 --- a/modules/spacecraftinstruments/rendering/renderableplanetprojection.h +++ b/modules/spacecraftinstruments/rendering/renderableplanetprojection.h @@ -28,25 +28,23 @@ #include #include +#include #include #include #include +#include +#include +#include #include +#include #include +#include namespace openspace { -namespace documentation { struct Documentation; } - -struct Image; -class Sphere; - -namespace planetgeometry { class PlanetGeometry; } - class RenderablePlanetProjection : public Renderable { public: explicit RenderablePlanetProjection(const ghoul::Dictionary& dict); - ~RenderablePlanetProjection() override; void initializeGL() override; void deinitializeGL() override; diff --git a/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp b/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp index 76115ff3fe..3900a802c1 100644 --- a/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp +++ b/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp @@ -26,12 +26,16 @@ #include #include -#include #include #include #include #include #include +#include +#include +#include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo NumberPointsInfo = { diff --git a/modules/spacecraftinstruments/rendering/renderableshadowcylinder.h b/modules/spacecraftinstruments/rendering/renderableshadowcylinder.h index d8d8239da5..7d4dcd096a 100644 --- a/modules/spacecraftinstruments/rendering/renderableshadowcylinder.h +++ b/modules/spacecraftinstruments/rendering/renderableshadowcylinder.h @@ -35,15 +35,8 @@ #include #include -namespace ghoul::opengl { class ProgramObject; } - namespace openspace { -namespace documentation { struct Documentation; } - -struct RenderData; -struct UpdateData; - class RenderableShadowCylinder : public Renderable { public: explicit RenderableShadowCylinder(const ghoul::Dictionary& dictionary); diff --git a/modules/spacecraftinstruments/spacecraftinstrumentsmodule.cpp b/modules/spacecraftinstruments/spacecraftinstrumentsmodule.cpp index 20f6a3ef74..8706a92222 100644 --- a/modules/spacecraftinstruments/spacecraftinstrumentsmodule.cpp +++ b/modules/spacecraftinstruments/spacecraftinstrumentsmodule.cpp @@ -31,11 +31,21 @@ #include #include #include +#include #include #include +#include #include #include +#include +#include #include +#include +#include +#include +#include +#include +#include namespace openspace { diff --git a/modules/spacecraftinstruments/spacecraftinstrumentsmodule.h b/modules/spacecraftinstruments/spacecraftinstrumentsmodule.h index 0beaa98d36..fb05339303 100644 --- a/modules/spacecraftinstruments/spacecraftinstrumentsmodule.h +++ b/modules/spacecraftinstruments/spacecraftinstrumentsmodule.h @@ -28,6 +28,7 @@ #include #include +#include namespace openspace { diff --git a/modules/spacecraftinstruments/util/hongkangparser.cpp b/modules/spacecraftinstruments/util/hongkangparser.cpp index 2d2579bf4c..4396f20888 100644 --- a/modules/spacecraftinstruments/util/hongkangparser.cpp +++ b/modules/spacecraftinstruments/util/hongkangparser.cpp @@ -24,17 +24,19 @@ #include -#include #include #include -#include #include #include -#include +#include #include +#include #include +#include #include #include +#include +#include namespace { double ephemerisTimeFromMissionElapsedTime(double met, double metReference) { diff --git a/modules/spacecraftinstruments/util/hongkangparser.h b/modules/spacecraftinstruments/util/hongkangparser.h index 066c101c48..b0a7550251 100644 --- a/modules/spacecraftinstruments/util/hongkangparser.h +++ b/modules/spacecraftinstruments/util/hongkangparser.h @@ -29,6 +29,8 @@ #include +namespace ghoul { class Dictionary; } + namespace openspace { class HongKangParser : public SequenceParser { diff --git a/modules/spacecraftinstruments/util/image.h b/modules/spacecraftinstruments/util/image.h index 022f9aecbc..c8dcd077fd 100644 --- a/modules/spacecraftinstruments/util/image.h +++ b/modules/spacecraftinstruments/util/image.h @@ -26,7 +26,7 @@ #define __OPENSPACE_MODULE_SPACECRAFTINSTRUMENTS___IMAGE___H__ #include - +#include #include #include diff --git a/modules/spacecraftinstruments/util/imagesequencer.cpp b/modules/spacecraftinstruments/util/imagesequencer.cpp index 7e2e6b26bc..d0def6cdc9 100644 --- a/modules/spacecraftinstruments/util/imagesequencer.cpp +++ b/modules/spacecraftinstruments/util/imagesequencer.cpp @@ -24,10 +24,15 @@ #include -#include -#include +#include #include #include +#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "ImageSequencer"; diff --git a/modules/spacecraftinstruments/util/imagesequencer.h b/modules/spacecraftinstruments/util/imagesequencer.h index da221d2182..3edb33cb18 100644 --- a/modules/spacecraftinstruments/util/imagesequencer.h +++ b/modules/spacecraftinstruments/util/imagesequencer.h @@ -25,17 +25,20 @@ #ifndef __OPENSPACE_MODULE_SPACECRAFTINSTRUMENTS___IMAGESEQUENCER___H__ #define __OPENSPACE_MODULE_SPACECRAFTINSTRUMENTS___IMAGESEQUENCER___H__ -#include - +#include +#include +#include +#include #include +#include #include #include #include namespace openspace { -class Time; class SequenceParser; +class Time; /** * The ImageSequencer singleton function is to manage the timekeeping and distribution of diff --git a/modules/spacecraftinstruments/util/instrumentdecoder.cpp b/modules/spacecraftinstruments/util/instrumentdecoder.cpp index ac55244644..3786981ffb 100644 --- a/modules/spacecraftinstruments/util/instrumentdecoder.cpp +++ b/modules/spacecraftinstruments/util/instrumentdecoder.cpp @@ -25,8 +25,6 @@ #include #include -#include -#include #include #include #include diff --git a/modules/spacecraftinstruments/util/instrumenttimesparser.cpp b/modules/spacecraftinstruments/util/instrumenttimesparser.cpp index 18077e9195..674f90edef 100644 --- a/modules/spacecraftinstruments/util/instrumenttimesparser.cpp +++ b/modules/spacecraftinstruments/util/instrumenttimesparser.cpp @@ -24,16 +24,21 @@ #include +#include +#include #include #include -#include +#include #include #include #include #include #include +#include #include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "InstrumentTimesParser"; diff --git a/modules/spacecraftinstruments/util/instrumenttimesparser.h b/modules/spacecraftinstruments/util/instrumenttimesparser.h index ac62db895b..a1c5ff884e 100644 --- a/modules/spacecraftinstruments/util/instrumenttimesparser.h +++ b/modules/spacecraftinstruments/util/instrumenttimesparser.h @@ -30,6 +30,8 @@ #include #include +namespace ghoul { class Dictionary; } + namespace openspace { class InstrumentTimesParser : public SequenceParser { diff --git a/modules/spacecraftinstruments/util/labelparser.cpp b/modules/spacecraftinstruments/util/labelparser.cpp index e079547d55..5e7843ea0e 100644 --- a/modules/spacecraftinstruments/util/labelparser.cpp +++ b/modules/spacecraftinstruments/util/labelparser.cpp @@ -24,16 +24,19 @@ #include +#include +#include #include -#include +#include #include #include #include #include #include #include -#include +#include #include +#include namespace { constexpr std::string_view _loggerCat = "LabelParser"; diff --git a/modules/spacecraftinstruments/util/labelparser.h b/modules/spacecraftinstruments/util/labelparser.h index e59c3df7e5..aba93f5099 100644 --- a/modules/spacecraftinstruments/util/labelparser.h +++ b/modules/spacecraftinstruments/util/labelparser.h @@ -29,6 +29,8 @@ #include +namespace ghoul { class Dictionary; } + namespace openspace { class LabelParser : public SequenceParser { diff --git a/modules/spacecraftinstruments/util/projectioncomponent.cpp b/modules/spacecraftinstruments/util/projectioncomponent.cpp index 584dc35554..7cde2bf5a6 100644 --- a/modules/spacecraftinstruments/util/projectioncomponent.cpp +++ b/modules/spacecraftinstruments/util/projectioncomponent.cpp @@ -28,18 +28,25 @@ #include #include #include +#include #include -#include #include +#include #include #include +#include +#include +#include #include #include #include #include #include #include +#include #include +#include +#include namespace { constexpr std::string_view PlaceholderFile = "${DATA}/placeholder.png"; diff --git a/modules/spacecraftinstruments/util/projectioncomponent.h b/modules/spacecraftinstruments/util/projectioncomponent.h index c81a28902b..f0f485709f 100644 --- a/modules/spacecraftinstruments/util/projectioncomponent.h +++ b/modules/spacecraftinstruments/util/projectioncomponent.h @@ -33,6 +33,8 @@ #include #include #include +#include +#include namespace ghoul { class Dictionary; } namespace ghoul::opengl { diff --git a/modules/spacecraftinstruments/util/scannerdecoder.cpp b/modules/spacecraftinstruments/util/scannerdecoder.cpp index 83ed3e9e41..f012460692 100644 --- a/modules/spacecraftinstruments/util/scannerdecoder.cpp +++ b/modules/spacecraftinstruments/util/scannerdecoder.cpp @@ -25,6 +25,7 @@ #include #include +#include namespace openspace { diff --git a/modules/spacecraftinstruments/util/scannerdecoder.h b/modules/spacecraftinstruments/util/scannerdecoder.h index 65564c1321..115cba71c5 100644 --- a/modules/spacecraftinstruments/util/scannerdecoder.h +++ b/modules/spacecraftinstruments/util/scannerdecoder.h @@ -26,8 +26,6 @@ #define __OPENSPACE_MODULE_SPACECRAFTINSTRUMENTS___SCANNERDECODER___H__ #include -#include -#include namespace openspace { diff --git a/modules/spacecraftinstruments/util/sequenceparser.cpp b/modules/spacecraftinstruments/util/sequenceparser.cpp index 95176f19ef..105e886873 100644 --- a/modules/spacecraftinstruments/util/sequenceparser.cpp +++ b/modules/spacecraftinstruments/util/sequenceparser.cpp @@ -24,10 +24,6 @@ #include -#include -#include -#include - namespace openspace { std::map& SequenceParser::subsetMap() { diff --git a/modules/spacecraftinstruments/util/sequenceparser.h b/modules/spacecraftinstruments/util/sequenceparser.h index af4b54dc92..3237ae1551 100644 --- a/modules/spacecraftinstruments/util/sequenceparser.h +++ b/modules/spacecraftinstruments/util/sequenceparser.h @@ -31,6 +31,7 @@ #include #include #include +#include #include namespace openspace { diff --git a/modules/spout/renderableplanespout.cpp b/modules/spout/renderableplanespout.cpp index 77f95f68b7..5de85be83c 100644 --- a/modules/spout/renderableplanespout.cpp +++ b/modules/spout/renderableplanespout.cpp @@ -26,10 +26,11 @@ #include +#include #include -#include -#include -#include +#include +#include +#include namespace { // This `Renderable` type can be used to render a plane with a texture that is @@ -38,7 +39,6 @@ namespace { struct [[codegen::Dictionary(RenderablePlaneSpout)]] Parameters { }; #include "renderableplanespout_codegen.cpp" - } // namespace namespace openspace { diff --git a/modules/spout/renderableplanespout.h b/modules/spout/renderableplanespout.h index 34e212db68..8c979870e4 100644 --- a/modules/spout/renderableplanespout.h +++ b/modules/spout/renderableplanespout.h @@ -33,8 +33,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class RenderablePlaneSpout : public RenderablePlane { public: explicit RenderablePlaneSpout(const ghoul::Dictionary& dictionary); diff --git a/modules/spout/renderablespherespout.cpp b/modules/spout/renderablespherespout.cpp index 6c53a6c0e9..102c1478ba 100644 --- a/modules/spout/renderablespherespout.cpp +++ b/modules/spout/renderablespherespout.cpp @@ -26,10 +26,11 @@ #include +#include #include -#include -#include -#include +#include +#include +#include namespace { // This `Renderable` type can be used to render a sphere with a texture that is diff --git a/modules/spout/renderablespherespout.h b/modules/spout/renderablespherespout.h index dd2fd65862..5da9ba0ab0 100644 --- a/modules/spout/renderablespherespout.h +++ b/modules/spout/renderablespherespout.h @@ -33,8 +33,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class RenderableSphereSpout : public RenderableSphere { public: explicit RenderableSphereSpout(const ghoul::Dictionary& dictionary); diff --git a/modules/spout/screenspacespout.cpp b/modules/spout/screenspacespout.cpp index 97756adc4d..4424245764 100644 --- a/modules/spout/screenspacespout.cpp +++ b/modules/spout/screenspacespout.cpp @@ -27,9 +27,9 @@ #include #include -#include -#include +#include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo NameInfo = { diff --git a/modules/spout/screenspacespout.h b/modules/spout/screenspacespout.h index ec158e7794..0dff84e024 100644 --- a/modules/spout/screenspacespout.h +++ b/modules/spout/screenspacespout.h @@ -33,8 +33,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class ScreenSpaceSpout : public ScreenSpaceRenderable { public: explicit ScreenSpaceSpout(const ghoul::Dictionary& dictionary); diff --git a/modules/spout/spoutmodule.cpp b/modules/spout/spoutmodule.cpp index b4b175f25e..310678c45c 100644 --- a/modules/spout/spoutmodule.cpp +++ b/modules/spout/spoutmodule.cpp @@ -27,9 +27,14 @@ #include #include #include +#include +#include +#include #include -#include #include +#include +#include +#include namespace openspace { diff --git a/modules/spout/spoutwrapper.cpp b/modules/spout/spoutwrapper.cpp index d47abeefff..f6a7b8c7ab 100644 --- a/modules/spout/spoutwrapper.cpp +++ b/modules/spout/spoutwrapper.cpp @@ -24,10 +24,17 @@ #include "modules/spout/spoutwrapper.h" +#include #include #include +#include +#include #include #include +#include +#include +#include + #define SPOUT_NO_GL_INCLUDE #include diff --git a/modules/spout/spoutwrapper.h b/modules/spout/spoutwrapper.h index c620420712..7cec9f6c04 100644 --- a/modules/spout/spoutwrapper.h +++ b/modules/spout/spoutwrapper.h @@ -25,18 +25,24 @@ #ifndef __OPENSPACE_MODULE_SPOUT___SPOUTWRAPPER___H__ #define __OPENSPACE_MODULE_SPOUT___SPOUTWRAPPER___H__ -#include #include #include #include +#include #include +#include +#include #include #include struct SPOUTLIBRARY; typedef SPOUTLIBRARY* SPOUTHANDLE; -namespace ghoul::opengl { class Texture; } +namespace ghoul { + namespace opengl { class Texture; } + class Dictionary; +} // namespace ghoul +namespace openspace::documentation { struct Documentation; } namespace openspace::spout { diff --git a/modules/statemachine/include/state.h b/modules/statemachine/include/state.h index 3c979e3756..1899b21423 100644 --- a/modules/statemachine/include/state.h +++ b/modules/statemachine/include/state.h @@ -25,9 +25,10 @@ #ifndef __OPENSPACE_MODULE_STATEMACHINE___STATE___H__ #define __OPENSPACE_MODULE_STATEMACHINE___STATE___H__ -#include #include +namespace ghoul { class Dictionary; } + namespace openspace { namespace documentation { struct Documentation; } diff --git a/modules/statemachine/include/statemachine.h b/modules/statemachine/include/statemachine.h index ca5bc94253..a840634e74 100644 --- a/modules/statemachine/include/statemachine.h +++ b/modules/statemachine/include/statemachine.h @@ -27,8 +27,12 @@ #include #include +#include +#include #include +namespace ghoul { class Dictionary; } + namespace openspace { namespace documentation { struct Documentation; } diff --git a/modules/statemachine/include/transition.h b/modules/statemachine/include/transition.h index aef4cf6dfe..f19e709b9e 100644 --- a/modules/statemachine/include/transition.h +++ b/modules/statemachine/include/transition.h @@ -25,9 +25,10 @@ #ifndef __OPENSPACE_MODULE_STATEMACHINE___TRANSITION___H__ #define __OPENSPACE_MODULE_STATEMACHINE___TRANSITION___H__ -#include #include +namespace ghoul { class Dictionary; } + namespace openspace { namespace documentation { struct Documentation; } diff --git a/modules/statemachine/src/state.cpp b/modules/statemachine/src/state.cpp index ce7c8eb694..a7b05ce22c 100644 --- a/modules/statemachine/src/state.cpp +++ b/modules/statemachine/src/state.cpp @@ -27,6 +27,8 @@ #include #include #include +#include +#include namespace { struct [[codegen::Dictionary(State)]] Parameters { diff --git a/modules/statemachine/src/statemachine.cpp b/modules/statemachine/src/statemachine.cpp index 772b2bacda..72866703e0 100644 --- a/modules/statemachine/src/statemachine.cpp +++ b/modules/statemachine/src/statemachine.cpp @@ -27,8 +27,10 @@ #include #include #include +#include #include #include +#include namespace { constexpr std::string_view _loggerCat = "StateMachine"; diff --git a/modules/statemachine/src/transition.cpp b/modules/statemachine/src/transition.cpp index 9ab9eaad52..c41a02f954 100644 --- a/modules/statemachine/src/transition.cpp +++ b/modules/statemachine/src/transition.cpp @@ -27,6 +27,8 @@ #include #include #include +#include +#include namespace { struct [[codegen::Dictionary(Transition)]] Parameters { diff --git a/modules/statemachine/statemachinemodule.cpp b/modules/statemachine/statemachinemodule.cpp index 0a782f1f93..3297373082 100644 --- a/modules/statemachine/statemachinemodule.cpp +++ b/modules/statemachine/statemachinemodule.cpp @@ -28,15 +28,15 @@ #include #include #include -#include -#include #include -#include #include +#include #include -#include -#include +#include +#include #include +#include +#include #include "statemachinemodule_lua.inl" @@ -48,7 +48,7 @@ namespace openspace { StateMachineModule::StateMachineModule() : OpenSpaceModule(Name) -{ } +{} void StateMachineModule::initializeStateMachine(const ghoul::Dictionary& states, const ghoul::Dictionary& transitions, diff --git a/modules/statemachine/statemachinemodule_lua.inl b/modules/statemachine/statemachinemodule_lua.inl index 660b94aab5..d4f9f08883 100644 --- a/modules/statemachine/statemachinemodule_lua.inl +++ b/modules/statemachine/statemachinemodule_lua.inl @@ -22,6 +22,11 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include +#include +#include +#include + namespace { /** diff --git a/modules/sync/syncmodule.cpp b/modules/sync/syncmodule.cpp index 5e6bb89488..5c320e4261 100644 --- a/modules/sync/syncmodule.cpp +++ b/modules/sync/syncmodule.cpp @@ -27,22 +27,17 @@ #include #include #include -#include -#include -#include -#include -#include #include #include #include #include -#include -#include #include #include -#include #include +#include #include +#include +#include #include "syncmodule_lua.inl" diff --git a/modules/sync/syncmodule_lua.inl b/modules/sync/syncmodule_lua.inl index 565fdfdfc3..34dab66184 100644 --- a/modules/sync/syncmodule_lua.inl +++ b/modules/sync/syncmodule_lua.inl @@ -22,6 +22,9 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include +#include + namespace { /** diff --git a/modules/sync/syncs/httpsynchronization.cpp b/modules/sync/syncs/httpsynchronization.cpp index dfe72f5218..1c04b3abc6 100644 --- a/modules/sync/syncs/httpsynchronization.cpp +++ b/modules/sync/syncs/httpsynchronization.cpp @@ -25,15 +25,26 @@ #include #include -#include #include #include #include #include +#include #include +#include #include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include #include +#include namespace { constexpr std::string_view _loggerCat = "HttpSynchronization"; diff --git a/modules/sync/syncs/urlsynchronization.cpp b/modules/sync/syncs/urlsynchronization.cpp index 32d9dd81a8..00cd0627a4 100644 --- a/modules/sync/syncs/urlsynchronization.cpp +++ b/modules/sync/syncs/urlsynchronization.cpp @@ -25,19 +25,28 @@ #include #include -#include #include #include #include #include #include -#include +#include #include +#include +#include +#include #include +#include +#include +#include +#include #include -#include #include +#include +#include +#include #include +#include #include namespace { diff --git a/modules/sync/syncs/urlsynchronization.h b/modules/sync/syncs/urlsynchronization.h index b86310d699..b63a64bab4 100644 --- a/modules/sync/syncs/urlsynchronization.h +++ b/modules/sync/syncs/urlsynchronization.h @@ -27,9 +27,7 @@ #include -#include -#include -#include +#include #include #include diff --git a/modules/telemetry/include/general/anglemodetelemetry.h b/modules/telemetry/include/general/anglemodetelemetry.h index 566fa5c485..a62201f27f 100644 --- a/modules/telemetry/include/general/anglemodetelemetry.h +++ b/modules/telemetry/include/general/anglemodetelemetry.h @@ -31,6 +31,8 @@ namespace openspace { +class Camera; + class AngleModeTelemetry : public TelemetryBase { public: AngleModeTelemetry(const std::string& ip, int port); diff --git a/modules/telemetry/include/general/cameratelemetry.h b/modules/telemetry/include/general/cameratelemetry.h index ad38f30d15..00431c7c61 100644 --- a/modules/telemetry/include/general/cameratelemetry.h +++ b/modules/telemetry/include/general/cameratelemetry.h @@ -32,6 +32,8 @@ namespace openspace { +class Camera; + class CameraTelemetry : public TelemetryBase { public: CameraTelemetry(const std::string& ip, int port); diff --git a/modules/telemetry/include/general/focustelemetry.h b/modules/telemetry/include/general/focustelemetry.h index 4b2f235b45..91078e7040 100644 --- a/modules/telemetry/include/general/focustelemetry.h +++ b/modules/telemetry/include/general/focustelemetry.h @@ -27,10 +27,10 @@ #include -#include - namespace openspace { +class Camera; + class FocusTelemetry : public TelemetryBase { public: FocusTelemetry(const std::string& ip, int port); diff --git a/modules/telemetry/include/general/nodestelemetry.h b/modules/telemetry/include/general/nodestelemetry.h index 2989541254..c7c8877559 100644 --- a/modules/telemetry/include/general/nodestelemetry.h +++ b/modules/telemetry/include/general/nodestelemetry.h @@ -33,6 +33,8 @@ namespace openspace { +class Camera; + namespace scripting { struct LuaLibrary; } class NodesTelemetry : public TelemetryBase { diff --git a/modules/telemetry/include/general/timetelemetry.h b/modules/telemetry/include/general/timetelemetry.h index af549e92e0..43ca2bcede 100644 --- a/modules/telemetry/include/general/timetelemetry.h +++ b/modules/telemetry/include/general/timetelemetry.h @@ -32,6 +32,8 @@ namespace openspace { +class Camera; + class TimeTelemetry : public TelemetryBase { public: TimeTelemetry(const std::string& ip, int port); diff --git a/modules/telemetry/include/specific/planetscomparesonification.h b/modules/telemetry/include/specific/planetscomparesonification.h index ce28b28d77..007439c2e8 100644 --- a/modules/telemetry/include/specific/planetscomparesonification.h +++ b/modules/telemetry/include/specific/planetscomparesonification.h @@ -27,9 +27,12 @@ #include +#include #include #include +namespace osc { struct Blob; } + namespace openspace { class PlanetsCompareSonification : public TelemetryBase { diff --git a/modules/telemetry/include/specific/planetsoverviewsonification.h b/modules/telemetry/include/specific/planetsoverviewsonification.h index a43f11bc32..2ecf33d725 100644 --- a/modules/telemetry/include/specific/planetsoverviewsonification.h +++ b/modules/telemetry/include/specific/planetsoverviewsonification.h @@ -27,6 +27,10 @@ #include +#include + +namespace osc { struct Blob; } + namespace openspace { class PlanetsOverviewSonification : public TelemetryBase { diff --git a/modules/telemetry/include/specific/planetssonification.h b/modules/telemetry/include/specific/planetssonification.h index a861d1de40..4a0b2be6e8 100644 --- a/modules/telemetry/include/specific/planetssonification.h +++ b/modules/telemetry/include/specific/planetssonification.h @@ -28,8 +28,12 @@ #include #include +#include #include +namespace ghoul { class Dictionary; } +namespace osc { struct Blob; } + namespace openspace { namespace scripting { struct LuaLibrary; } diff --git a/modules/telemetry/include/telemetrybase.h b/modules/telemetry/include/telemetrybase.h index 999c2b5d14..6771e8d37d 100644 --- a/modules/telemetry/include/telemetrybase.h +++ b/modules/telemetry/include/telemetrybase.h @@ -27,12 +27,13 @@ #include -#include -#include #include namespace openspace { +class Camera; +class OpenSoundControlConnection; + class TelemetryBase : public properties::PropertyOwner { public: TelemetryBase(properties::PropertyOwner::PropertyOwnerInfo info, diff --git a/modules/telemetry/include/util.h b/modules/telemetry/include/util.h index 92f7ee9b3a..4d60306a57 100644 --- a/modules/telemetry/include/util.h +++ b/modules/telemetry/include/util.h @@ -26,180 +26,182 @@ #define __OPENSPACE_MODULE_TELEMETRY___UTIL___H__ #include -#include #include +#include +#include namespace openspace { + +class Camera; + /** -* Calculate the distance from the camera to the node with the given identifier, in the -* given distance unit. -* -* \param camera Pointer to the camera in the scene that the distance should be calculated -* from -* \param nodeIdentifier The identifier of the node that the distance should be calculated -* to -* \param unit The distance unit that the answer should be in, the default is meters -* -* \return The distance from the camera to the node with the given identifier in the given -* distance unit -*/ + * Calculate the distance from the camera to the node with the given identifier, in the + * given distance unit. + * + * \param camera Pointer to the camera in the scene that the distance should be calculated + * from + * \param nodeIdentifier The identifier of the node that the distance should be calculated + * to + * \param unit The distance unit that the answer should be in, the default is meters + * + * \return The distance from the camera to the node with the given identifier in the given + * distance unit + */ double calculateDistanceTo(const Camera* camera, const std::string& nodeIdentifier, DistanceUnit unit = DistanceUnit::Meter); /** -* Calculate the distance from the camera to the node with the given position, in the given -* distance unit. -* -* \param camera Pointer to the camera in the scene that the distance should be calculated -* from -* \param nodePosition The world position of the node that the distance should be -* calculated to -* \param unit The distance unit that the answer should be in, the default is meters -* -* \return The distance from the camera to the node with the given position in the given -* distance unit -*/ + * Calculate the distance from the camera to the node with the given position, in the given + * distance unit. + * + * \param camera Pointer to the camera in the scene that the distance should be calculated + * from + * \param nodePosition The world position of the node that the distance should be + * calculated to + * \param unit The distance unit that the answer should be in, the default is meters + * + * \return The distance from the camera to the node with the given position in the given + * distance unit + */ double calculateDistanceTo(const Camera* camera, glm::dvec3 nodePosition, DistanceUnit unit = DistanceUnit::Meter); /** -* Calculate the angle in radians from the camera to the node with the given identifier. -* -* \param camera Pointer to the camera in the scene that the angle should be calculated -* from -* \param nodeIdentifier The identifier of the node, that the angle should be calculated to -* \param angleCalculationMode The angle calculation mode to use. This determines which -* method to use when calculating the angle. -* -* \return The angle in radians from the camera to the node with the given identifier -*/ + * Calculate the angle in radians from the camera to the node with the given identifier. + * + * \param camera Pointer to the camera in the scene that the angle should be calculated + * from + * \param nodeIdentifier The identifier of the node, that the angle should be calculated to + * \param angleCalculationMode The angle calculation mode to use. This determines which + * method to use when calculating the angle. + * + * \return The angle in radians from the camera to the node with the given identifier + */ double calculateAngleTo(const Camera* camera, const std::string& nodeIdentifier, TelemetryModule::AngleCalculationMode angleCalculationMode); /** -* Calculate the angle in radians from the camera to the node with the given position. -* -* \param camera Pointer to the camera in the scene that the angle should be calculated -* from -* \param nodePosition The position of the node, that the angle should be calculated to -* \param angleCalculationMode The angle calculation mode to use. This determines which -* method to use when calculating the angle. -* -* \return The angle in radians from the camera to the node with the given position -*/ + * Calculate the angle in radians from the camera to the node with the given position. + * + * \param camera Pointer to the camera in the scene that the angle should be calculated + * from + * \param nodePosition The position of the node, that the angle should be calculated to + * \param angleCalculationMode The angle calculation mode to use. This determines which + * method to use when calculating the angle. + * + * \return The angle in radians from the camera to the node with the given position + */ double calculateAngleTo(const Camera* camera, glm::dvec3 nodePosition, TelemetryModule::AngleCalculationMode angleCalculationMode); /** -* Calculate the angle in radians from the first node (A) with the given identifier to the -* second node (B) with the given identifier. -* -* \param camera Pointer to the camera in the scene -* \param nodeIdentifierA The identifier of the first node (A) that the angle should be -* calculated from -* \param nodeIdentifierB The identifier of the second node (B) that the angle should be -* calculated to -* \param angleCalculationMode The angle calculation mode to use. This determines which -* method to use when calculating the angle. -* -* \return The angle in radians from the first node (A) with the given identifier to the -* second node (B) with the given identifier -*/ -double calculateAngleFromAToB(const Camera* camera, - const std::string& nodeIdentifierA, const std::string& nodeIdentifierB, + * Calculate the angle in radians from the first node (A) with the given identifier to the + * second node (B) with the given identifier. + * + * \param camera Pointer to the camera in the scene + * \param nodeIdentifierA The identifier of the first node (A) that the angle should be + * calculated from + * \param nodeIdentifierB The identifier of the second node (B) that the angle should be + * calculated to + * \param angleCalculationMode The angle calculation mode to use. This determines which + * method to use when calculating the angle. + * + * \return The angle in radians from the first node (A) with the given identifier to the + * second node (B) with the given identifier + */ +double calculateAngleFromAToB(const Camera* camera, const std::string& nodeIdentifierA, + const std::string& nodeIdentifierB, TelemetryModule::AngleCalculationMode angleCalculationMode); /** -* Calculate the angle in radians from the first node (A) with the given position to the -* second node (B) with the given position. -* -* \param camera Pointer to the camera in the scene -* \param nodePositionA The position of the first node (A) that the angle should be -* calculated from -* \param nodePositionB The position of the second node (B) that the angle should be -* calculated to -* \param angleCalculationMode The angle calculation mode to use. This determines which -* method to use when calculating the angle. -* -* \return The angle in radians from the first node (A) with the given position to the -* second node (B) with the given position -*/ + * Calculate the angle in radians from the first node (A) with the given position to the + * second node (B) with the given position. + * + * \param camera Pointer to the camera in the scene + * \param nodePositionA The position of the first node (A) that the angle should be + * calculated from + * \param nodePositionB The position of the second node (B) that the angle should be + * calculated to + * \param angleCalculationMode The angle calculation mode to use. This determines which + * method to use when calculating the angle. + * + * \return The angle in radians from the first node (A) with the given position to the + * second node (B) with the given position + */ double calculateAngleFromAToB(const Camera* camera, glm::dvec3 nodePositionA, - glm::dvec3 nodePositionB, - TelemetryModule::AngleCalculationMode angleCalculationMode); + glm::dvec3 nodePositionB, TelemetryModule::AngleCalculationMode angleCalculationMode); /** -* Calculate the elevation angle in radians from the camera to the node with the given -* identifier. -* -* \param camera Pointer to the camera in the scene that the elevation angle should be -* calculated from -* \param nodeIdentifier The identifier of the node that the elevation angle should be -* calculated to -* \param angleCalculationMode The angle calculation mode to use. This determines which -* method to use when calculating the angle. -* -* \return The elevation angle in radians from the camera to the node with the given -* identifier -*/ + * Calculate the elevation angle in radians from the camera to the node with the given + * identifier. + * + * \param camera Pointer to the camera in the scene that the elevation angle should be + * calculated from + * \param nodeIdentifier The identifier of the node that the elevation angle should be + * calculated to + * \param angleCalculationMode The angle calculation mode to use. This determines which + * method to use when calculating the angle. + * + * \return The elevation angle in radians from the camera to the node with the given + * identifier + */ double calculateElevationAngleTo(const Camera* camera, const std::string& nodeIdentifier, TelemetryModule::AngleCalculationMode angleCalculationMode); /** -* Calculate the elevation angle in radians from the camera to the node with the given -* position. -* -* \param camera Pointer to the camera in the scene that the elevation angle should be -* calculated from -* \param nodePosition The position of the node that the elevation angle should be -* calculated to -* \param angleCalculationMode The angle calculation mode to use. This determines which -* method to use when calculating the angle. -* -* \return The elevation angle in radians from the camera to the node with the given -* position -*/ + * Calculate the elevation angle in radians from the camera to the node with the given + * position. + * + * \param camera Pointer to the camera in the scene that the elevation angle should be + * calculated from + * \param nodePosition The position of the node that the elevation angle should be + * calculated to + * \param angleCalculationMode The angle calculation mode to use. This determines which + * method to use when calculating the angle. + * + * \return The elevation angle in radians from the camera to the node with the given + * position + */ double calculateElevationAngleTo(const Camera* camera, glm::dvec3 nodePosition, TelemetryModule::AngleCalculationMode angleCalculationMode); /** -* Calculate the elevation angle in radians from the first node (A) with the given -* identifier to the second node (B) with the given identifier. -* -* \param camera Pointer to the camera in the scene -* \param nodeIdentifierA The identifier of the first node (A) that the elevation angle -* should be calculated from -* \param nodeIdentifierB The identifier of the second node (B) that the elevation angle -* should be calculated to -* \param angleCalculationMode The angle calculation mode to use. This determines which -* method to use when calculating the angle. -* -* \return The elevation angle in radians from the first node (A) with the given identifier -* to the second node (B) with the given identifier -*/ + * Calculate the elevation angle in radians from the first node (A) with the given + * identifier to the second node (B) with the given identifier. + * + * \param camera Pointer to the camera in the scene + * \param nodeIdentifierA The identifier of the first node (A) that the elevation angle + * should be calculated from + * \param nodeIdentifierB The identifier of the second node (B) that the elevation angle + * should be calculated to + * \param angleCalculationMode The angle calculation mode to use. This determines which + * method to use when calculating the angle. + * + * \return The elevation angle in radians from the first node (A) with the given identifier + * to the second node (B) with the given identifier + */ double calculateElevationAngleFromAToB(const Camera* camera, const std::string& nodeIdentifierA, const std::string& nodeIdentifierB, TelemetryModule::AngleCalculationMode angleCalculationMode); /** -* Calculate the elevation angle in radians from the first node (A) with the given position -* to the second node (B) with the given position. -* -* \param camera Pointer to the camera in the scene -* \param nodePositionA The position of the first node (A) that the elevation angle should -* be calculated from -* \param nodePositionB The position of the second node (B) that the elevation angle should -* be calculated to -* \param angleCalculationMode The angle calculation mode to use. This determines which -* method to use when calculating the angle. -* -* \return The elevation angle in radians from the first node (A) with the given position -* to the second node (B) with the given position -*/ -double calculateElevationAngleFromAToB(const Camera* camera, - glm::dvec3 nodePositionA, glm::dvec3 nodePositionB, - TelemetryModule::AngleCalculationMode angleCalculationMode); + * Calculate the elevation angle in radians from the first node (A) with the given position + * to the second node (B) with the given position. + * + * \param camera Pointer to the camera in the scene + * \param nodePositionA The position of the first node (A) that the elevation angle should + * be calculated from + * \param nodePositionB The position of the second node (B) that the elevation angle should + * be calculated to + * \param angleCalculationMode The angle calculation mode to use. This determines which + * method to use when calculating the angle. + * + * \return The elevation angle in radians from the first node (A) with the given position + * to the second node (B) with the given position + */ +double calculateElevationAngleFromAToB(const Camera* camera, glm::dvec3 nodePositionA, + glm::dvec3 nodePositionB, TelemetryModule::AngleCalculationMode angleCalculationMode); } // namespace openspace diff --git a/modules/telemetry/src/general/anglemodetelemetry.cpp b/modules/telemetry/src/general/anglemodetelemetry.cpp index 1959d4172e..bb8d2e59ed 100644 --- a/modules/telemetry/src/general/anglemodetelemetry.cpp +++ b/modules/telemetry/src/general/anglemodetelemetry.cpp @@ -24,6 +24,7 @@ #include +#include #include #include #include diff --git a/modules/telemetry/src/general/cameratelemetry.cpp b/modules/telemetry/src/general/cameratelemetry.cpp index 409dcf8005..4102a878b4 100644 --- a/modules/telemetry/src/general/cameratelemetry.cpp +++ b/modules/telemetry/src/general/cameratelemetry.cpp @@ -24,9 +24,13 @@ #include +#include +#include #include #include #include +#include +#include namespace { // Indices for data items diff --git a/modules/telemetry/src/general/focustelemetry.cpp b/modules/telemetry/src/general/focustelemetry.cpp index 46a1115277..eae7af09fe 100644 --- a/modules/telemetry/src/general/focustelemetry.cpp +++ b/modules/telemetry/src/general/focustelemetry.cpp @@ -24,6 +24,7 @@ #include +#include #include #include #include diff --git a/modules/telemetry/src/general/nodestelemetry.cpp b/modules/telemetry/src/general/nodestelemetry.cpp index d7110a0b93..cc7126ea4d 100644 --- a/modules/telemetry/src/general/nodestelemetry.cpp +++ b/modules/telemetry/src/general/nodestelemetry.cpp @@ -24,6 +24,7 @@ #include +#include #include #include #include @@ -31,6 +32,11 @@ #include #include #include +#include +#include +#include +#include +#include #include "nodestelemetry_lua.inl" diff --git a/modules/telemetry/src/general/timetelemetry.cpp b/modules/telemetry/src/general/timetelemetry.cpp index 5e3b6ecb78..ecb9351ce1 100644 --- a/modules/telemetry/src/general/timetelemetry.cpp +++ b/modules/telemetry/src/general/timetelemetry.cpp @@ -24,9 +24,12 @@ #include +#include #include #include #include +#include +#include namespace { // Indices for data items diff --git a/modules/telemetry/src/specific/planetscomparesonification.cpp b/modules/telemetry/src/specific/planetscomparesonification.cpp index 9fb4c4ef3b..41a4fe653b 100644 --- a/modules/telemetry/src/specific/planetscomparesonification.cpp +++ b/modules/telemetry/src/specific/planetscomparesonification.cpp @@ -24,11 +24,16 @@ #include +#include #include -#include #include #include +#include #include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "PlanetsCompareSonification"; diff --git a/modules/telemetry/src/specific/planetsoverviewsonification.cpp b/modules/telemetry/src/specific/planetsoverviewsonification.cpp index 0cf23c17c9..df06451a7f 100644 --- a/modules/telemetry/src/specific/planetsoverviewsonification.cpp +++ b/modules/telemetry/src/specific/planetsoverviewsonification.cpp @@ -24,8 +24,11 @@ #include +#include #include #include +#include +#include namespace { // Indices for data items diff --git a/modules/telemetry/src/specific/planetssonification.cpp b/modules/telemetry/src/specific/planetssonification.cpp index 71e283da19..e5d879155e 100644 --- a/modules/telemetry/src/specific/planetssonification.cpp +++ b/modules/telemetry/src/specific/planetssonification.cpp @@ -24,7 +24,9 @@ #include +#include #include +#include #include #include #include @@ -33,6 +35,16 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "planetssonification_lua.inl" diff --git a/modules/telemetry/src/telemetrybase.cpp b/modules/telemetry/src/telemetrybase.cpp index 6090440669..e950953fdd 100644 --- a/modules/telemetry/src/telemetrybase.cpp +++ b/modules/telemetry/src/telemetrybase.cpp @@ -24,10 +24,7 @@ #include -#include -#include -#include -#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo EnabledInfo = { diff --git a/modules/telemetry/src/util.cpp b/modules/telemetry/src/util.cpp index f1ed3383c5..bf53b5f5cd 100644 --- a/modules/telemetry/src/util.cpp +++ b/modules/telemetry/src/util.cpp @@ -24,12 +24,13 @@ #include -#include -#include +#include #include #include #include #include +#include +#include namespace { /** diff --git a/modules/telemetry/telemetrymodule.cpp b/modules/telemetry/telemetrymodule.cpp index 3b8e9cef76..f0da1e32aa 100644 --- a/modules/telemetry/telemetrymodule.cpp +++ b/modules/telemetry/telemetrymodule.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -40,7 +41,11 @@ #include #include #include -#include +#include +#include +#include +#include +#include namespace { // The default Open Sound Control receiver is SuperCollider with these default values. diff --git a/modules/telemetry/telemetrymodule.h b/modules/telemetry/telemetrymodule.h index f96b6cc4ec..6a46b837b6 100644 --- a/modules/telemetry/telemetrymodule.h +++ b/modules/telemetry/telemetrymodule.h @@ -27,14 +27,14 @@ #include "openspace/util/openspacemodule.h" -#include #include #include #include #include -#include #include #include +#include +#include namespace openspace { diff --git a/modules/touch/include/directinputsolver.h b/modules/touch/include/directinputsolver.h index 615d36e770..52f437ee38 100644 --- a/modules/touch/include/directinputsolver.h +++ b/modules/touch/include/directinputsolver.h @@ -25,8 +25,9 @@ #ifndef __OPENSPACE_MODULE_TOUCH___DIRECTINPUT_SOLVER___H__ #define __OPENSPACE_MODULE_TOUCH___DIRECTINPUT_SOLVER___H__ -#include #include +#include +#include #include namespace openspace { diff --git a/modules/touch/include/touchinteraction.h b/modules/touch/include/touchinteraction.h index 52809fba9c..802a93ff83 100644 --- a/modules/touch/include/touchinteraction.h +++ b/modules/touch/include/touchinteraction.h @@ -28,24 +28,22 @@ #include #include -#include #include #include #include #include #include -#include #include +#include +#include #include #include -#include // #define TOUCH_DEBUG_PROPERTIES namespace openspace { class Camera; -class SceneGraphNode; // Class used for keeping track of the recent average frame time class FrameTimeAverage { @@ -64,8 +62,6 @@ private: class TouchInteraction : public properties::PropertyOwner { public: - TouchInteraction(); - enum class InteractionType { ROTATION = 0, PINCH, @@ -82,6 +78,8 @@ public: glm::dvec2 pan = glm::dvec2(0.0); }; + TouchInteraction(); + /** * Main function call: * 1. Checks if doubleTap occured diff --git a/modules/touch/include/touchmarker.h b/modules/touch/include/touchmarker.h index e5fac0123e..1453dcc2c8 100644 --- a/modules/touch/include/touchmarker.h +++ b/modules/touch/include/touchmarker.h @@ -25,18 +25,15 @@ #ifndef __OPENSPACE_MODULE_TOUCH___TOUCH_MARKER___H__ #define __OPENSPACE_MODULE_TOUCH___TOUCH_MARKER___H__ -#include #include -#include + #include #include #include #include -#include #include #include #include -#include namespace ghoul::opengl { class ProgramObject; } @@ -50,10 +47,10 @@ public: void initialize(); void deinitialize(); - void render(const std::vector& list); + void render(const std::vector& list); private: - void createVertexList(const std::vector& list); + void createVertexList(const std::vector& list); properties::BoolProperty _visible; properties::FloatProperty _radiusSize; diff --git a/modules/touch/include/tuioear.h b/modules/touch/include/tuioear.h index 16d8750bf6..27398c523d 100644 --- a/modules/touch/include/tuioear.h +++ b/modules/touch/include/tuioear.h @@ -33,8 +33,9 @@ #pragma GCC diagnostic ignored "-Wold-style-cast" #endif -#include -#include +#include +#include +#include #ifdef __clang__ #pragma clang diagnostic pop @@ -43,11 +44,15 @@ #endif #include -#include -#include #include #include +namespace TUIO { + class TuioBlob; + class TuioCursor; + class TuioObject; +} // namespace TUIO + namespace openspace { class TuioEar : public TUIO::TuioListener { diff --git a/modules/touch/include/win32_touch.h b/modules/touch/include/win32_touch.h index 7f488b1a75..cb8e759b2b 100644 --- a/modules/touch/include/win32_touch.h +++ b/modules/touch/include/win32_touch.h @@ -38,4 +38,5 @@ public: } // namespace openspace #endif // WIN32 + #endif // __OPENSPACE_MODULE_TOUCH___WIN32_TOUCH___H__ diff --git a/modules/touch/src/directinputsolver.cpp b/modules/touch/src/directinputsolver.cpp index d7e9d1755e..fd0e585641 100644 --- a/modules/touch/src/directinputsolver.cpp +++ b/modules/touch/src/directinputsolver.cpp @@ -24,8 +24,14 @@ #include +#include #include #include +#include +#include +#include +#include +#include namespace { // Used in the LM algorithm diff --git a/modules/touch/src/touchinteraction.cpp b/modules/touch/src/touchinteraction.cpp index 9b41d364ea..55e519dde4 100644 --- a/modules/touch/src/touchinteraction.cpp +++ b/modules/touch/src/touchinteraction.cpp @@ -31,8 +31,18 @@ #include #include #include +#include +#include #include #include +#include +#include +#include +#include +#include +#include +#include +#include #ifdef WIN32 #pragma warning (push) @@ -313,7 +323,10 @@ TouchInteraction::TouchInteraction() // projDiffLength/diffLength. , _enableDirectManipulation(EnableDirectManipulationInfo, true) , _directTouchDistanceThreshold(DirectManipulationThresholdInfo, 5.f, 0.f, 10.f) - , _pinchInputs({ TouchInput(0, 0, 0.f, 0.f, 0.0), TouchInput(0, 0, 0.f, 0.f, 0.0) }) + , _pinchInputs({ + TouchInputHolder(TouchInput(0, 0, 0.f, 0.f, 0.0)), + TouchInputHolder(TouchInput(0, 0, 0.f, 0.f, 0.0)) + }) , _vel{ glm::dvec2(0.0), 0.0, 0.0, glm::dvec2(0.0) } , _sensitivity{ glm::dvec2(0.08, 0.045), 12.0, 2.75, glm::dvec2(0.08, 0.045) } { diff --git a/modules/touch/src/touchmarker.cpp b/modules/touch/src/touchmarker.cpp index f9117fa801..e262ebb8f7 100644 --- a/modules/touch/src/touchmarker.cpp +++ b/modules/touch/src/touchmarker.cpp @@ -27,7 +27,6 @@ #include #include #include -#include #include namespace { diff --git a/modules/touch/src/tuioear.cpp b/modules/touch/src/tuioear.cpp index 150b2eaddc..6a13cfd1f1 100644 --- a/modules/touch/src/tuioear.cpp +++ b/modules/touch/src/tuioear.cpp @@ -24,12 +24,9 @@ #include -#include -#include -#include -#include -#include -#include +#include +#include +#include using namespace TUIO; diff --git a/modules/touch/src/win32_touch.cpp b/modules/touch/src/win32_touch.cpp index 74da61931f..61d2650263 100644 --- a/modules/touch/src/win32_touch.cpp +++ b/modules/touch/src/win32_touch.cpp @@ -28,14 +28,21 @@ #include #include -#include +#include +#include #include #include +#include #include -#include -#include -#include #include +#include +#include +#include +#include +#include +#include +#include +#include // #define ENABLE_TUIOMESSAGES #define ENABLE_DIRECTMSG diff --git a/modules/touch/touchmodule.cpp b/modules/touch/touchmodule.cpp index c94666ccea..419664e0fd 100644 --- a/modules/touch/touchmodule.cpp +++ b/modules/touch/touchmodule.cpp @@ -26,14 +26,24 @@ #include #include +#include #include #include #include #include #include #include +#include #include +#include +#include #include +#include +#include +#include +#include +#include +#include using namespace TUIO; diff --git a/modules/touch/touchmodule.h b/modules/touch/touchmodule.h index 4c76f80f5a..30257e669e 100644 --- a/modules/touch/touchmodule.h +++ b/modules/touch/touchmodule.h @@ -34,6 +34,7 @@ #include #include #include +#include namespace openspace { @@ -90,7 +91,7 @@ private: glm::ivec2 _webPositionCallback = glm::ivec2(0); #ifdef WIN32 std::unique_ptr _win32TouchHook; -#endif //WIN32 +#endif // WIN32 bool _tap = false; }; diff --git a/modules/toyvolume/rendering/renderabletoyvolume.cpp b/modules/toyvolume/rendering/renderabletoyvolume.cpp index 5254bb1e51..b8c6b163d0 100644 --- a/modules/toyvolume/rendering/renderabletoyvolume.cpp +++ b/modules/toyvolume/rendering/renderabletoyvolume.cpp @@ -24,13 +24,14 @@ #include -#include #include #include -#include #include #include -#include +#include +#include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo SizeInfo = { @@ -113,6 +114,10 @@ namespace { namespace openspace { +documentation::Documentation RenderableToyVolume::Documentation() { + return codegen::doc("toyvolume_renderabletoyvolume"); +} + RenderableToyVolume::RenderableToyVolume(const ghoul::Dictionary& dictionary) : Renderable(dictionary) , _size(SizeInfo, glm::vec3(1.f, 1.f, 1.f), glm::vec3(0.f), glm::vec3(10.f)) @@ -142,8 +147,6 @@ RenderableToyVolume::RenderableToyVolume(const ghoul::Dictionary& dictionary) _downScaleVolumeRendering = p.downscale.value_or(_downScaleVolumeRendering); } -RenderableToyVolume::~RenderableToyVolume() {} - void RenderableToyVolume::initializeGL() { glm::vec4 color = glm::vec4(glm::vec3(_color), opacity()); _raycaster = std::make_unique(std::move(color)); diff --git a/modules/toyvolume/rendering/renderabletoyvolume.h b/modules/toyvolume/rendering/renderabletoyvolume.h index d0571b86db..f6be9efd2e 100644 --- a/modules/toyvolume/rendering/renderabletoyvolume.h +++ b/modules/toyvolume/rendering/renderabletoyvolume.h @@ -27,19 +27,17 @@ #include +#include #include #include #include +#include namespace openspace { -class ToyVolumeRaycaster; -struct RenderData; - class RenderableToyVolume : public Renderable { public: explicit RenderableToyVolume(const ghoul::Dictionary& dictionary); - ~RenderableToyVolume() override; void initializeGL() override; void deinitializeGL() override; @@ -47,6 +45,8 @@ public: void render(const RenderData& data, RendererTasks& tasks) override; void update(const UpdateData& data) override; + static documentation::Documentation Documentation(); + private: properties::Vec3Property _size; properties::IntProperty _scalingExponent; diff --git a/modules/toyvolume/rendering/toyvolumeraycaster.cpp b/modules/toyvolume/rendering/toyvolumeraycaster.cpp index 58ec72c94e..59815cca74 100644 --- a/modules/toyvolume/rendering/toyvolumeraycaster.cpp +++ b/modules/toyvolume/rendering/toyvolumeraycaster.cpp @@ -24,15 +24,14 @@ #include -#include -#include #include #include +#include #include #include #include -#include -#include +#include +#include namespace { constexpr std::string_view GlslRaycastPath = diff --git a/modules/toyvolume/rendering/toyvolumeraycaster.h b/modules/toyvolume/rendering/toyvolumeraycaster.h index 9ffe3e867a..c76b2630ba 100644 --- a/modules/toyvolume/rendering/toyvolumeraycaster.h +++ b/modules/toyvolume/rendering/toyvolumeraycaster.h @@ -29,18 +29,10 @@ #include #include -#include - -namespace ghoul::opengl { - class Texture; - class ProgramObject; -} // namespace ghoul::opengl +#include namespace openspace { -struct RenderData; -struct RaycastData; - class ToyVolumeRaycaster : public VolumeRaycaster { public: explicit ToyVolumeRaycaster(glm::vec4 color); diff --git a/modules/toyvolume/toyvolumemodule.cpp b/modules/toyvolume/toyvolumemodule.cpp index f6d90fbdb0..3a6201698c 100644 --- a/modules/toyvolume/toyvolumemodule.cpp +++ b/modules/toyvolume/toyvolumemodule.cpp @@ -25,8 +25,11 @@ #include #include +#include +#include #include #include +#include #include namespace openspace { @@ -40,4 +43,10 @@ void ToyVolumeModule::internalInitialize(const ghoul::Dictionary&) { fRenderable->registerClass("RenderableToyVolume"); } +std::vector ToyVolumeModule::documentations() const { + return { + RenderableToyVolume::Documentation() + }; +} + } // namespace openspace diff --git a/modules/toyvolume/toyvolumemodule.h b/modules/toyvolume/toyvolumemodule.h index ba47b4894e..892c729f84 100644 --- a/modules/toyvolume/toyvolumemodule.h +++ b/modules/toyvolume/toyvolumemodule.h @@ -34,7 +34,9 @@ public: constexpr static const char* Name = "ToyVolume"; ToyVolumeModule(); + std::vector documentations() const override; +private: void internalInitialize(const ghoul::Dictionary&) override; }; diff --git a/modules/video/include/renderablevideoplane.h b/modules/video/include/renderablevideoplane.h index 6ff607da55..a1e2833cd9 100644 --- a/modules/video/include/renderablevideoplane.h +++ b/modules/video/include/renderablevideoplane.h @@ -28,11 +28,10 @@ #include #include +#include namespace openspace { -namespace documentation { struct Documentation; } - class RenderableVideoPlane : public RenderablePlane { public: explicit RenderableVideoPlane(const ghoul::Dictionary& dictionary); diff --git a/modules/video/include/renderablevideosphere.h b/modules/video/include/renderablevideosphere.h index c9da8642e6..1358ccbc40 100644 --- a/modules/video/include/renderablevideosphere.h +++ b/modules/video/include/renderablevideosphere.h @@ -31,8 +31,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class RenderableVideoSphere : public RenderableSphere { public: explicit RenderableVideoSphere(const ghoul::Dictionary& dictionary); diff --git a/modules/video/include/screenspacevideo.h b/modules/video/include/screenspacevideo.h index 3df6f5c025..9dfffc615c 100644 --- a/modules/video/include/screenspacevideo.h +++ b/modules/video/include/screenspacevideo.h @@ -28,14 +28,9 @@ #include #include -#include - -namespace ghoul::opengl { class Texture; } namespace openspace { -namespace documentation { struct Documentation; } - class ScreenSpaceVideo : public ScreenSpaceRenderable { public: explicit ScreenSpaceVideo(const ghoul::Dictionary& dictionary); diff --git a/modules/video/include/videoplayer.h b/modules/video/include/videoplayer.h index b53ef97dd4..f6c93eb7d4 100644 --- a/modules/video/include/videoplayer.h +++ b/modules/video/include/videoplayer.h @@ -28,20 +28,24 @@ #include #include -#include #include #include #include #include +#include #include -#include - -// libmpv #include -#include +#include +#include +#include +#include + +namespace ghoul { class Dictionary; } namespace openspace { +namespace documentation { struct Documentation; } + enum class PlaybackMode { MapToSimulationTime = 0, RealTimeLoop diff --git a/modules/video/include/videotileprovider.h b/modules/video/include/videotileprovider.h index 06303ea2e2..38a3cdc006 100644 --- a/modules/video/include/videotileprovider.h +++ b/modules/video/include/videotileprovider.h @@ -27,24 +27,17 @@ #include +#include +#include #include -#include -#include -#include -#include - -// libmpv -#include -#include - -namespace openspace { struct Documentation; } namespace openspace::globebrowsing { +struct ChunkTile; + class VideoTileProvider : public TileProvider { public: explicit VideoTileProvider(const ghoul::Dictionary& dictionary); - ~VideoTileProvider() override; void update() override final; void reset() override final; diff --git a/modules/video/src/renderablevideoplane.cpp b/modules/video/src/renderablevideoplane.cpp index 41253149ab..5e628fc95a 100644 --- a/modules/video/src/renderablevideoplane.cpp +++ b/modules/video/src/renderablevideoplane.cpp @@ -25,7 +25,10 @@ #include #include -#include +#include +#include +#include +#include namespace { // This `Renderable` creates a textured 3D plane where the texture is a video. diff --git a/modules/video/src/renderablevideosphere.cpp b/modules/video/src/renderablevideosphere.cpp index 0dd87e6340..d7878063b5 100644 --- a/modules/video/src/renderablevideosphere.cpp +++ b/modules/video/src/renderablevideosphere.cpp @@ -25,8 +25,8 @@ #include #include -#include -#include +#include +#include namespace { // This `Renderable` creates a textured 3D sphere where the texture is a video. Per diff --git a/modules/video/src/screenspacevideo.cpp b/modules/video/src/screenspacevideo.cpp index 6c86638a55..22df7172f7 100644 --- a/modules/video/src/screenspacevideo.cpp +++ b/modules/video/src/screenspacevideo.cpp @@ -25,15 +25,9 @@ #include #include -#include -#include -#include -#include -#include +#include #include -#include #include -#include namespace { // This `ScreenSpaceRenderable` can be used to render a video in front of the camera. diff --git a/modules/video/src/videoplayer.cpp b/modules/video/src/videoplayer.cpp index f4c83fdc26..5e7675e63d 100644 --- a/modules/video/src/videoplayer.cpp +++ b/modules/video/src/videoplayer.cpp @@ -24,18 +24,26 @@ #include +#include #include -#include #include -#include #include #include #include #include #include -#include +#include +#include +#include +#include +#include #include #include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "VideoPlayer"; diff --git a/modules/video/src/videotileprovider.cpp b/modules/video/src/videotileprovider.cpp index 21e29bb654..95b3e6ca46 100644 --- a/modules/video/src/videotileprovider.cpp +++ b/modules/video/src/videotileprovider.cpp @@ -24,17 +24,14 @@ #include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include #include +#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "VideoTileProvider"; @@ -72,8 +69,6 @@ VideoTileProvider::VideoTileProvider(const ghoul::Dictionary& dictionary) addPropertySubOwner(_videoPlayer); } -VideoTileProvider::~VideoTileProvider() {} - globebrowsing::Tile VideoTileProvider::tile(const globebrowsing::TileIndex& tileIndex) { ZoneScoped; diff --git a/modules/video/videomodule.cpp b/modules/video/videomodule.cpp index 47b457b2f7..e87ab42026 100644 --- a/modules/video/videomodule.cpp +++ b/modules/video/videomodule.cpp @@ -31,7 +31,11 @@ #include #include #include -#include +#include +#include +#include +#include +#include namespace openspace { diff --git a/modules/video/videomodule.h b/modules/video/videomodule.h index 3295877ce0..1024e12672 100644 --- a/modules/video/videomodule.h +++ b/modules/video/videomodule.h @@ -27,8 +27,6 @@ #include -#include - namespace openspace { class VideoModule : public OpenSpaceModule { diff --git a/modules/volume/envelope.cpp b/modules/volume/envelope.cpp index 247f59f68b..7c948a63d0 100644 --- a/modules/volume/envelope.cpp +++ b/modules/volume/envelope.cpp @@ -25,11 +25,10 @@ #include #include - +#include +#include #include -using json = nlohmann::json; - namespace openspace::volume { EnvelopePoint::EnvelopePoint(glm::vec3 c, float x, float y) @@ -186,8 +185,8 @@ std::string EnvelopePoint::hexadecimalFromVec3(const glm::vec3& vec) const { return ("#" + r + g + b); } -json Envelope::jsonPoints() const { - json j; +nlohmann::json Envelope::jsonPoints() const { + nlohmann::json j; for (size_t i = 0; i < _points.size(); i++) { j[i] = { { @@ -206,8 +205,8 @@ json Envelope::jsonPoints() const { return j; } -json Envelope::jsonEnvelope() const { - json j; +nlohmann::json Envelope::jsonEnvelope() const { + nlohmann::json j; j["points"] = jsonPoints(); return j; } diff --git a/modules/volume/envelope.h b/modules/volume/envelope.h index 3c4b32f4af..d8f0db7eef 100644 --- a/modules/volume/envelope.h +++ b/modules/volume/envelope.h @@ -27,6 +27,9 @@ #include #include +#include +#include +#include struct lua_State; diff --git a/modules/volume/linearlrucache.h b/modules/volume/linearlrucache.h index 854329857d..df8412cf7b 100644 --- a/modules/volume/linearlrucache.h +++ b/modules/volume/linearlrucache.h @@ -25,9 +25,9 @@ #ifndef __OPENSPACE_MODULE_VOLUME___LINEARLRUCACHE___H__ #define __OPENSPACE_MODULE_VOLUME___LINEARLRUCACHE___H__ -#include #include -#include +#include +#include namespace openspace::volume { diff --git a/modules/volume/linearlrucache.inl b/modules/volume/linearlrucache.inl index 4ac087c1a6..934b082f8a 100644 --- a/modules/volume/linearlrucache.inl +++ b/modules/volume/linearlrucache.inl @@ -64,7 +64,7 @@ ValueType& LinearLruCache::get(size_t key) { template void LinearLruCache::evict() { - _cache[_tracker.front()] = make_pair(nullptr, _tracker.end()); + _cache[_tracker.front()] = std::make_pair(nullptr, _tracker.end()); _tracker.pop_front(); } diff --git a/modules/volume/lrucache.h b/modules/volume/lrucache.h index 8111c00703..a6e08adcd8 100644 --- a/modules/volume/lrucache.h +++ b/modules/volume/lrucache.h @@ -25,9 +25,8 @@ #ifndef __OPENSPACE_MODULE_VOLUME___LRUCACHE___H__ #define __OPENSPACE_MODULE_VOLUME___LRUCACHE___H__ -#include #include -#include +#include namespace openspace::volume { @@ -49,6 +48,7 @@ public: private: void insert(const KeyType& key, const ValueType& value); + ContainerType< KeyType, std::pair::iterator> > _cache; diff --git a/modules/volume/rawvolume.inl b/modules/volume/rawvolume.inl index b88c2e7085..bc0768b55a 100644 --- a/modules/volume/rawvolume.inl +++ b/modules/volume/rawvolume.inl @@ -23,6 +23,7 @@ ****************************************************************************************/ #include +#include namespace openspace::volume { diff --git a/modules/volume/rawvolumemetadata.cpp b/modules/volume/rawvolumemetadata.cpp index 5c27460f85..5e074b8046 100644 --- a/modules/volume/rawvolumemetadata.cpp +++ b/modules/volume/rawvolumemetadata.cpp @@ -24,11 +24,11 @@ #include -#include #include #include #include #include +#include namespace { struct [[codegen::Dictionary(RawVolumeMetaData)]] Parameters { diff --git a/modules/volume/rawvolumemetadata.h b/modules/volume/rawvolumemetadata.h index 1a0af13b5e..ab4e50d23a 100644 --- a/modules/volume/rawvolumemetadata.h +++ b/modules/volume/rawvolumemetadata.h @@ -27,9 +27,10 @@ #include #include +#include -namespace openspace::documentation { struct Documentation; } namespace ghoul { class Dictionary; } +namespace openspace::documentation { struct Documentation; } namespace openspace::volume { diff --git a/modules/volume/rawvolumereader.h b/modules/volume/rawvolumereader.h index c2af207af8..f7c6810596 100644 --- a/modules/volume/rawvolumereader.h +++ b/modules/volume/rawvolumereader.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace openspace::volume { diff --git a/modules/volume/rawvolumewriter.h b/modules/volume/rawvolumewriter.h index 34c089097e..82463ce5c9 100644 --- a/modules/volume/rawvolumewriter.h +++ b/modules/volume/rawvolumewriter.h @@ -25,9 +25,9 @@ #ifndef __OPENSPACE_MODULE_VOLUME___RAWVOLUMEWRITER___H__ #define __OPENSPACE_MODULE_VOLUME___RAWVOLUMEWRITER___H__ +#include #include #include -#include namespace openspace::volume { @@ -38,11 +38,10 @@ class RawVolumeWriter { public: explicit RawVolumeWriter(std::filesystem::path path, size_t bufferSize = 1024); - void setPath(std::filesystem::path path); glm::uvec3 dimensions() const; void setDimensions(glm::uvec3 dimensions); void write(const std::function& fn, - const std::function& onProgress = [](float) {}); + const std::function& onProgress = [](float) {}); void write(const RawVolume& volume); size_t coordsToIndex(const glm::uvec3& coords) const; diff --git a/modules/volume/rawvolumewriter.inl b/modules/volume/rawvolumewriter.inl index 8a09a6a9df..f076565b89 100644 --- a/modules/volume/rawvolumewriter.inl +++ b/modules/volume/rawvolumewriter.inl @@ -26,7 +26,10 @@ #include #include #include +#include #include +#include +#include namespace openspace::volume { @@ -66,8 +69,8 @@ void RawVolumeWriter::write( const size_t size = static_cast(dims.x) * static_cast(dims.y) * static_cast(dims.z); - std::vector buffer(_bufferSize); - std::ofstream file(_path, std::ios::binary); + std::vector buffer = std::vector(_bufferSize); + std::ofstream file = std::ofstream(_path, std::ios::binary); int nChunks = static_cast(size / _bufferSize); if (size % _bufferSize > 0) { @@ -87,7 +90,6 @@ void RawVolumeWriter::write( ); onProgress(static_cast(c + 1) / nChunks); } - file.close(); } template diff --git a/modules/volume/rendering/basicvolumeraycaster.cpp b/modules/volume/rendering/basicvolumeraycaster.cpp index e0c66211eb..2cf88e5d0e 100644 --- a/modules/volume/rendering/basicvolumeraycaster.cpp +++ b/modules/volume/rendering/basicvolumeraycaster.cpp @@ -25,8 +25,6 @@ #include #include -#include -#include #include #include #include @@ -35,7 +33,11 @@ #include #include #include -#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view GlslRaycast = "${MODULE_VOLUME}/shaders/raycast.glsl"; diff --git a/modules/volume/rendering/basicvolumeraycaster.h b/modules/volume/rendering/basicvolumeraycaster.h index 80e12645f4..361cccc01b 100644 --- a/modules/volume/rendering/basicvolumeraycaster.h +++ b/modules/volume/rendering/basicvolumeraycaster.h @@ -27,20 +27,13 @@ #include -#include #include +#include +#include -namespace ghoul::opengl { - class Texture; - class ProgramObject; - class TextureUnit; -} // namespace ghoul::opengl +namespace ghoul::opengl { class TextureUnit; } -namespace openspace { - struct RenderData; - struct RaycastData; - class TransferFunction; -} // namespace openspace +namespace openspace { class TransferFunction; } namespace openspace::volume { diff --git a/modules/volume/rendering/renderabletimevaryingvolume.cpp b/modules/volume/rendering/renderabletimevaryingvolume.cpp index 6c419ee8bb..53a4b90023 100644 --- a/modules/volume/rendering/renderabletimevaryingvolume.cpp +++ b/modules/volume/rendering/renderabletimevaryingvolume.cpp @@ -26,32 +26,34 @@ #include #include -#include #include +#include #include #include #include -#include #include #include -#include #include #include #include #include #include -#include #include +#include #include #include +#include +#include #include -#include #include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "RenderableTimeVaryingVolume"; - const float SecondsInOneDay = 60 * 60 * 24; + constexpr float SecondsInOneDay = 60 * 60 * 24; constexpr openspace::properties::Property::PropertyInfo StepSizeInfo = { "StepSize", diff --git a/modules/volume/rendering/renderabletimevaryingvolume.h b/modules/volume/rendering/renderabletimevaryingvolume.h index 631de3a34d..ff64db5449 100644 --- a/modules/volume/rendering/renderabletimevaryingvolume.h +++ b/modules/volume/rendering/renderabletimevaryingvolume.h @@ -34,11 +34,10 @@ #include #include #include +#include +#include -namespace openspace { - class Histogram; - struct RenderData; -} // namespace openspace +namespace openspace { class Histogram; } namespace openspace::volume { diff --git a/modules/volume/rendering/volumeclipplane.cpp b/modules/volume/rendering/volumeclipplane.cpp index 8ba0d38877..30cda6836a 100644 --- a/modules/volume/rendering/volumeclipplane.cpp +++ b/modules/volume/rendering/volumeclipplane.cpp @@ -24,6 +24,7 @@ #include +#include #include #include diff --git a/modules/volume/rendering/volumeclipplane.h b/modules/volume/rendering/volumeclipplane.h index a587077618..3a5f08d9f5 100644 --- a/modules/volume/rendering/volumeclipplane.h +++ b/modules/volume/rendering/volumeclipplane.h @@ -29,6 +29,7 @@ #include #include +#include namespace ghoul { class Dictionary; } diff --git a/modules/volume/rendering/volumeclipplanes.cpp b/modules/volume/rendering/volumeclipplanes.cpp index 14ad128458..157e4c31b6 100644 --- a/modules/volume/rendering/volumeclipplanes.cpp +++ b/modules/volume/rendering/volumeclipplanes.cpp @@ -26,6 +26,7 @@ #include #include +#include namespace openspace::volume { diff --git a/modules/volume/rendering/volumeclipplanes.h b/modules/volume/rendering/volumeclipplanes.h index 1343c61251..917b51c705 100644 --- a/modules/volume/rendering/volumeclipplanes.h +++ b/modules/volume/rendering/volumeclipplanes.h @@ -29,14 +29,12 @@ #include #include -#include +#include namespace ghoul { class Dictionary; } namespace openspace::volume { -class VolumeClipPlane; - class VolumeClipPlanes : public properties::PropertyOwner { public: explicit VolumeClipPlanes(const ghoul::Dictionary& dictionary); diff --git a/modules/volume/tasks/generaterawvolumefromfiletask.cpp b/modules/volume/tasks/generaterawvolumefromfiletask.cpp index 4d0df23cbc..822710767f 100644 --- a/modules/volume/tasks/generaterawvolumefromfiletask.cpp +++ b/modules/volume/tasks/generaterawvolumefromfiletask.cpp @@ -27,17 +27,22 @@ #include #include #include +#include #include -#include +#include +#include #include -#include #include -#include #include #include +#include #include +#include #include #include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "GenerateRawVolumeFromFileTask"; diff --git a/modules/volume/tasks/generaterawvolumefromfiletask.h b/modules/volume/tasks/generaterawvolumefromfiletask.h index 4ec2c04199..7b82991610 100644 --- a/modules/volume/tasks/generaterawvolumefromfiletask.h +++ b/modules/volume/tasks/generaterawvolumefromfiletask.h @@ -29,7 +29,6 @@ #include #include -#include namespace openspace::volume { diff --git a/modules/volume/tasks/generaterawvolumetask.cpp b/modules/volume/tasks/generaterawvolumetask.cpp index 3d35b70aae..915ba834eb 100644 --- a/modules/volume/tasks/generaterawvolumetask.cpp +++ b/modules/volume/tasks/generaterawvolumetask.cpp @@ -27,19 +27,21 @@ #include #include #include -#include +#include +#include #include #include #include -#include #include -#include #include #include -#include #include -#include +#include +#include +#include +#include #include +#include namespace { struct [[codegen::Dictionary(GenerateRawVolumeTask)]] Parameters { diff --git a/modules/volume/tasks/generaterawvolumetask.h b/modules/volume/tasks/generaterawvolumetask.h index 4d06aef51a..1848e6de6c 100644 --- a/modules/volume/tasks/generaterawvolumetask.h +++ b/modules/volume/tasks/generaterawvolumetask.h @@ -29,7 +29,6 @@ #include #include -#include namespace openspace::volume { diff --git a/modules/volume/textureslicevolumereader.h b/modules/volume/textureslicevolumereader.h index 6a5691f46a..28d65d0365 100644 --- a/modules/volume/textureslicevolumereader.h +++ b/modules/volume/textureslicevolumereader.h @@ -28,6 +28,7 @@ #include #include #include +#include #include namespace ghoul::opengl { class Texture; } diff --git a/modules/volume/textureslicevolumereader.inl b/modules/volume/textureslicevolumereader.inl index 0128d63505..f22c70660d 100644 --- a/modules/volume/textureslicevolumereader.inl +++ b/modules/volume/textureslicevolumereader.inl @@ -23,7 +23,9 @@ ****************************************************************************************/ #include +#include #include +#include namespace openspace::volume { diff --git a/modules/volume/transferfunction.cpp b/modules/volume/transferfunction.cpp index d7c21a05c6..fc0456ebd4 100644 --- a/modules/volume/transferfunction.cpp +++ b/modules/volume/transferfunction.cpp @@ -24,12 +24,20 @@ #include -#include #include #include +#include +#include +#include +#include #include +#include +#include +#include -using json = nlohmann::json; +namespace { + constexpr int Width = 1024; +} // namepsace namespace openspace::volume { @@ -38,7 +46,7 @@ TransferFunction::TransferFunction(const std::string& string) { } bool TransferFunction::setEnvelopesFromString(const std::string& s) { - const json j = json::parse(s); + const nlohmann::json j = nlohmann::json::parse(s); for (const nlohmann::json& it : j) { Envelope env; std::vector tmpVec; @@ -183,7 +191,7 @@ std::string TransferFunction::serializedToString() const { if (_envelopes.empty()) { return ""; } - json j; + nlohmann::json j; for (auto envIter = _envelopes.begin(); envIter != _envelopes.end(); envIter++) { j[std::distance(_envelopes.begin(), envIter)] = { envIter->jsonEnvelope() }; } @@ -195,11 +203,11 @@ bool TransferFunction::createTexture(ghoul::opengl::Texture& ptr) { return false; } - float* transferFunction = new float[_width * 4]; - std::memset(transferFunction, 0, _width * 4 * sizeof(float)); + float* transferFunction = new float[Width * 4]; + std::memset(transferFunction, 0, Width * 4 * sizeof(float)); - for (int i = 0; i < _width ; i++) { - const float position = static_cast(i) / static_cast(_width); + for (int i = 0; i < Width; i++) { + const float position = static_cast(i) / static_cast(Width); int count = 0; glm::vec4 rgbFromEnvelopes(0.f); float alpha = 0.f; diff --git a/modules/volume/transferfunction.h b/modules/volume/transferfunction.h index 983e55b2ed..93c54b573a 100644 --- a/modules/volume/transferfunction.h +++ b/modules/volume/transferfunction.h @@ -26,10 +26,14 @@ #define __OPENSPACE_MODULE_VOLUME___TRANSFERFUNCTION___H__ #include -#include +#include +#include -namespace ghoul { class Dictionary; } -namespace ghoul::opengl { class Texture; } +namespace ghoul { + namespace opengl { class Texture; } + class Dictionary; +} // namespace ghoul +struct lua_State; namespace openspace::volume { @@ -53,7 +57,6 @@ public: std::string serializedToString() const; private: - int _width = 1024; std::string _loadableFilePath; std::vector _envelopes; }; diff --git a/modules/volume/transferfunctionhandler.cpp b/modules/volume/transferfunctionhandler.cpp index 744b8c7b71..07552b29c6 100644 --- a/modules/volume/transferfunctionhandler.cpp +++ b/modules/volume/transferfunctionhandler.cpp @@ -25,8 +25,8 @@ #include #include -#include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo TransferFunctionInfo = { diff --git a/modules/volume/transferfunctionhandler.h b/modules/volume/transferfunctionhandler.h index 9ff64741c3..a43b8ecf7c 100644 --- a/modules/volume/transferfunctionhandler.h +++ b/modules/volume/transferfunctionhandler.h @@ -30,13 +30,10 @@ #include #include #include +#include #include -#include -namespace openspace { - class Histogram; - class TransferFunction; -} // namespace openspace +namespace ghoul::opengl { class Texture; } namespace openspace::volume { diff --git a/modules/volume/transferfunctionproperty.cpp b/modules/volume/transferfunctionproperty.cpp index 276aee135a..a15236ed20 100644 --- a/modules/volume/transferfunctionproperty.cpp +++ b/modules/volume/transferfunctionproperty.cpp @@ -23,7 +23,9 @@ ****************************************************************************************/ #include -#include + +#include +#include namespace openspace::properties { diff --git a/modules/volume/volumegridtype.cpp b/modules/volume/volumegridtype.cpp index 557c422c89..53667ee65c 100644 --- a/modules/volume/volumegridtype.cpp +++ b/modules/volume/volumegridtype.cpp @@ -24,6 +24,9 @@ #include +#include +#include + namespace openspace::volume { VolumeGridType parseGridType(const std::string& gridType) { @@ -40,8 +43,8 @@ std::string gridTypeToString(VolumeGridType gridType) { switch (gridType) { case VolumeGridType::Cartesian: return "Cartesian"; case VolumeGridType::Spherical: return "Spherical"; + default: return "Unknown"; } - return "Unknown"; } } // namespace openspace::volume diff --git a/modules/volume/volumegridtype.h b/modules/volume/volumegridtype.h index a91f811ab7..df53a4f2aa 100644 --- a/modules/volume/volumegridtype.h +++ b/modules/volume/volumegridtype.h @@ -25,7 +25,6 @@ #ifndef __OPENSPACE_MODULE_VOLUME___VOLUMEGRIDTYPE___H__ #define __OPENSPACE_MODULE_VOLUME___VOLUMEGRIDTYPE___H__ -#include #include namespace openspace::volume { @@ -36,7 +35,7 @@ enum class VolumeGridType : int { }; VolumeGridType parseGridType(const std::string& gridType); -std::string gridTypeToString(VolumeGridType); +std::string gridTypeToString(VolumeGridType gridType); } // namespace openspace::volume diff --git a/modules/volume/volumemodule.cpp b/modules/volume/volumemodule.cpp index 40883dd571..b7a16458e0 100644 --- a/modules/volume/volumemodule.cpp +++ b/modules/volume/volumemodule.cpp @@ -29,9 +29,10 @@ #include #include #include -#include #include +#include #include +#include #include namespace openspace { diff --git a/modules/webbrowser/include/browserclient.h b/modules/webbrowser/include/browserclient.h index eb256bc185..3bec38fa83 100644 --- a/modules/webbrowser/include/browserclient.h +++ b/modules/webbrowser/include/browserclient.h @@ -38,8 +38,8 @@ namespace openspace { -class WebRenderHandler; class WebKeyboardHandler; +class WebRenderHandler; class BrowserClient : public CefClient { public: diff --git a/modules/webbrowser/include/browserinstance.h b/modules/webbrowser/include/browserinstance.h index c5a8ae5688..5cb79c78fd 100644 --- a/modules/webbrowser/include/browserinstance.h +++ b/modules/webbrowser/include/browserinstance.h @@ -25,6 +25,9 @@ #ifndef __OPENSPACE_MODULE_WEBBROWSER__BROWSER_INSTANCE_H__ #define __OPENSPACE_MODULE_WEBBROWSER__BROWSER_INSTANCE_H__ +#include +#include + #ifdef _MSC_VER #pragma warning (push) #pragma warning (disable : 4100) @@ -45,14 +48,11 @@ #pragma warning (pop) #endif // _MSC_VER -#include -#include - namespace openspace { class BrowserClient; -class WebRenderHandler; class WebKeyboardHandler; +class WebRenderHandler; class BrowserInstance { public: diff --git a/modules/webbrowser/include/cefhost.h b/modules/webbrowser/include/cefhost.h index 02560847bf..53fadadf95 100644 --- a/modules/webbrowser/include/cefhost.h +++ b/modules/webbrowser/include/cefhost.h @@ -25,22 +25,8 @@ #ifndef __OPENSPACE_MODULE_WEBBROWSER___CEF_HOST___H__ #define __OPENSPACE_MODULE_WEBBROWSER___CEF_HOST___H__ -#ifdef WIN32 -#pragma warning(push) -#pragma warning(disable : 4100) -#endif // WIN32 - -#include - -#ifdef WIN32 -#pragma warning(pop) -#endif // WIN32 #include -struct CefSettingsTraits; -template class CefStructBase; -using CefSettings = CefStructBase; - namespace openspace { class CefHost { diff --git a/modules/webbrowser/include/defaultbrowserlauncher.h b/modules/webbrowser/include/defaultbrowserlauncher.h index dfd99c47b7..6c14cb2adb 100644 --- a/modules/webbrowser/include/defaultbrowserlauncher.h +++ b/modules/webbrowser/include/defaultbrowserlauncher.h @@ -41,18 +41,12 @@ namespace openspace { class DefaultBrowserLauncher : public CefLifeSpanHandler, public CefRequestHandler { public: - bool OnBeforePopup(CefRefPtr browser, - CefRefPtr frame, - const CefString& targetUrl, - const CefString& targetFrameName, - CefLifeSpanHandler::WindowOpenDisposition targetDisposition, - bool userGesture, - const CefPopupFeatures& popupFeatures, - CefWindowInfo& windowInfo, - CefRefPtr& client, - CefBrowserSettings& settings, - CefRefPtr& extra_info, - bool* noJavascriptAccess) override; + bool OnBeforePopup(CefRefPtr browser, CefRefPtr frame, + const CefString& targetUrl, const CefString& targetFrameName, + CefLifeSpanHandler::WindowOpenDisposition targetDisposition, bool userGesture, + const CefPopupFeatures& popupFeatures, CefWindowInfo& windowInfo, + CefRefPtr& client, CefBrowserSettings& settings, + CefRefPtr& extra_info, bool* noJavascriptAccess) override; //bool OnOpenURLFromTab(CefRefPtr browser, CefRefPtr frame, // const CefString& target_url, diff --git a/modules/webbrowser/include/screenspacebrowser.h b/modules/webbrowser/include/screenspacebrowser.h index 4bdd1c9b45..21573357f6 100644 --- a/modules/webbrowser/include/screenspacebrowser.h +++ b/modules/webbrowser/include/screenspacebrowser.h @@ -27,10 +27,12 @@ #include +#include #include #include #include #include +#include #ifdef _MSC_VER #pragma warning (push) @@ -58,7 +60,6 @@ namespace openspace { class BrowserInstance; class ScreenSpaceRenderHandler; -class WebKeyboardHandler; class ScreenSpaceBrowser : public ScreenSpaceRenderable { public: @@ -101,6 +102,7 @@ private: bool _useAcceleratedRendering = false; bool _isUrlDirty = false; }; + } // namespace openspace #endif // __OPENSPACE_MODULE_WEBBROWSER___SCREEN_SPACE_BROWSER___H__ diff --git a/modules/webbrowser/include/webkeyboardhandler.h b/modules/webbrowser/include/webkeyboardhandler.h index 993eb81656..3d11ec3221 100644 --- a/modules/webbrowser/include/webkeyboardhandler.h +++ b/modules/webbrowser/include/webkeyboardhandler.h @@ -30,7 +30,6 @@ #pragma warning (disable : 4100) #endif // _MSC_VER - #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-parameter" diff --git a/modules/webbrowser/include/webrenderhandler.h b/modules/webbrowser/include/webrenderhandler.h index df4805353d..c81f4e8175 100644 --- a/modules/webbrowser/include/webrenderhandler.h +++ b/modules/webbrowser/include/webrenderhandler.h @@ -25,8 +25,9 @@ #ifndef __OPENSPACE_MODULE_WEBBROWSER__WEB_RENDER_HANDLER_H #define __OPENSPACE_MODULE_WEBBROWSER__WEB_RENDER_HANDLER_H -#include #include +#include +#include #ifdef _MSC_VER #pragma warning (push) @@ -37,7 +38,6 @@ #endif // _MSC_VER #include -#include #ifdef _MSC_VER #pragma warning (pop) @@ -45,8 +45,6 @@ //#pragma clang diagnostic pop #endif // _MSC_VER -#include - namespace openspace { class WebRenderHandler : public CefRenderHandler { @@ -55,12 +53,12 @@ public: WebRenderHandler(); - virtual void draw(void) = 0; + virtual void draw() = 0; virtual void render() = 0; void reshape(int, int); - void GetViewRect(CefRefPtr browser, CefRect &rect) override; + void GetViewRect(CefRefPtr browser, CefRect& rect) override; // Regular OnPaint method. Uses CPU allocation void OnPaint(CefRefPtr browser, PaintElementType type, @@ -90,9 +88,7 @@ private: glm::ivec2 _windowSize = glm::ivec2(0); glm::ivec2 _browserBufferSize = glm::ivec2(0); - /** - * RGBA buffer from browser - */ + /// RGBA buffer from browser std::vector _browserBuffer; bool _needsRepaint = true; bool _textureSizeIsDirty = true; diff --git a/modules/webbrowser/src/browserinstance.cpp b/modules/webbrowser/src/browserinstance.cpp index 56424c148e..3d7beec96f 100644 --- a/modules/webbrowser/src/browserinstance.cpp +++ b/modules/webbrowser/src/browserinstance.cpp @@ -30,13 +30,15 @@ #include #include #include -#include #include #include #include #include #include +#include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "CEF BrowserInstance"; diff --git a/modules/webbrowser/src/cefhost.cpp b/modules/webbrowser/src/cefhost.cpp index d81e993c6e..597b555d1f 100644 --- a/modules/webbrowser/src/cefhost.cpp +++ b/modules/webbrowser/src/cefhost.cpp @@ -25,15 +25,33 @@ #include #include -#include +#include #include +#include #include -#include +#include +#include +#include #ifdef __APPLE__ #include #endif // __APPLE__ +#ifdef WIN32 +#pragma warning(push) +#pragma warning(disable : 4100) +#endif // WIN32 + +#include + +#ifdef WIN32 +#pragma warning(pop) +#endif // WIN32 + +struct CefSettingsTraits; +template class CefStructBase; +using CefSettings = CefStructBase; + namespace { constexpr std::string_view _loggerCat = "CefHost"; } // namespace diff --git a/modules/webbrowser/src/eventhandler.cpp b/modules/webbrowser/src/eventhandler.cpp index b92e7934c8..8c6b6a759d 100644 --- a/modules/webbrowser/src/eventhandler.cpp +++ b/modules/webbrowser/src/eventhandler.cpp @@ -33,6 +33,17 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include + +#ifdef WIN32 +#include +#endif // WIN32 namespace { constexpr std::string_view _loggerCat = "WebBrowser:EventHandler"; diff --git a/modules/webbrowser/src/screenspacebrowser.cpp b/modules/webbrowser/src/screenspacebrowser.cpp index dffa1acf6a..bf080cb549 100644 --- a/modules/webbrowser/src/screenspacebrowser.cpp +++ b/modules/webbrowser/src/screenspacebrowser.cpp @@ -27,12 +27,12 @@ #include #include #include -#include +#include #include #include -#include +#include #include -#include +#include #include namespace { diff --git a/modules/webbrowser/src/webrenderhandler.cpp b/modules/webbrowser/src/webrenderhandler.cpp index 5af5e4d656..ec16da1950 100644 --- a/modules/webbrowser/src/webrenderhandler.cpp +++ b/modules/webbrowser/src/webrenderhandler.cpp @@ -23,9 +23,12 @@ ****************************************************************************************/ #include + #include +#include #include -#include +#include +#include namespace openspace { diff --git a/modules/webbrowser/webbrowsermodule.cpp b/modules/webbrowser/webbrowsermodule.cpp index 0e507c3284..8dacf096c8 100644 --- a/modules/webbrowser/webbrowsermodule.cpp +++ b/modules/webbrowser/webbrowsermodule.cpp @@ -29,17 +29,19 @@ #include #include #include -#include #include -#include +#include #include -#include #include +#include #include +#include #include #include +#include #include -#include +#include +#include namespace { constexpr std::string_view _loggerCat = "WebBrowser"; diff --git a/modules/webbrowser/webbrowsermodule.h b/modules/webbrowser/webbrowsermodule.h index 342a50fcfa..40a58092d3 100644 --- a/modules/webbrowser/webbrowsermodule.h +++ b/modules/webbrowser/webbrowsermodule.h @@ -31,6 +31,7 @@ #include #include #include +#include namespace openspace { @@ -38,13 +39,6 @@ class BrowserInstance; class CefHost; class EventHandler; -namespace webbrowser { - extern std::chrono::microseconds interval; - extern std::chrono::time_point latestCall; - extern CefHost* cefHost; - void update(); -} // namespace webbrowser - class WebBrowserModule : public OpenSpaceModule { public: static constexpr const char* Name = "WebBrowser"; @@ -79,6 +73,13 @@ private: static inline bool _disableAcceleratedRendering = false; }; +namespace webbrowser { + extern std::chrono::microseconds interval; + extern std::chrono::time_point latestCall; + extern CefHost* cefHost; + void update(); +} // namespace webbrowser + } // namespace openspace #endif // __OPENSPACE_MODULE_WEBBROWSER___WEBBROWSERMODULE___H__ diff --git a/modules/webgui/webguimodule.cpp b/modules/webgui/webguimodule.cpp index 4ca1e6ad69..7004a3c5c3 100644 --- a/modules/webgui/webguimodule.cpp +++ b/modules/webgui/webguimodule.cpp @@ -24,17 +24,19 @@ #include +#include #include #include -#include #include #include #include #include #include #include +#include #include #include +#include #include #include diff --git a/modules/webgui/webguimodule.h b/modules/webgui/webguimodule.h index b7aae7690a..1f4cc3e882 100644 --- a/modules/webgui/webguimodule.h +++ b/modules/webgui/webguimodule.h @@ -32,8 +32,11 @@ #include #include #include +#include #include +#include #include +#include #include namespace openspace { diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0687a2d792..c1a1e715a4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -85,6 +85,7 @@ set(OPENSPACE_SOURCE navigation/pathnavigator.cpp navigation/pathnavigator_lua.inl navigation/waypoint.cpp + network/messagestructures.cpp network/messagestructureshelper.cpp network/parallelconnection.cpp network/parallelpeer.cpp @@ -132,6 +133,7 @@ set(OPENSPACE_SOURCE rendering/dashboarditem.cpp rendering/dashboardtextitem.cpp rendering/framebufferrenderer.cpp + rendering/deferredcaster.cpp rendering/deferredcastermanager.cpp rendering/fadeable.cpp rendering/helper.cpp @@ -190,6 +192,7 @@ set(OPENSPACE_SOURCE util/sphere.cpp util/spicemanager.cpp util/spicemanager_lua.inl + util/syncable.cpp util/syncbuffer.cpp util/tstring.cpp util/histogram.cpp diff --git a/src/camera/camera.cpp b/src/camera/camera.cpp index 538b2d55d2..6126a2f56b 100644 --- a/src/camera/camera.cpp +++ b/src/camera/camera.cpp @@ -25,6 +25,9 @@ #include #include +#include +#include +#include namespace openspace { diff --git a/src/data/csvloader.cpp b/src/data/csvloader.cpp index 76a766aafa..f5b35792ed 100644 --- a/src/data/csvloader.cpp +++ b/src/data/csvloader.cpp @@ -26,9 +26,6 @@ #include #include -#include -#include -#include #include #include #include @@ -36,12 +33,15 @@ #include #include #include +#include #include -#include +#include #include #include #include +#include #include +#include namespace { constexpr std::string_view _loggerCat = "DataLoader: CSV"; diff --git a/src/data/dataloader.cpp b/src/data/dataloader.cpp index 2d1592a00c..e0858def55 100644 --- a/src/data/dataloader.cpp +++ b/src/data/dataloader.cpp @@ -32,10 +32,23 @@ #include #include #include +#include #include +#include +#include +#include +#include +#include +#include #include #include +#include +#include +#include #include +#include +#include +#include namespace { constexpr int8_t DataCacheFileVersion = 13; diff --git a/src/data/datamapping.cpp b/src/data/datamapping.cpp index 12e80728c0..9747ec41eb 100644 --- a/src/data/datamapping.cpp +++ b/src/data/datamapping.cpp @@ -25,11 +25,14 @@ #include #include +#include #include #include #include +#include +#include #include -#include +#include namespace { constexpr std::string_view _loggerCat = "RenderablePolygonCloud"; @@ -38,9 +41,7 @@ namespace { constexpr std::string_view DefaultY = "y"; constexpr std::string_view DefaultZ = "z"; - enum class PositionColumn { - X, Y, Z - }; + enum class PositionColumn { X, Y, Z }; bool checkPosColumnInternal(PositionColumn columnCase, const std::string& c, const std::optional& mapping, diff --git a/src/data/speckloader.cpp b/src/data/speckloader.cpp index f25516fd1e..07fdc06b60 100644 --- a/src/data/speckloader.cpp +++ b/src/data/speckloader.cpp @@ -24,14 +24,24 @@ #include +#include #include #include #include +#include #include +#include #include +#include +#include #include +#include +#include #include +#include #include +#include +#include namespace { bool startsWith(std::string lhs, std::string_view rhs) noexcept { diff --git a/src/documentation/core_registration.cpp b/src/documentation/core_registration.cpp index 24ba1ec1f6..0fc4c019e0 100644 --- a/src/documentation/core_registration.cpp +++ b/src/documentation/core_registration.cpp @@ -38,7 +38,9 @@ #include #include #include +#include #include +#include #include #include #include diff --git a/src/documentation/documentation.cpp b/src/documentation/documentation.cpp index 6ab68fb776..59f21e5626 100644 --- a/src/documentation/documentation.cpp +++ b/src/documentation/documentation.cpp @@ -25,12 +25,16 @@ #include #include +#include #include +#include #include #include #include +#include #include #include +#include namespace { diff --git a/src/documentation/documentationengine.cpp b/src/documentation/documentationengine.cpp index 7c1edcd2ed..fde4b5c1e3 100644 --- a/src/documentation/documentationengine.cpp +++ b/src/documentation/documentationengine.cpp @@ -25,29 +25,48 @@ #include #include +#include #include #include #include #include +#include #include #include #include #include #include +#include +#include #include #include #include +#include #include +#include #include #include #include +#include #include #include #include #include #include +#include +#include +#include +#include +#include #include #include +#include +#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "DocumentationEngine"; diff --git a/src/documentation/verifier.cpp b/src/documentation/verifier.cpp index 3de9213361..e7e04b0cd1 100644 --- a/src/documentation/verifier.cpp +++ b/src/documentation/verifier.cpp @@ -24,8 +24,26 @@ #include +#include #include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace openspace::documentation { @@ -136,7 +154,7 @@ TestResult IntVerifier::operator()(const ghoul::Dictionary& dict, // If we have a double value, we need to check if it is integer const double value = dict.value(key); double intPart = 0.0; - const bool isInt = modf(value, &intPart) == 0.0; + const bool isInt = std::modf(value, &intPart) == 0.0; if (isInt) { TestResult res; res.success = true; diff --git a/src/engine/configuration.cpp b/src/engine/configuration.cpp index 98165633c9..ac4513befe 100644 --- a/src/engine/configuration.cpp +++ b/src/engine/configuration.cpp @@ -25,27 +25,26 @@ #include #include +#include #include #include #include +#include #include -#include #include #include +#include #include #include #include #include -#include +#include #include -#include #include #include #include -#include #include #include -#include namespace { // We can't use ${SCRIPTS} here as that hasn't been defined by this point diff --git a/src/engine/downloadmanager.cpp b/src/engine/downloadmanager.cpp index 4674cbf760..f73bcf2db2 100644 --- a/src/engine/downloadmanager.cpp +++ b/src/engine/downloadmanager.cpp @@ -27,13 +27,20 @@ #include #include #include +#include #include #include #include +#include #include +#include +#include #include +#include #include +#include #include +#include namespace { constexpr std::string_view _loggerCat = "DownloadManager"; diff --git a/src/engine/globals.cpp b/src/engine/globals.cpp index c8407caab1..f9c050a284 100644 --- a/src/engine/globals.cpp +++ b/src/engine/globals.cpp @@ -58,8 +58,9 @@ #include #include #include +#include #include -#include +#include #include #include diff --git a/src/engine/globalscallbacks.cpp b/src/engine/globalscallbacks.cpp index bbe0a8df53..2a41a8d9aa 100644 --- a/src/engine/globalscallbacks.cpp +++ b/src/engine/globalscallbacks.cpp @@ -27,6 +27,7 @@ #include #include #include +#include namespace openspace::global::callback { diff --git a/src/engine/logfactory.cpp b/src/engine/logfactory.cpp index 4cf4494b0d..c02fa0ba58 100644 --- a/src/engine/logfactory.cpp +++ b/src/engine/logfactory.cpp @@ -26,11 +26,15 @@ #include #include +#include #include #include #include +#include #include +#include #include +#include namespace { constexpr std::string_view BootstrapPath = "${WEB}/common/bootstrap.min.css"; diff --git a/src/engine/moduleengine.cpp b/src/engine/moduleengine.cpp index c943382198..e7e3112b76 100644 --- a/src/engine/moduleengine.cpp +++ b/src/engine/moduleengine.cpp @@ -28,9 +28,16 @@ #include #include #include +#include #include -#include +#include +#include +#include #include +#include +#include +#include +#include #include "moduleengine_lua.inl" diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index 1b708175ec..fa9afb165c 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -27,9 +27,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -37,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -45,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -55,37 +59,64 @@ #include #include #include +#include #include #include #include +#include #include +#include +#include #include #include #include +#include #include -#include #include #include #include +#include +#include #include #include +#include +#include +#include +#include +#include #include #include #include #include #include +#include #include #include #include #include #include +#include +#include +#include #include #include #include +#include +#include +#include +#include #include +#include #include +#include #include #include +#include +#include +#include +#include +#include +#include #ifdef WIN32 #include diff --git a/src/engine/openspaceengine_lua.inl b/src/engine/openspaceengine_lua.inl index 5d880c6dd5..57ecfd78b4 100644 --- a/src/engine/openspaceengine_lua.inl +++ b/src/engine/openspaceengine_lua.inl @@ -24,25 +24,18 @@ #include #include -#include -#include #include -#include -#include -#include #include #include -#include -#include #include #include -#include #include #include #include #include #include -#include +#include +#include namespace { diff --git a/src/engine/settings.cpp b/src/engine/settings.cpp index 6aeeb00c37..6cb98eff25 100644 --- a/src/engine/settings.cpp +++ b/src/engine/settings.cpp @@ -25,6 +25,8 @@ #include #include +#include +#include #include namespace openspace { diff --git a/src/engine/syncengine.cpp b/src/engine/syncengine.cpp index 7ae604c202..a733de2d1b 100644 --- a/src/engine/syncengine.cpp +++ b/src/engine/syncengine.cpp @@ -28,6 +28,7 @@ #include #include #include +#include namespace openspace { diff --git a/src/events/event.cpp b/src/events/event.cpp index 52f43fca94..21b67eb607 100644 --- a/src/events/event.cpp +++ b/src/events/event.cpp @@ -26,14 +26,16 @@ #include #include -#include #include #include #include #include -#include #include -#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "EventInfo"; diff --git a/src/events/eventengine.cpp b/src/events/eventengine.cpp index 2a309fdf2b..360b4e3f6f 100644 --- a/src/events/eventengine.cpp +++ b/src/events/eventengine.cpp @@ -26,7 +26,14 @@ #include #include +#include +#include #include +#include +#include +#include +#include +#include #include "eventengine_lua.inl" diff --git a/src/events/eventengine_lua.inl b/src/events/eventengine_lua.inl index 2a42914ae0..9b9e549721 100644 --- a/src/events/eventengine_lua.inl +++ b/src/events/eventengine_lua.inl @@ -22,7 +22,11 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include +#include +#include +#include +#include +#include namespace { diff --git a/src/interaction/actionmanager.cpp b/src/interaction/actionmanager.cpp index 0a38a410fb..bba59dfbec 100644 --- a/src/interaction/actionmanager.cpp +++ b/src/interaction/actionmanager.cpp @@ -24,15 +24,22 @@ #include +#include #include #include #include +#include #include #include +#include #include +#include #include +#include #include -#include +#include +#include +#include #include "actionmanager_lua.inl" diff --git a/src/interaction/actionmanager_lua.inl b/src/interaction/actionmanager_lua.inl index 782cabbc21..4bf5a68e9a 100644 --- a/src/interaction/actionmanager_lua.inl +++ b/src/interaction/actionmanager_lua.inl @@ -22,8 +22,10 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include +#include #include +#include +#include namespace { diff --git a/src/interaction/joystickcamerastates.cpp b/src/interaction/joystickcamerastates.cpp index dd1c6a5bdd..c0a34b42e1 100644 --- a/src/interaction/joystickcamerastates.cpp +++ b/src/interaction/joystickcamerastates.cpp @@ -29,7 +29,8 @@ #include #include #include -#include +#include +#include #include namespace { diff --git a/src/interaction/keybindingmanager.cpp b/src/interaction/keybindingmanager.cpp index b437c5d82f..dd3e12a4f0 100644 --- a/src/interaction/keybindingmanager.cpp +++ b/src/interaction/keybindingmanager.cpp @@ -28,6 +28,9 @@ #include #include #include +#include +#include +#include #include "keybindingmanager_lua.inl" diff --git a/src/interaction/keybindingmanager_lua.inl b/src/interaction/keybindingmanager_lua.inl index 77deee3321..c4b0a32589 100644 --- a/src/interaction/keybindingmanager_lua.inl +++ b/src/interaction/keybindingmanager_lua.inl @@ -22,7 +22,14 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include #include +#include +#include +#include +#include +#include +#include namespace { diff --git a/src/interaction/keyframerecordinghandler.cpp b/src/interaction/keyframerecordinghandler.cpp index 9ef0d345a9..e38b87b314 100644 --- a/src/interaction/keyframerecordinghandler.cpp +++ b/src/interaction/keyframerecordinghandler.cpp @@ -24,9 +24,25 @@ #include +#include +#include #include +#include +#include #include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "keyframerecordinghandler_lua.inl" diff --git a/src/interaction/keyframerecordinghandler_lua.inl b/src/interaction/keyframerecordinghandler_lua.inl index ee8207d581..a06385a22a 100644 --- a/src/interaction/keyframerecordinghandler_lua.inl +++ b/src/interaction/keyframerecordinghandler_lua.inl @@ -23,8 +23,8 @@ ****************************************************************************************/ #include -#include #include +#include namespace { diff --git a/src/interaction/mousecamerastates.cpp b/src/interaction/mousecamerastates.cpp index 8f8e0ffa1e..86e9338735 100644 --- a/src/interaction/mousecamerastates.cpp +++ b/src/interaction/mousecamerastates.cpp @@ -26,6 +26,10 @@ #include #include +#include +#include +#include +#include namespace { constexpr double SensitivityAdjustmentIncrease = 8.0; diff --git a/src/interaction/sessionrecording.cpp b/src/interaction/sessionrecording.cpp index 9edd16aefe..96c3181c25 100644 --- a/src/interaction/sessionrecording.cpp +++ b/src/interaction/sessionrecording.cpp @@ -26,9 +26,24 @@ #include #include +#include +#include +#include +#include #include -#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include namespace { template struct overloaded : Ts... { using Ts::operator()...; }; diff --git a/src/interaction/sessionrecordinghandler.cpp b/src/interaction/sessionrecordinghandler.cpp index 4f6e9c7a5c..0141639b65 100644 --- a/src/interaction/sessionrecordinghandler.cpp +++ b/src/interaction/sessionrecordinghandler.cpp @@ -28,19 +28,44 @@ #include #include #include +#include #include +#include +#include #include +#include #include +#include +#include #include #include #include #include #include +#include #include +#include #include #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #ifdef WIN32 #include diff --git a/src/interaction/sessionrecordinghandler_lua.inl b/src/interaction/sessionrecordinghandler_lua.inl index 43a770e2da..518aac5780 100644 --- a/src/interaction/sessionrecordinghandler_lua.inl +++ b/src/interaction/sessionrecordinghandler_lua.inl @@ -22,7 +22,13 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include #include +#include +#include +#include +#include +#include namespace { diff --git a/src/interaction/tasks/convertrecformattask.cpp b/src/interaction/tasks/convertrecformattask.cpp index 60dc0130a0..bc1de89f7f 100644 --- a/src/interaction/tasks/convertrecformattask.cpp +++ b/src/interaction/tasks/convertrecformattask.cpp @@ -23,16 +23,13 @@ ****************************************************************************************/ #include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "ConvertRecFormatTask"; diff --git a/src/interaction/websocketcamerastates.cpp b/src/interaction/websocketcamerastates.cpp index a0c679120f..a1afdc4dbd 100644 --- a/src/interaction/websocketcamerastates.cpp +++ b/src/interaction/websocketcamerastates.cpp @@ -24,6 +24,7 @@ #include +#include #include #include diff --git a/src/mission/mission.cpp b/src/mission/mission.cpp index 307030c2da..a399bf86e5 100644 --- a/src/mission/mission.cpp +++ b/src/mission/mission.cpp @@ -24,13 +24,22 @@ #include - #include +#include #include #include #include +#include +#include +#include +#include +#include #include #include +#include #include +#include +#include +#include namespace { struct [[codegen::Dictionary(MissionPhase)]] Parameters { diff --git a/src/mission/missionmanager.cpp b/src/mission/missionmanager.cpp index d107441528..280227f410 100644 --- a/src/mission/missionmanager.cpp +++ b/src/mission/missionmanager.cpp @@ -24,9 +24,14 @@ #include +#include #include #include +#include +#include #include +#include +#include #include "missionmanager_lua.inl" diff --git a/src/mission/missionmanager_lua.inl b/src/mission/missionmanager_lua.inl index 870682e302..7615ffbf37 100644 --- a/src/mission/missionmanager_lua.inl +++ b/src/mission/missionmanager_lua.inl @@ -22,8 +22,10 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include #include +#include +#include +#include // Load mission phases from file. [[codegen::luawrap]] void loadMission(ghoul::Dictionary mission) { diff --git a/src/navigation/keyframenavigator.cpp b/src/navigation/keyframenavigator.cpp index 86a2e2e796..ab96db4cb9 100644 --- a/src/navigation/keyframenavigator.cpp +++ b/src/navigation/keyframenavigator.cpp @@ -27,10 +27,14 @@ #include #include #include +#include #include #include #include #include +#include +#include +#include namespace openspace::interaction { diff --git a/src/navigation/navigationhandler.cpp b/src/navigation/navigationhandler.cpp index 5c898bc5f9..bd25feb15a 100644 --- a/src/navigation/navigationhandler.cpp +++ b/src/navigation/navigationhandler.cpp @@ -31,8 +31,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -40,14 +40,27 @@ #include #include #include +#include #include #include #include -#include +#include +#include +#include +#include #include +#include #include #include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "navigationhandler_lua.inl" diff --git a/src/navigation/navigationhandler_lua.inl b/src/navigation/navigationhandler_lua.inl index 9e2582b051..9b88cacf7e 100644 --- a/src/navigation/navigationhandler_lua.inl +++ b/src/navigation/navigationhandler_lua.inl @@ -22,8 +22,25 @@ * 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 +#include +#include namespace { @@ -603,7 +620,7 @@ struct [[codegen::Dictionary(JoystickAxis)]] JoystickAxis { try { global::navigationHandler->orbitalNavigator().triggerIdleBehavior(choice); } - catch (ghoul::RuntimeError& e) { + catch (const ghoul::RuntimeError& e) { throw ghoul::lua::LuaError(e.message); } } @@ -626,8 +643,8 @@ struct [[codegen::Dictionary(JoystickAxis)]] JoystickAxis { [[codegen::luawrap]] double distanceToFocus() { using namespace openspace; - const SceneGraphNode * focus = global::navigationHandler->anchorNode(); - Camera * camera = global::navigationHandler->camera(); + const SceneGraphNode* focus = global::navigationHandler->anchorNode(); + Camera* camera = global::navigationHandler->camera(); return glm::distance(camera->positionVec3(), focus->worldPosition()); } diff --git a/src/navigation/navigationstate.cpp b/src/navigation/navigationstate.cpp index d29b369783..aca960fd2d 100644 --- a/src/navigation/navigationstate.cpp +++ b/src/navigation/navigationstate.cpp @@ -25,10 +25,16 @@ #include #include -#include +#include #include #include #include +#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "NavigationState"; diff --git a/src/navigation/orbitalnavigator.cpp b/src/navigation/orbitalnavigator.cpp index bc4a6457b3..a042ac9515 100644 --- a/src/navigation/orbitalnavigator.cpp +++ b/src/navigation/orbitalnavigator.cpp @@ -24,22 +24,34 @@ #include +#include #include #include #include +#include #include #include -#include +#include +#include +#include +#include #include +#include +#include #include #include #include #include #include +#include #include -#include +#include #include +#include #include +#include +#include +#include #include #include "orbitalnavigator_lua.inl" diff --git a/src/navigation/orbitalnavigator_lua.inl b/src/navigation/orbitalnavigator_lua.inl index 69acf26899..f866bbd231 100644 --- a/src/navigation/orbitalnavigator_lua.inl +++ b/src/navigation/orbitalnavigator_lua.inl @@ -22,6 +22,9 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include +#include + namespace { /** diff --git a/src/navigation/path.cpp b/src/navigation/path.cpp index d93a765b45..d30d7d09ee 100644 --- a/src/navigation/path.cpp +++ b/src/navigation/path.cpp @@ -25,18 +25,34 @@ #include #include +#include #include #include -#include +#include #include #include #include +#include +#include #include #include #include #include #include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "Path"; diff --git a/src/navigation/pathcurve.cpp b/src/navigation/pathcurve.cpp index d0b97d7b76..385194ba99 100644 --- a/src/navigation/pathcurve.cpp +++ b/src/navigation/pathcurve.cpp @@ -27,7 +27,14 @@ #include #include #include +#include +#include #include +#include +#include +#include +#include +#include #include namespace { diff --git a/src/navigation/pathcurves/avoidcollisioncurve.cpp b/src/navigation/pathcurves/avoidcollisioncurve.cpp index f0eeb58512..4791706f30 100644 --- a/src/navigation/pathcurves/avoidcollisioncurve.cpp +++ b/src/navigation/pathcurves/avoidcollisioncurve.cpp @@ -26,13 +26,18 @@ #include #include +#include #include #include #include #include +#include #include #include #include +#include +#include +#include #include namespace { @@ -73,7 +78,7 @@ AvoidCollisionCurve::AvoidCollisionCurve(const Waypoint& start, const Waypoint& // Note that the factor 2.0 is arbitrarily chosen to look ok. // @TODO: (2022-02-27, emmbr) Should be unified to a "getting close to object sphere" // that can be used in multiple cases when creating paths more cleverly later on - const double closeToNodeThresholdFactor = glm::max( + const double closeToNodeThresholdFactor = std::max( CloseToNodeThresholdRadiusMultiplier, 2.0 * global::navigationHandler->pathNavigator().arrivalDistanceFactor() ); diff --git a/src/navigation/pathcurves/zoomoutoverviewcurve.cpp b/src/navigation/pathcurves/zoomoutoverviewcurve.cpp index 0a9dbbbcd4..4e7d698098 100644 --- a/src/navigation/pathcurves/zoomoutoverviewcurve.cpp +++ b/src/navigation/pathcurves/zoomoutoverviewcurve.cpp @@ -26,9 +26,10 @@ #include #include +#include #include #include -#include +#include #include namespace { diff --git a/src/navigation/pathnavigator.cpp b/src/navigation/pathnavigator.cpp index 1ed2ce0d0f..70ea2cf382 100644 --- a/src/navigation/pathnavigator.cpp +++ b/src/navigation/pathnavigator.cpp @@ -26,10 +26,13 @@ #include #include +#include #include #include +#include #include #include +#include #include #include #include @@ -39,7 +42,10 @@ #include #include #include -#include +#include +#include +#include +#include #include "pathnavigator_lua.inl" diff --git a/src/navigation/pathnavigator_lua.inl b/src/navigation/pathnavigator_lua.inl index b931699967..17c9a3beb1 100644 --- a/src/navigation/pathnavigator_lua.inl +++ b/src/navigation/pathnavigator_lua.inl @@ -22,7 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include +#include namespace { diff --git a/src/navigation/waypoint.cpp b/src/navigation/waypoint.cpp index 297cd39044..a4ac50a6e8 100644 --- a/src/navigation/waypoint.cpp +++ b/src/navigation/waypoint.cpp @@ -31,13 +31,74 @@ #include #include #include +#include #include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "Waypoint"; constexpr float LengthEpsilon = 1e-5f; constexpr const char* SunIdentifier = "Sun"; + + // Compute a target position close to the specified target node, using knowledge of + // the start point and a desired distance from the node's center + glm::dvec3 computeGoodStepDirection(const openspace::SceneGraphNode* targetNode, + const openspace::interaction::Waypoint& startPoint) + { + using namespace openspace; + using namespace openspace::interaction; + + const glm::dvec3 nodePos = targetNode->worldPosition(); + const SceneGraphNode* sun = sceneGraphNode(SunIdentifier); + const SceneGraphNode* closeNode = PathNavigator::findNodeNearTarget(targetNode); + + // @TODO (2021-07-09, emmbr): Not nice to depend on a specific scene graph node, + // as it might not exist. Ideally, each SGN could know about their preferred + // direction to be viewed from (their "good side"), and then that could be queried + // and used instead. + if (closeNode) { + // If the node is close to another node in the scene, set the direction in a + // way that minimizes risk of collision + return glm::normalize(nodePos - closeNode->worldPosition()); + } + else if (!sun) { + // Can't compute position from Sun position, so just use any direction + return glm::dvec3(0.0, 0.0, 1.0); + } + else if (targetNode->identifier() == SunIdentifier) { + // Special case for when the target is the Sun, in which we want to avoid a + // zero vector. The Z axis is chosen to provide an overview of the solar + // system, and not stay in the orbital plane + return glm::dvec3(0.0, 0.0, 1.0); + } + else { + // Go to a point that is lit by the Sun, slightly offsett from sun direction + const glm::dvec3 sunPos = sun->worldPosition(); + + const glm::dvec3 prevPos = startPoint.position(); + const glm::dvec3 targetToPrev = prevPos - nodePos; + const glm::dvec3 targetToSun = sunPos - nodePos; + + // Check against zero vectors, as this will lead to nan-values from the + // cross product + if (glm::length(targetToSun) < LengthEpsilon || + glm::length(targetToPrev) < LengthEpsilon) + { + // Same situation as if sun does not exist. Any direction will do + return glm::dvec3(0.0, 0.0, 1.0); + } + + constexpr float defaultPositionOffsetAngle = -30.f; // degrees + constexpr float angle = glm::radians(defaultPositionOffsetAngle); + const glm::dvec3 axis = glm::normalize(glm::cross(targetToPrev, targetToSun)); + const glm::dquat offsetRotation = angleAxis(static_cast(angle), axis); + + return glm::normalize(offsetRotation * targetToSun); + } + } } // namespace namespace openspace::interaction { @@ -117,59 +178,6 @@ Waypoint waypointFromCamera() { return Waypoint{ pos, rot, node }; } -// Compute a target position close to the specified target node, using knowledge of -// the start point and a desired distance from the node's center -glm::dvec3 computeGoodStepDirection(const SceneGraphNode* targetNode, - const Waypoint& startPoint) -{ - const glm::dvec3 nodePos = targetNode->worldPosition(); - const SceneGraphNode* sun = sceneGraphNode(SunIdentifier); - const SceneGraphNode* closeNode = PathNavigator::findNodeNearTarget(targetNode); - - // @TODO (2021-07-09, emmbr): Not nice to depend on a specific scene graph node, - // as it might not exist. Ideally, each SGN could know about their preferred - // direction to be viewed from (their "good side"), and then that could be queried - // and used instead. - if (closeNode) { - // If the node is close to another node in the scene, set the direction in a way - // that minimizes risk of collision - return glm::normalize(nodePos - closeNode->worldPosition()); - } - else if (!sun) { - // Can't compute position from Sun position, so just use any direction. Z will do - return glm::dvec3(0.0, 0.0, 1.0); - } - else if (targetNode->identifier() == SunIdentifier) { - // Special case for when the target is the Sun, in which we want to avoid a zero - // vector. The Z axis is chosen to provide an overview of the solar system, and - // not stay in the orbital plane - return glm::dvec3(0.0, 0.0, 1.0); - } - else { - // Go to a point that is lit up by the sun, slightly offsetted from sun direction - const glm::dvec3 sunPos = sun->worldPosition(); - - const glm::dvec3 prevPos = startPoint.position(); - const glm::dvec3 targetToPrev = prevPos - nodePos; - const glm::dvec3 targetToSun = sunPos - nodePos; - - // Check against zero vectors, as this will lead to nan-values from cross product - if (glm::length(targetToSun) < LengthEpsilon || - glm::length(targetToPrev) < LengthEpsilon) - { - // Same situation as if sun does not exist. Any direction will do - return glm::dvec3(0.0, 0.0, 1.0); - } - - constexpr float defaultPositionOffsetAngle = -30.f; // degrees - constexpr float angle = glm::radians(defaultPositionOffsetAngle); - const glm::dvec3 axis = glm::normalize(glm::cross(targetToPrev, targetToSun)); - const glm::dquat offsetRotation = angleAxis(static_cast(angle), axis); - - return glm::normalize(offsetRotation * targetToSun); - } -} - Waypoint computeWaypointFromNodeInfo(const NodeCameraStateSpec& spec, const std::optional& startPoint, bool useLinear) diff --git a/src/network/messagestructures.cpp b/src/network/messagestructures.cpp new file mode 100644 index 0000000000..03e0cd5d7c --- /dev/null +++ b/src/network/messagestructures.cpp @@ -0,0 +1,431 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2025 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#include + +#include +#include +#include +#include +#include + +namespace openspace::datamessagestructures { + +CameraKeyframe::CameraKeyframe(const std::vector& buffer) { + deserialize(buffer); +} + +CameraKeyframe::CameraKeyframe(glm::dvec3 pos, glm::dquat rot, std::string focusNode, + bool followNodeRot, float scale) + : _position(pos) + , _rotation(rot) + , _followNodeRotation(followNodeRot) + , _focusNode(focusNode) + , _scale(scale) +{} + +void CameraKeyframe::serialize(std::vector& buffer) const { + // Add position + buffer.insert( + buffer.end(), + reinterpret_cast(&_position), + reinterpret_cast(&_position) + sizeof(_position) + ); + + // Add orientation + buffer.insert( + buffer.end(), + reinterpret_cast(&_rotation), + reinterpret_cast(&_rotation) + sizeof(_rotation) + ); + + // Follow focus node rotation? + buffer.insert( + buffer.end(), + reinterpret_cast(&_followNodeRotation), + reinterpret_cast(&_followNodeRotation) + + sizeof(_followNodeRotation) + ); + + uint32_t nodeNameLength = static_cast(_focusNode.size()); + + // Add focus node + buffer.insert( + buffer.end(), + reinterpret_cast(&nodeNameLength), + reinterpret_cast(&nodeNameLength) + sizeof(uint32_t) + ); + buffer.insert( + buffer.end(), + _focusNode.data(), + _focusNode.data() + nodeNameLength + ); + + buffer.insert( + buffer.end(), + reinterpret_cast(&_scale), + reinterpret_cast(&_scale) + sizeof(_scale) + ); + + // Add timestamp + buffer.insert( + buffer.end(), + reinterpret_cast(&_timestamp), + reinterpret_cast(&_timestamp) + sizeof(_timestamp) + ); +} + +size_t CameraKeyframe::deserialize(const std::vector& buffer, size_t offset) { + int size = 0; + + // Position + size = sizeof(_position); + std::memcpy(glm::value_ptr(_position), buffer.data() + offset, size); + offset += size; + + // Orientation + size = sizeof(_rotation); + std::memcpy(glm::value_ptr(_rotation), buffer.data() + offset, size); + offset += size; + + // Follow focus node rotation? + size = sizeof(_followNodeRotation); + std::memcpy(&_followNodeRotation, buffer.data() + offset, size); + offset += size; + + // Focus node + int nodeNameLength; + size = sizeof(int); + std::memcpy(&nodeNameLength, buffer.data() + offset, size); + offset += size; + size = nodeNameLength; + _focusNode = std::string(buffer.data() + offset, buffer.data() + offset + size); + offset += size; + + // Scale + size = sizeof(_scale); + std::memcpy(&_scale, buffer.data() + offset, size); + offset += size; + + // Timestamp + size = sizeof(_timestamp); + std::memcpy(&_timestamp, buffer.data() + offset, size); + offset += size; + + return offset; +} + +void CameraKeyframe::write(std::ostream& out) const { + out.write( + reinterpret_cast(glm::value_ptr(_position)), + sizeof(_position) + ); + out.write( + reinterpret_cast(glm::value_ptr(_rotation)), + sizeof(_rotation) + ); + + // Write follow focus node rotation? + out.write( + reinterpret_cast(&_followNodeRotation), + sizeof(_followNodeRotation) + ); + + int nodeNameLength = static_cast(_focusNode.size()); + + // Write focus node + out.write(reinterpret_cast(&nodeNameLength), sizeof(nodeNameLength)); + out.write(_focusNode.c_str(), _focusNode.size()); + + // Write scale + out.write(reinterpret_cast(&_scale), sizeof(_scale)); + + // Write timestamp + out.write(reinterpret_cast(&_timestamp), sizeof(_timestamp)); +} + +void CameraKeyframe::write(std::stringstream& out) const { + // Add camera position + out << std::setprecision(std::numeric_limits::max_digits10); + out << _position.x << ' ' << _position.y << ' ' << _position.z << ' '; + // Add camera rotation + out << _rotation.x << ' ' + << _rotation.y << ' ' + << _rotation.z << ' ' + << _rotation.w << ' '; + out << std::scientific << _scale << ' '; + if (_followNodeRotation) { + out << "F "; + } + else { + out << "- "; + } + out << _focusNode; +} + +void CameraKeyframe::read(std::istream* in) { + // Read position + in->read(reinterpret_cast(&_position), sizeof(_position)); + + // Read orientation + in->read(reinterpret_cast(&_rotation), sizeof(_rotation)); + + // Read follow focus node rotation + unsigned char b; + in->read(reinterpret_cast(&b), sizeof(unsigned char)); + _followNodeRotation = (b == 1); + + // Read focus node + int nodeNameLength = static_cast(_focusNode.size()); + in->read(reinterpret_cast(&nodeNameLength), sizeof(nodeNameLength)); + std::vector temp(static_cast(nodeNameLength) + 1); + in->read(temp.data(), nodeNameLength); + + temp[nodeNameLength] = '\0'; + _focusNode = temp.data(); + + // Read scale + in->read(reinterpret_cast(&_scale), sizeof(_scale)); + + // Read timestamp + in->read(reinterpret_cast(&_timestamp), sizeof(_timestamp)); +} + +void CameraKeyframe::read(std::istringstream& iss) { + std::string rotationFollowing; + + iss >> _position.x + >> _position.y + >> _position.z + >> _rotation.x + >> _rotation.y + >> _rotation.z + >> _rotation.w + >> _scale + >> rotationFollowing + >> _focusNode; + _followNodeRotation = (rotationFollowing == "F"); +} + +TimeKeyframe::TimeKeyframe(const std::vector& buffer) { + deserialize(buffer); +} + +void TimeKeyframe::serialize(std::vector& buffer) const { + buffer.insert( + buffer.end(), + reinterpret_cast(this), + reinterpret_cast(this) + sizeof(TimeKeyframe) + ); +} + +size_t TimeKeyframe::deserialize(const std::vector& buffer, size_t offset) { + *this = *reinterpret_cast(buffer.data() + offset); + offset += sizeof(TimeKeyframe); + return offset; +} + +void TimeKeyframe::write(std::ostream* out) const { + out->write(reinterpret_cast(this), sizeof(TimeKeyframe)); +} + +void TimeKeyframe::write(std::stringstream& out) const { + out << ' ' << _dt; + if (_paused) { + out << " P"; + } + else { + out << " R"; + } + if (_requiresTimeJump) { + out << " J"; + } + else { + out << " -"; + } +} + +void TimeKeyframe::read(std::istream* in) { + in->read(reinterpret_cast(this), sizeof(TimeKeyframe)); +} + +void TimeKeyframe::read(std::istringstream& iss) { + std::string paused, jump; + + iss >> _dt + >> paused + >> jump; + _paused = (paused == "P"); + _requiresTimeJump = (jump == "J"); +} + +TimeTimeline::TimeTimeline(const std::vector& buffer) { + deserialize(buffer); +} + +void TimeTimeline::serialize(std::vector& buffer) const { + buffer.insert( + buffer.end(), + reinterpret_cast(&_clear), + reinterpret_cast(&_clear) + sizeof(bool) + ); + + int64_t nKeyframes = _keyframes.size(); + buffer.insert( + buffer.end(), + reinterpret_cast(&nKeyframes), + reinterpret_cast(&nKeyframes) + sizeof(int64_t) + ); + for (const TimeKeyframe& k : _keyframes) { + k.serialize(buffer); + } +} + +size_t TimeTimeline::deserialize(const std::vector& buffer, size_t offset) { + int size = 0; + + size = sizeof(_clear); + std::memcpy(&_clear, buffer.data() + offset, size); + offset += size; + + int64_t nKeyframes = _keyframes.size(); + size = sizeof(nKeyframes); + std::memcpy(&nKeyframes, buffer.data() + offset, size); + offset += size; + + _keyframes.resize(nKeyframes); + for (TimeKeyframe& k : _keyframes) { + offset = k.deserialize(buffer, offset); + } + return offset; +} + +void TimeTimeline::write(std::ostream* out) const { + out->write(reinterpret_cast(&_clear), sizeof(bool)); + + int64_t nKeyframes = _keyframes.size(); + out->write(reinterpret_cast(&nKeyframes), sizeof(int64_t)); + for (const TimeKeyframe& k : _keyframes) { + k.write(out); + } +} + +void TimeTimeline::read(std::istream* in) { + in->read(reinterpret_cast(&_clear), sizeof(bool)); + + int64_t nKeyframes = _keyframes.size(); + in->read(reinterpret_cast(&nKeyframes), sizeof(int64_t)); + for (TimeKeyframe& k : _keyframes) { + k.read(in); + } +} + +void ScriptMessage::serialize(std::vector& buffer) const { + uint32_t strLen = static_cast(_script.size()); + + const char* p = reinterpret_cast(&strLen); + buffer.insert(buffer.end(), p, p + sizeof(uint32_t)); + + buffer.insert(buffer.end(), _script.begin(), _script.end()); +} + +void ScriptMessage::deserialize(const std::vector& buffer) { + const char* p = buffer.data(); + const uint32_t len = *reinterpret_cast(p); + + if (buffer.size() != (sizeof(uint32_t) + len)) { + LERRORC( + "ParallelPeer", + std::format( + "Received buffer with wrong size. Expected {} got {}", + len, buffer.size() + ) + ); + return; + } + + // We can skip over the first uint32_t that encoded the length + _script.assign(buffer.begin() + sizeof(uint32_t), buffer.end()); +} + +void ScriptMessage::write(std::ostream* out) const { + out->write(_script.c_str(), _script.size()); +} + +void ScriptMessage::write(unsigned char* buf, size_t& idx, std::ofstream& file) const { + size_t strLen = _script.size(); + size_t writeSize_bytes = sizeof(size_t); + + unsigned char const* p = reinterpret_cast(&strLen); + memcpy((buf + idx), p, writeSize_bytes); + idx += static_cast(writeSize_bytes); + + memcpy((buf + idx), _script.c_str(), _script.size()); + idx += static_cast(strLen); + file.write(reinterpret_cast(buf), idx); + //Write directly to file because some scripts can be very long + file.write(_script.c_str(), _script.size()); +} + +void ScriptMessage::write(std::stringstream& ss) const { + unsigned int numLinesInScript = static_cast( + std::count(_script.begin(), _script.end(), '\n') + ); + ss << ' ' << (numLinesInScript + 1) << ' '; + ss << _script; +} + +void ScriptMessage::read(std::istream* in) { + uint32_t strLen = 0; + //Read string length from file + in->read(reinterpret_cast(&strLen), sizeof(strLen)); + //Read back full string + std::vector temp(strLen + 1); + in->read(temp.data(), strLen); + temp[strLen] = '\0'; + + _script.erase(); + _script = temp.data(); +} + +void ScriptMessage::read(std::istringstream& iss) { + int numScriptLines; + iss >> numScriptLines; + if (numScriptLines < 0) { + numScriptLines = 0; + } + std::string tmpReadbackScript; + _script.erase(); + for (int i = 0; i < numScriptLines; i++) { + ghoul::getline(iss, tmpReadbackScript); + size_t start = tmpReadbackScript.find_first_not_of(" "); + tmpReadbackScript = tmpReadbackScript.substr(start); + _script.append(tmpReadbackScript); + if (i < (numScriptLines - 1)) { + _script.append("\n"); + } + } +} + +} // namespace openspace::datamessagestructures diff --git a/src/network/messagestructureshelper.cpp b/src/network/messagestructureshelper.cpp index a01c4cb3c5..3a79ab6ecb 100644 --- a/src/network/messagestructureshelper.cpp +++ b/src/network/messagestructureshelper.cpp @@ -29,9 +29,11 @@ #include #include #include +#include #include #include #include +#include namespace openspace::datamessagestructures { diff --git a/src/network/parallelconnection.cpp b/src/network/parallelconnection.cpp index da33d434a2..ed073ef905 100644 --- a/src/network/parallelconnection.cpp +++ b/src/network/parallelconnection.cpp @@ -27,6 +27,8 @@ #include #include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "ParallelConnection"; diff --git a/src/network/parallelpeer.cpp b/src/network/parallelpeer.cpp index c8a8bf2b1d..39726b705b 100644 --- a/src/network/parallelpeer.cpp +++ b/src/network/parallelpeer.cpp @@ -32,13 +32,21 @@ #include #include #include +#include #include +#include #include #include +#include #include #include #include #include +#include +#include +#include +#include +#include #include "parallelpeer_lua.inl" @@ -164,7 +172,7 @@ void ParallelPeer::connect() { auto socket = std::make_unique( _address, - atoi(_port.value().c_str()) + std::atoi(_port.value().c_str()) ); socket->connect(); @@ -218,7 +226,7 @@ void ParallelPeer::sendAuthentication() { passwordSize + // password sizeof(uint16_t) + // host password length hostPasswordSize + // host password - sizeof(uint8_t) + // server name length + sizeof(uint8_t) + // server name length serverNameSize + // server name sizeof(uint8_t) + // name length nameLength; // name @@ -309,7 +317,6 @@ double ParallelPeer::convertTimestamp(double messageTimestamp) { return messageTimestamp + _initialTimeDiff + _bufferTime; } - double ParallelPeer::latencyStandardDeviation() const { double accumulatedLatencyDiffSquared = 0; double accumulatedLatencyDiff = 0; diff --git a/src/network/parallelpeer_lua.inl b/src/network/parallelpeer_lua.inl index d4a2a8c0b0..b78f028b84 100644 --- a/src/network/parallelpeer_lua.inl +++ b/src/network/parallelpeer_lua.inl @@ -22,7 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include +#include namespace { diff --git a/src/properties/matrix/dmat2property.cpp b/src/properties/matrix/dmat2property.cpp index 5ae02718ba..bbbcb60c3b 100644 --- a/src/properties/matrix/dmat2property.cpp +++ b/src/properties/matrix/dmat2property.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/matrix/dmat3property.cpp b/src/properties/matrix/dmat3property.cpp index 6cb874ebc4..5a42adaa7a 100644 --- a/src/properties/matrix/dmat3property.cpp +++ b/src/properties/matrix/dmat3property.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/matrix/dmat4property.cpp b/src/properties/matrix/dmat4property.cpp index 03a1ab3720..b571343615 100644 --- a/src/properties/matrix/dmat4property.cpp +++ b/src/properties/matrix/dmat4property.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/matrix/mat2property.cpp b/src/properties/matrix/mat2property.cpp index ef1c476541..66770d958a 100644 --- a/src/properties/matrix/mat2property.cpp +++ b/src/properties/matrix/mat2property.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/matrix/mat3property.cpp b/src/properties/matrix/mat3property.cpp index 11383c15e7..24fbcf7ec5 100644 --- a/src/properties/matrix/mat3property.cpp +++ b/src/properties/matrix/mat3property.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/matrix/mat4property.cpp b/src/properties/matrix/mat4property.cpp index 63bb4ae16a..7ed3a13c25 100644 --- a/src/properties/matrix/mat4property.cpp +++ b/src/properties/matrix/mat4property.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/misc/optionproperty.cpp b/src/properties/misc/optionproperty.cpp index f652a6646f..9d53311769 100644 --- a/src/properties/misc/optionproperty.cpp +++ b/src/properties/misc/optionproperty.cpp @@ -27,7 +27,6 @@ #include #include #include -#include namespace { constexpr std::string_view _loggerCat = "OptionProperty"; diff --git a/src/properties/misc/selectionproperty.cpp b/src/properties/misc/selectionproperty.cpp index 3472bb1afe..7804fd2f4e 100644 --- a/src/properties/misc/selectionproperty.cpp +++ b/src/properties/misc/selectionproperty.cpp @@ -28,7 +28,7 @@ #include #include #include -#include +#include namespace { constexpr std::string_view _loggerCat = "SelectionProperty"; diff --git a/src/properties/property.cpp b/src/properties/property.cpp index a2f1b9c1cb..2c5b699e64 100644 --- a/src/properties/property.cpp +++ b/src/properties/property.cpp @@ -25,11 +25,11 @@ #include #include +#include #include #include -#include -#include #include +#include namespace openspace::properties { diff --git a/src/properties/propertyowner.cpp b/src/properties/propertyowner.cpp index 1b9f13f3d3..35867cfd32 100644 --- a/src/properties/propertyowner.cpp +++ b/src/properties/propertyowner.cpp @@ -31,10 +31,12 @@ #include #include #include -#include +#include #include +#include #include -#include +#include +#include namespace { constexpr std::string_view _loggerCat = "PropertyOwner"; diff --git a/src/properties/scalar/doubleproperty.cpp b/src/properties/scalar/doubleproperty.cpp index 55cfb79135..10ff4caa97 100644 --- a/src/properties/scalar/doubleproperty.cpp +++ b/src/properties/scalar/doubleproperty.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/scalar/floatproperty.cpp b/src/properties/scalar/floatproperty.cpp index ee5f51dc21..dbf48bddaf 100644 --- a/src/properties/scalar/floatproperty.cpp +++ b/src/properties/scalar/floatproperty.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/scalar/intproperty.cpp b/src/properties/scalar/intproperty.cpp index 1199d1e150..86f4da931e 100644 --- a/src/properties/scalar/intproperty.cpp +++ b/src/properties/scalar/intproperty.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/scalar/longproperty.cpp b/src/properties/scalar/longproperty.cpp index 2db967a6d1..97a388dc2a 100644 --- a/src/properties/scalar/longproperty.cpp +++ b/src/properties/scalar/longproperty.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/scalar/shortproperty.cpp b/src/properties/scalar/shortproperty.cpp index 2c370c14f9..e54afe79f4 100644 --- a/src/properties/scalar/shortproperty.cpp +++ b/src/properties/scalar/shortproperty.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/scalar/uintproperty.cpp b/src/properties/scalar/uintproperty.cpp index b8bec87104..ef111adf3d 100644 --- a/src/properties/scalar/uintproperty.cpp +++ b/src/properties/scalar/uintproperty.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/scalar/ulongproperty.cpp b/src/properties/scalar/ulongproperty.cpp index 8f26cf3f0f..42a52b8d0f 100644 --- a/src/properties/scalar/ulongproperty.cpp +++ b/src/properties/scalar/ulongproperty.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/scalar/ushortproperty.cpp b/src/properties/scalar/ushortproperty.cpp index 25f4107ef4..4849f938dd 100644 --- a/src/properties/scalar/ushortproperty.cpp +++ b/src/properties/scalar/ushortproperty.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/vector/dvec2property.cpp b/src/properties/vector/dvec2property.cpp index ef70c7ad58..6b383db8b2 100644 --- a/src/properties/vector/dvec2property.cpp +++ b/src/properties/vector/dvec2property.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/vector/dvec3property.cpp b/src/properties/vector/dvec3property.cpp index 7659198529..eb96491be4 100644 --- a/src/properties/vector/dvec3property.cpp +++ b/src/properties/vector/dvec3property.cpp @@ -25,7 +25,6 @@ #include #include -#include namespace openspace::properties { diff --git a/src/properties/vector/dvec4property.cpp b/src/properties/vector/dvec4property.cpp index 2e97823072..287c4d7959 100644 --- a/src/properties/vector/dvec4property.cpp +++ b/src/properties/vector/dvec4property.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/vector/ivec2property.cpp b/src/properties/vector/ivec2property.cpp index 6c014b56aa..4ba64a895c 100644 --- a/src/properties/vector/ivec2property.cpp +++ b/src/properties/vector/ivec2property.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/vector/ivec3property.cpp b/src/properties/vector/ivec3property.cpp index 0acdf215e7..dfbd96af80 100644 --- a/src/properties/vector/ivec3property.cpp +++ b/src/properties/vector/ivec3property.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/vector/ivec4property.cpp b/src/properties/vector/ivec4property.cpp index ef2d6c5c75..214c9d620a 100644 --- a/src/properties/vector/ivec4property.cpp +++ b/src/properties/vector/ivec4property.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/vector/uvec2property.cpp b/src/properties/vector/uvec2property.cpp index c65f967715..f2f56bd665 100644 --- a/src/properties/vector/uvec2property.cpp +++ b/src/properties/vector/uvec2property.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/vector/uvec3property.cpp b/src/properties/vector/uvec3property.cpp index 02c4bc98fd..15bbbe3902 100644 --- a/src/properties/vector/uvec3property.cpp +++ b/src/properties/vector/uvec3property.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/vector/uvec4property.cpp b/src/properties/vector/uvec4property.cpp index 8d7f9b285a..70acb038f7 100644 --- a/src/properties/vector/uvec4property.cpp +++ b/src/properties/vector/uvec4property.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/vector/vec2property.cpp b/src/properties/vector/vec2property.cpp index b2dc52ec36..8ba77d9d3d 100644 --- a/src/properties/vector/vec2property.cpp +++ b/src/properties/vector/vec2property.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/vector/vec3property.cpp b/src/properties/vector/vec3property.cpp index 1d4ced192c..348be4cd4f 100644 --- a/src/properties/vector/vec3property.cpp +++ b/src/properties/vector/vec3property.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/properties/vector/vec4property.cpp b/src/properties/vector/vec4property.cpp index 50716424fd..1bfd2234f6 100644 --- a/src/properties/vector/vec4property.cpp +++ b/src/properties/vector/vec4property.cpp @@ -24,7 +24,6 @@ #include -#include #include namespace openspace::properties { diff --git a/src/query/query.cpp b/src/query/query.cpp index 6144197c3b..9f7cf9aa29 100644 --- a/src/query/query.cpp +++ b/src/query/query.cpp @@ -26,8 +26,11 @@ #include #include +#include +#include #include #include +#include namespace openspace { diff --git a/src/rendering/colormappingcomponent.cpp b/src/rendering/colormappingcomponent.cpp index c8ce3778bf..31a468330e 100644 --- a/src/rendering/colormappingcomponent.cpp +++ b/src/rendering/colormappingcomponent.cpp @@ -26,6 +26,11 @@ #include #include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "ColorMapping"; diff --git a/src/rendering/dashboard.cpp b/src/rendering/dashboard.cpp index 6a56df0838..09061ef8f3 100644 --- a/src/rendering/dashboard.cpp +++ b/src/rendering/dashboard.cpp @@ -24,12 +24,13 @@ #include -#include #include #include #include #include #include +#include +#include #include "dashboard_lua.inl" diff --git a/src/rendering/dashboard_lua.inl b/src/rendering/dashboard_lua.inl index 59361808c5..7f7ff0f779 100644 --- a/src/rendering/dashboard_lua.inl +++ b/src/rendering/dashboard_lua.inl @@ -23,7 +23,12 @@ ****************************************************************************************/ #include +#include #include +#include +#include +#include +#include namespace { diff --git a/src/rendering/dashboarditem.cpp b/src/rendering/dashboarditem.cpp index 8b36ab6a94..928a84ccc8 100644 --- a/src/rendering/dashboarditem.cpp +++ b/src/rendering/dashboarditem.cpp @@ -26,8 +26,12 @@ #include #include +#include +#include #include #include +#include +#include namespace { constexpr std::string_view KeyType = "Type"; diff --git a/src/rendering/dashboardtextitem.cpp b/src/rendering/dashboardtextitem.cpp index a260987b32..089535c70e 100644 --- a/src/rendering/dashboardtextitem.cpp +++ b/src/rendering/dashboardtextitem.cpp @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include namespace { diff --git a/src/rendering/deferredcaster.cpp b/src/rendering/deferredcaster.cpp new file mode 100644 index 0000000000..ae9fc24a46 --- /dev/null +++ b/src/rendering/deferredcaster.cpp @@ -0,0 +1,37 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2025 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#include + +namespace openspace { + +void Deferredcaster::preRaycast(const RenderData&, const DeferredcastData&, + ghoul::opengl::ProgramObject&) +{} + +void Deferredcaster::postRaycast(const RenderData&, const DeferredcastData&, + ghoul::opengl::ProgramObject&) +{} + +} // namespace openspace diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 52cf0de035..77459188f4 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -27,7 +27,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -37,13 +39,19 @@ #include #include #include +#include #include #include #include #include #include #include +#include +#include +#include #include +#include +#include #include namespace { @@ -510,8 +518,8 @@ void FramebufferRenderer::updateDownscaleTextures() const { GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, - static_cast(glm::max(_resolution.x * cdf, 1.f)), - static_cast(glm::max(_resolution.y * cdf, 1.f)), + static_cast(std::max(_resolution.x * cdf, 1.f)), + static_cast(std::max(_resolution.y * cdf, 1.f)), 0, GL_DEPTH_COMPONENT, GL_FLOAT, diff --git a/src/rendering/helper.cpp b/src/rendering/helper.cpp index 3dbbfb4b9e..9de292522c 100644 --- a/src/rendering/helper.cpp +++ b/src/rendering/helper.cpp @@ -24,20 +24,22 @@ #include -#include #include #include #include #include -#include +#include #include #include #include #include +#include +#include +#include #include #include +#include #include -#include namespace { @@ -613,7 +615,7 @@ std::vector convert(std::vector v) { return result; } -Vertex computeCircleVertex(int i, int nSegments, float radius, +static Vertex computeCircleVertex(int i, int nSegments, float radius, const glm::vec4& color = glm::vec4(1.f)) { const float fsegments = static_cast(nSegments); @@ -712,10 +714,10 @@ VertexIndexListCombo createSphere(int nSegments, glm::vec3 radii, return { vertices, indices }; } -VertexIndexListCombo createConicalCylinder(unsigned int nSegments, - float bottomRadius, - float topRadius, - float height) +static 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); diff --git a/src/rendering/labelscomponent.cpp b/src/rendering/labelscomponent.cpp index 51a23b0cc2..041cb6a2c7 100644 --- a/src/rendering/labelscomponent.cpp +++ b/src/rendering/labelscomponent.cpp @@ -32,7 +32,9 @@ #include #include #include +#include #include +#include namespace { constexpr std::string_view _loggerCat = "LabelsComponent"; diff --git a/src/rendering/loadingscreen.cpp b/src/rendering/loadingscreen.cpp index 0c3731b6fd..e1629fe034 100644 --- a/src/rendering/loadingscreen.cpp +++ b/src/rendering/loadingscreen.cpp @@ -37,14 +37,18 @@ #include #include #include +#include #include #include #include #include -#include +#include +#include +#include #include #include #include +#include namespace { constexpr float LoadingFontSize = 25.f; diff --git a/src/rendering/luaconsole.cpp b/src/rendering/luaconsole.cpp index beee7fc4cb..88381c0d78 100644 --- a/src/rendering/luaconsole.cpp +++ b/src/rendering/luaconsole.cpp @@ -35,12 +35,17 @@ #include #include #include +#include #include #include #include #include +#include +#include +#include #include #include +#include namespace { constexpr std::string_view HistoryFile = "ConsoleHistory"; @@ -321,8 +326,8 @@ bool LuaConsole::keyboardCallback(Key key, KeyModifier modifier, KeyAction actio return false; } - const bool modifierShift = (modifier == KeyModifier::Shift); - const bool modifierControl = (modifier == KeyModifier::Control); + const bool modifierShift = hasKeyModifier(modifier, KeyModifier::Shift); + const bool modifierControl = hasKeyModifier(modifier, KeyModifier::Control); // Button left of 1 and above TAB (default) // Can be changed to any other key with the setCommandInputButton funciton diff --git a/src/rendering/renderable.cpp b/src/rendering/renderable.cpp index 54413d0c2e..2a2df6b9d3 100644 --- a/src/rendering/renderable.cpp +++ b/src/rendering/renderable.cpp @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -36,8 +35,14 @@ #include #include #include +#include +#include #include -#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view KeyType = "Type"; @@ -149,8 +154,6 @@ ghoul::mm_unique_ptr Renderable::createFromDictionary( return ghoul::mm_unique_ptr(result); } - - Renderable::Renderable(const ghoul::Dictionary& dictionary, RenderableSettings settings) : properties::PropertyOwner({ "Renderable" }) , _enabled(EnabledInfo, true) diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 73752625f7..039921f653 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -38,9 +39,11 @@ #include #include #include +#include #include -#include #include +#include +#include #include #include #include @@ -55,13 +58,24 @@ #include #include #include +#include #include +#include +#include +#include #include #include -#include #include +#include +#include +#include +#include +#include +#include +#include #include "renderengine_lua.inl" +#include namespace { constexpr std::string_view _loggerCat = "RenderEngine"; diff --git a/src/rendering/renderengine_lua.inl b/src/rendering/renderengine_lua.inl index 3662b2f69b..9cccfbc654 100644 --- a/src/rendering/renderengine_lua.inl +++ b/src/rendering/renderengine_lua.inl @@ -23,6 +23,9 @@ ****************************************************************************************/ #include +#include +#include +#include namespace { diff --git a/src/rendering/screenspacerenderable.cpp b/src/rendering/screenspacerenderable.cpp index 094001fbc7..185c716aa7 100644 --- a/src/rendering/screenspacerenderable.cpp +++ b/src/rendering/screenspacerenderable.cpp @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -35,12 +34,19 @@ #include #include #include +#include +#include #include #include #include #include +#include +#include #include #include +#include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo EnabledInfo = { diff --git a/src/rendering/screenspacerenderableframebuffer.cpp b/src/rendering/screenspacerenderableframebuffer.cpp index e1295a082a..9cca414280 100644 --- a/src/rendering/screenspacerenderableframebuffer.cpp +++ b/src/rendering/screenspacerenderableframebuffer.cpp @@ -27,7 +27,11 @@ #include #include #include +#include +#include #include +#include +#include namespace { constexpr openspace::properties::Property::PropertyInfo SizeInfo = { diff --git a/src/rendering/screenspacerenderabletext.cpp b/src/rendering/screenspacerenderabletext.cpp index 9986ec9cf1..45ddea377a 100644 --- a/src/rendering/screenspacerenderabletext.cpp +++ b/src/rendering/screenspacerenderabletext.cpp @@ -25,13 +25,14 @@ #include #include -#include #include #include #include #include #include #include +#include +#include #include namespace { diff --git a/src/rendering/texturecomponent.cpp b/src/rendering/texturecomponent.cpp index 28a33bc450..b0d355acbc 100644 --- a/src/rendering/texturecomponent.cpp +++ b/src/rendering/texturecomponent.cpp @@ -27,6 +27,9 @@ #include #include #include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "TextureComponent"; diff --git a/src/rendering/transferfunction.cpp b/src/rendering/transferfunction.cpp index a872465cf1..db5862dc24 100644 --- a/src/rendering/transferfunction.cpp +++ b/src/rendering/transferfunction.cpp @@ -28,12 +28,17 @@ #include #include #include +#include #include #include +#include #include #include #include #include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "TransferFunction"; diff --git a/src/scene/asset.cpp b/src/scene/asset.cpp index 6f2f107aaa..f815750685 100644 --- a/src/scene/asset.cpp +++ b/src/scene/asset.cpp @@ -29,12 +29,19 @@ #include #include #include +#include #include #include -#include +#include +#include +#include +#include #include #include #include +#include +#include +#include namespace openspace { diff --git a/src/scene/assetmanager.cpp b/src/scene/assetmanager.cpp index 7e1ffb5f9c..f5e9427d05 100644 --- a/src/scene/assetmanager.cpp +++ b/src/scene/assetmanager.cpp @@ -31,9 +31,17 @@ #include #include #include +#include #include +#include +#include +#include #include #include +#include +#include +#include +#include #include "assetmanager_lua.inl" diff --git a/src/scene/assetmanager_lua.inl b/src/scene/assetmanager_lua.inl index 734fde442f..b03260b798 100644 --- a/src/scene/assetmanager_lua.inl +++ b/src/scene/assetmanager_lua.inl @@ -24,6 +24,7 @@ #include #include +#include namespace { diff --git a/src/scene/lightsource.cpp b/src/scene/lightsource.cpp index e2d4fb036b..5638e1354d 100644 --- a/src/scene/lightsource.cpp +++ b/src/scene/lightsource.cpp @@ -25,14 +25,11 @@ #include #include -#include #include -#include -#include -#include #include #include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo EnabledInfo = { diff --git a/src/scene/profile.cpp b/src/scene/profile.cpp index 3a034ede25..8393f68bc0 100644 --- a/src/scene/profile.cpp +++ b/src/scene/profile.cpp @@ -24,7 +24,6 @@ #include -#include #include #include #include @@ -32,13 +31,20 @@ #include #include #include +#include #include -#include #include +#include #include +#include #include +#include #include +#include +#include +#include #include +#include #include "profile_lua.inl" @@ -117,12 +123,12 @@ namespace { // Current version: // -void to_json(nlohmann::json& j, const Profile::Version& v) { +static void to_json(nlohmann::json& j, const Profile::Version& v) { j["major"] = v.major; j["minor"] = v.minor; } -void from_json(const nlohmann::json& j, Profile::Version& v) { +static void from_json(const nlohmann::json& j, Profile::Version& v) { checkValue(j, "major", &nlohmann::json::is_number, "version", false); checkValue(j, "minor", &nlohmann::json::is_number, "version", false); checkExtraKeys(j, "version", { "major", "minor" }); @@ -131,7 +137,7 @@ void from_json(const nlohmann::json& j, Profile::Version& v) { j["minor"].get_to(v.minor); } -void to_json(nlohmann::json& j, const Profile::Module& v) { +static void to_json(nlohmann::json& j, const Profile::Module& v) { j["name"] = v.name; if (v.loadedInstruction.has_value()) { j["loadedInstruction"] = *v.loadedInstruction; @@ -141,7 +147,7 @@ void to_json(nlohmann::json& j, const Profile::Module& v) { } } -void from_json(const nlohmann::json& j, Profile::Module& v) { +static void from_json(const nlohmann::json& j, Profile::Module& v) { checkValue(j, "name", &nlohmann::json::is_string, "module", false); checkValue(j, "loadedInstruction", &nlohmann::json::is_string, "module", true); checkValue(j, "notLoadedInstruction", &nlohmann::json::is_string, "module", true); @@ -156,7 +162,7 @@ void from_json(const nlohmann::json& j, Profile::Module& v) { } } -void to_json(nlohmann::json& j, const Profile::Meta& v) { +static void to_json(nlohmann::json& j, const Profile::Meta& v) { if (v.name.has_value()) { j["name"] = *v.name; } @@ -177,7 +183,7 @@ void to_json(nlohmann::json& j, const Profile::Meta& v) { } } -void from_json(const nlohmann::json& j, Profile::Meta& v) { +static void from_json(const nlohmann::json& j, Profile::Meta& v) { checkValue(j, "name", &nlohmann::json::is_string, "meta", true); checkValue(j, "version", &nlohmann::json::is_string, "meta", true); checkValue(j, "description", &nlohmann::json::is_string, "meta", true); @@ -210,7 +216,7 @@ void from_json(const nlohmann::json& j, Profile::Meta& v) { } } -void to_json(nlohmann::json& j, const Profile::Property::SetType& v) { +static void to_json(nlohmann::json& j, const Profile::Property::SetType& v) { j = [](Profile::Property::SetType t) { switch (t) { case Profile::Property::SetType::SetPropertyValue: @@ -223,7 +229,7 @@ void to_json(nlohmann::json& j, const Profile::Property::SetType& v) { }(v); } -void from_json(const nlohmann::json& j, Profile::Property::SetType& v) { +static void from_json(const nlohmann::json& j, Profile::Property::SetType& v) { const std::string value = j.get(); if (value == "setPropertyValue") { v = Profile::Property::SetType::SetPropertyValue; @@ -238,13 +244,13 @@ void from_json(const nlohmann::json& j, Profile::Property::SetType& v) { } } -void to_json(nlohmann::json& j, const Profile::Property& v) { +static void to_json(nlohmann::json& j, const Profile::Property& v) { j["type"] = v.setType; j["name"] = v.name; j["value"] = v.value; } -void from_json(const nlohmann::json& j, Profile::Property& v) { +static void from_json(const nlohmann::json& j, Profile::Property& v) { checkValue(j, "type", &nlohmann::json::is_string, "property", false); checkValue(j, "name", &nlohmann::json::is_string, "property", false); checkValue(j, "value", &nlohmann::json::is_string, "property", false); @@ -255,7 +261,7 @@ void from_json(const nlohmann::json& j, Profile::Property& v) { j["value"].get_to(v.value); } -void to_json(nlohmann::json& j, const Profile::Action& v) { +static void to_json(nlohmann::json& j, const Profile::Action& v) { j["identifier"] = v.identifier; j["documentation"] = v.documentation; j["name"] = v.name; @@ -264,7 +270,7 @@ void to_json(nlohmann::json& j, const Profile::Action& v) { j["script"] = v.script; } -void from_json(const nlohmann::json& j, Profile::Action& v) { +static void from_json(const nlohmann::json& j, Profile::Action& v) { checkValue(j, "identifier", &nlohmann::json::is_string, "action", false); checkValue(j, "documentation", &nlohmann::json::is_string, "action", false); checkValue(j, "name", &nlohmann::json::is_string, "action", false); @@ -285,12 +291,12 @@ void from_json(const nlohmann::json& j, Profile::Action& v) { j["script"].get_to(v.script); } -void to_json(nlohmann::json& j, const Profile::Keybinding& v) { +static void to_json(nlohmann::json& j, const Profile::Keybinding& v) { j["key"] = keyToString(v.key); j["action"] = v.action; } -void from_json(const nlohmann::json& j, Profile::Keybinding& v) { +static void from_json(const nlohmann::json& j, Profile::Keybinding& v) { checkValue(j, "key", &nlohmann::json::is_string, "keybinding", false); checkValue(j, "action", &nlohmann::json::is_string, "keybinding", false); checkExtraKeys(j, "keybinding", { "key", "action" }); @@ -299,7 +305,7 @@ void from_json(const nlohmann::json& j, Profile::Keybinding& v) { j["action"].get_to(v.action); } -void to_json(nlohmann::json& j, const Profile::Time::Type& v) { +static void to_json(nlohmann::json& j, const Profile::Time::Type& v) { j = [](Profile::Time::Type t) { switch (t) { case Profile::Time::Type::Absolute: return "absolute"; @@ -309,7 +315,7 @@ void to_json(nlohmann::json& j, const Profile::Time::Type& v) { }(v); } -void from_json(const nlohmann::json& j, Profile::Time::Type& v) { +static void from_json(const nlohmann::json& j, Profile::Time::Type& v) { const std::string value = j.get(); if (value == "absolute") { v = Profile::Time::Type::Absolute; @@ -324,13 +330,13 @@ void from_json(const nlohmann::json& j, Profile::Time::Type& v) { } } -void to_json(nlohmann::json& j, const Profile::Time& v) { +static void to_json(nlohmann::json& j, const Profile::Time& v) { j["type"] = v.type; j["value"] = v.value; j["is_paused"] = v.startPaused; } -void from_json(const nlohmann::json& j, Profile::Time& v) { +static void from_json(const nlohmann::json& j, Profile::Time& v) { checkValue(j, "type", &nlohmann::json::is_string, "time", false); checkValue(j, "value", &nlohmann::json::is_string, "time", false); checkValue(j, "is_paused", &nlohmann::json::is_boolean, "time", false); @@ -341,7 +347,7 @@ void from_json(const nlohmann::json& j, Profile::Time& v) { j["is_paused"].get_to(v.startPaused); } -void to_json(nlohmann::json& j, const Profile::CameraGoToNode& v) { +static void to_json(nlohmann::json& j, const Profile::CameraGoToNode& v) { j["type"] = Profile::CameraGoToNode::Type; j["anchor"] = v.anchor; if (v.height.has_value()) { @@ -349,7 +355,7 @@ void to_json(nlohmann::json& j, const Profile::CameraGoToNode& v) { } } -void from_json(const nlohmann::json& j, Profile::CameraGoToNode& v) { +static void from_json(const nlohmann::json& j, Profile::CameraGoToNode& v) { ghoul_assert( j.at("type").get() == Profile::CameraGoToNode::Type, "Wrong type for Camera" @@ -369,7 +375,7 @@ void from_json(const nlohmann::json& j, Profile::CameraGoToNode& v) { } } -void to_json(nlohmann::json& j, const Profile::CameraNavState& v) { +static void to_json(nlohmann::json& j, const Profile::CameraNavState& v) { j["type"] = Profile::CameraNavState::Type; j["anchor"] = v.anchor; if (v.aim.has_value()) { @@ -398,7 +404,7 @@ void to_json(nlohmann::json& j, const Profile::CameraNavState& v) { } } -void from_json(const nlohmann::json& j, Profile::CameraNavState& v) { +static void from_json(const nlohmann::json& j, Profile::CameraNavState& v) { ghoul_assert( j.at("type").get() == Profile::CameraNavState::Type, "Wrong type for Camera" @@ -455,7 +461,7 @@ void from_json(const nlohmann::json& j, Profile::CameraNavState& v) { } } -void to_json(nlohmann::json& j, const Profile::CameraGoToGeo& v) { +static void to_json(nlohmann::json& j, const Profile::CameraGoToGeo& v) { j["type"] = Profile::CameraGoToGeo::Type; j["anchor"] = v.anchor; j["latitude"] = v.latitude; @@ -465,7 +471,7 @@ void to_json(nlohmann::json& j, const Profile::CameraGoToGeo& v) { } } -void from_json(const nlohmann::json& j, Profile::CameraGoToGeo& v) { +static void from_json(const nlohmann::json& j, Profile::CameraGoToGeo& v) { ghoul_assert( j.at("type").get() == Profile::CameraGoToGeo::Type, "Wrong type for Camera" @@ -503,7 +509,7 @@ struct Keybinding { std::string script; }; -void from_json(const nlohmann::json& j, version10::Keybinding& v) { +static void from_json(const nlohmann::json& j, version10::Keybinding& v) { checkValue(j, "key", &nlohmann::json::is_string, "keybinding", false); checkValue(j, "documentation", &nlohmann::json::is_string, "keybinding", false); checkValue(j, "name", &nlohmann::json::is_string, "keybinding", false); @@ -556,7 +562,7 @@ void from_json(const nlohmann::json& j, version10::Keybinding& v) { j["script"].get_to(v.script); } -void convertVersion10to11(nlohmann::json& profile) { +static void convertVersion10to11(nlohmann::json& profile) { // Version 1.1 introduced actions and remove Lua function calling from keybindings profile["version"] = Profile::Version{ 1, 1 }; @@ -597,7 +603,7 @@ void convertVersion10to11(nlohmann::json& profile) { namespace version11 { -void convertVersion11to12(nlohmann::json& profile) { +static void convertVersion11to12(nlohmann::json& profile) { // Version 1.2 introduced a state whether the delta time starts out as paused profile["version"] = Profile::Version{ 1, 2 }; @@ -611,7 +617,7 @@ void convertVersion11to12(nlohmann::json& profile) { namespace version12 { -void convertVersion12to13(nlohmann::json& profile) { +static void convertVersion12to13(nlohmann::json& profile) { // Version 1.3 introduced to GoToNode camera initial position profile["version"] = Profile::Version{ 1, 3 }; } @@ -620,7 +626,7 @@ void convertVersion12to13(nlohmann::json& profile) { namespace version13 { -void convertVersion13to14(nlohmann::json& profile) { +static void convertVersion13to14(nlohmann::json& profile) { // Version 1.4 introduced the ui panel view profile["version"] = Profile::Version{ 1, 4 }; } diff --git a/src/scene/profile_lua.inl b/src/scene/profile_lua.inl index a2af7588f8..7cd36fb6fd 100644 --- a/src/scene/profile_lua.inl +++ b/src/scene/profile_lua.inl @@ -22,6 +22,8 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include +#include #include namespace { diff --git a/src/scene/rotation.cpp b/src/scene/rotation.cpp index 73a35da329..9d966e0d5b 100644 --- a/src/scene/rotation.cpp +++ b/src/scene/rotation.cpp @@ -25,13 +25,14 @@ #include #include -#include #include #include #include #include #include #include +#include +#include namespace { // A `Rotation` object describes a specific rotation for a scene graph node, which may diff --git a/src/scene/scale.cpp b/src/scene/scale.cpp index a280e711bb..5cbb5969b3 100644 --- a/src/scene/scale.cpp +++ b/src/scene/scale.cpp @@ -25,12 +25,13 @@ #include #include -#include #include #include #include #include #include +#include +#include namespace { struct [[codegen::Dictionary(Scale)]] Parameters { diff --git a/src/scene/scene.cpp b/src/scene/scene.cpp index 13673c0fee..84033a1243 100644 --- a/src/scene/scene.cpp +++ b/src/scene/scene.cpp @@ -25,17 +25,35 @@ #include #include +#include #include +#include #include #include -#include +#include #include #include +#include #include #include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include +#include +#include #include "scene_lua.inl" @@ -495,7 +513,7 @@ void Scene::render(const RenderData& data, RendererTasks& tasks) { ZoneScoped; ZoneText( renderBinToString(data.renderBinMask), - strlen(renderBinToString(data.renderBinMask)) + std::strlen(renderBinToString(data.renderBinMask)) ); for (SceneGraphNode* node : _topologicallySortedNodes) { diff --git a/src/scene/scene_lua.inl b/src/scene/scene_lua.inl index cc6fdcfe23..596d9ad689 100644 --- a/src/scene/scene_lua.inl +++ b/src/scene/scene_lua.inl @@ -27,12 +27,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -54,11 +56,18 @@ #include #include #include +#include #include #include #include +#include +#include +#include #include #include +#include +#include +#include namespace { @@ -231,7 +240,7 @@ bool checkUriMatchFromRegexResults(std::string_view uri, ) { const bool isGroupMode = !groupTag.empty(); - auto [parentUri, identifier, isLiteral] = regexResults; + auto& [parentUri, identifier, isLiteral] = regexResults; // Literal check if (isLiteral && uri != identifier) { diff --git a/src/scene/scenegraphnode.cpp b/src/scene/scenegraphnode.cpp index 614fe5747a..ffe720baf6 100644 --- a/src/scene/scenegraphnode.cpp +++ b/src/scene/scenegraphnode.cpp @@ -27,20 +27,32 @@ #include #include #include +#include #include #include -#include #include #include #include #include +#include +#include #include #include +#include #include #include #include #include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "SceneGraphNode"; diff --git a/src/scene/sceneinitializer.cpp b/src/scene/sceneinitializer.cpp index ba49a58c05..7bc097fe2f 100644 --- a/src/scene/sceneinitializer.cpp +++ b/src/scene/sceneinitializer.cpp @@ -29,6 +29,11 @@ #include #include #include +#include +#include +#include +#include +#include namespace openspace { diff --git a/src/scene/timeframe.cpp b/src/scene/timeframe.cpp index 5d6968a335..c5ced4b180 100644 --- a/src/scene/timeframe.cpp +++ b/src/scene/timeframe.cpp @@ -25,10 +25,11 @@ #include #include -#include #include #include +#include #include +#include namespace { constexpr openspace::properties::Property::PropertyInfo IsInTimeFrameInfo = { diff --git a/src/scene/translation.cpp b/src/scene/translation.cpp index d579346ca4..c74fdec0c8 100644 --- a/src/scene/translation.cpp +++ b/src/scene/translation.cpp @@ -24,12 +24,18 @@ #include -#include +#include #include +#include #include #include #include #include +#include +#include +#include +#include +#include namespace { struct [[codegen::Dictionary(Translation)]] Parameters { diff --git a/src/scripting/lualibrary.cpp b/src/scripting/lualibrary.cpp index 89c9f7c2a1..3e92f65e7f 100644 --- a/src/scripting/lualibrary.cpp +++ b/src/scripting/lualibrary.cpp @@ -24,7 +24,10 @@ #include +#include #include +#include +#include namespace openspace::scripting { diff --git a/src/scripting/scriptengine.cpp b/src/scripting/scriptengine.cpp index ed06101537..2d3aa9f35b 100644 --- a/src/scripting/scriptengine.cpp +++ b/src/scripting/scriptengine.cpp @@ -32,12 +32,18 @@ #include #include #include +#include #include +#include #include +#include +#include #include -#include +#include #include #include +#include +#include #include "scriptengine_lua.inl" diff --git a/src/scripting/scriptengine_lua.inl b/src/scripting/scriptengine_lua.inl index 699823fd6a..31cb80e159 100644 --- a/src/scripting/scriptengine_lua.inl +++ b/src/scripting/scriptengine_lua.inl @@ -22,6 +22,10 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include +#include +#include + namespace openspace::luascriptfunctions { int printInternal(ghoul::logging::LogLevel level, lua_State* L) { diff --git a/src/scripting/scriptscheduler.cpp b/src/scripting/scriptscheduler.cpp index 7c7540250c..7fe83cc455 100644 --- a/src/scripting/scriptscheduler.cpp +++ b/src/scripting/scriptscheduler.cpp @@ -25,10 +25,15 @@ #include #include -#include #include +#include #include #include +#include +#include +#include +#include +#include #include "scriptscheduler_lua.inl" diff --git a/src/scripting/systemcapabilitiesbinding_lua.inl b/src/scripting/systemcapabilitiesbinding_lua.inl index e0c9ef7007..1311e38a35 100644 --- a/src/scripting/systemcapabilitiesbinding_lua.inl +++ b/src/scripting/systemcapabilitiesbinding_lua.inl @@ -23,10 +23,15 @@ ****************************************************************************************/ #include +#include #include #include #include +#include #include +#include +#include +#include namespace { diff --git a/src/util/blockplaneintersectiongeometry.cpp b/src/util/blockplaneintersectiongeometry.cpp index de4d6a4728..a4bac67c4c 100644 --- a/src/util/blockplaneintersectiongeometry.cpp +++ b/src/util/blockplaneintersectiongeometry.cpp @@ -25,8 +25,10 @@ #include #include -#include #include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "BlockPlaneIntersectionGeometry"; diff --git a/src/util/boxgeometry.cpp b/src/util/boxgeometry.cpp index a5aa7e1824..2cd0057c77 100644 --- a/src/util/boxgeometry.cpp +++ b/src/util/boxgeometry.cpp @@ -24,7 +24,8 @@ #include -#include +#include +#include namespace openspace { diff --git a/src/util/collisionhelper.cpp b/src/util/collisionhelper.cpp index a2ac5a37fe..2fef716127 100644 --- a/src/util/collisionhelper.cpp +++ b/src/util/collisionhelper.cpp @@ -24,6 +24,9 @@ #include +#include +#include + namespace openspace::collision { // Source: http://paulbourke.net/geometry/circlesphere/raysphere.c diff --git a/src/util/coordinateconversion.cpp b/src/util/coordinateconversion.cpp index 28da012539..5679e22a7b 100644 --- a/src/util/coordinateconversion.cpp +++ b/src/util/coordinateconversion.cpp @@ -26,6 +26,10 @@ #include #include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "Coordinateconversion"; diff --git a/src/util/distanceconversion.cpp b/src/util/distanceconversion.cpp index a8e1250138..d4329edd74 100644 --- a/src/util/distanceconversion.cpp +++ b/src/util/distanceconversion.cpp @@ -26,6 +26,7 @@ #include #include +#include namespace openspace { @@ -34,7 +35,7 @@ std::pair simplifyDistance(double meters, { constexpr double GraceFactor = 0.5; - const double metersVal = glm::abs(meters); + const double metersVal = std::abs(meters); if (metersVal == 0.0) { return { 0.0, forceSingularForm ? "meter" : "meters"}; diff --git a/src/util/downloadeventengine.cpp b/src/util/downloadeventengine.cpp index 45773f292b..1b2bc7d1ae 100644 --- a/src/util/downloadeventengine.cpp +++ b/src/util/downloadeventengine.cpp @@ -24,6 +24,8 @@ #include +#include + namespace openspace { int DownloadEventEngine::subscribe(Callback cb) { diff --git a/src/util/dynamicfilesequencedownloader.cpp b/src/util/dynamicfilesequencedownloader.cpp index 6a3915e386..3266c41821 100644 --- a/src/util/dynamicfilesequencedownloader.cpp +++ b/src/util/dynamicfilesequencedownloader.cpp @@ -28,8 +28,22 @@ #include #include #include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include namespace { constexpr std::string_view _loggerCat = "DynamicFileSequenceDownloader"; @@ -136,7 +150,7 @@ DynamicFileSequenceDownloader::DynamicFileSequenceDownloader(int dataID, requestAvailableFiles(httpDataRequest, _syncDir); } -void DynamicFileSequenceDownloader::deinitialize(bool cacheFiles) { +void DynamicFileSequenceDownloader::deinitialize(bool cacheFiles) const { const std::vector& currentlyDownloadingFiles = filesCurrentlyDownloading(); for (File* file : currentlyDownloadingFiles) { file->download->cancel(); diff --git a/src/util/ellipsoid.cpp b/src/util/ellipsoid.cpp index fa0cd9676c..d5416cbdb3 100644 --- a/src/util/ellipsoid.cpp +++ b/src/util/ellipsoid.cpp @@ -27,7 +27,9 @@ #include #include #include -#include +#include +#include +#include namespace { constexpr size_t MaxIterations = 8; diff --git a/src/util/factorymanager.cpp b/src/util/factorymanager.cpp index 2429640535..5c4b207ba9 100644 --- a/src/util/factorymanager.cpp +++ b/src/util/factorymanager.cpp @@ -24,8 +24,6 @@ #include -#include -#include #include #include #include @@ -36,6 +34,8 @@ #include #include #include +#include +#include namespace openspace { diff --git a/src/util/geodetic.cpp b/src/util/geodetic.cpp index 1ae39f4f1a..e7fa193ee8 100644 --- a/src/util/geodetic.cpp +++ b/src/util/geodetic.cpp @@ -27,9 +27,12 @@ #include #include #include +#include #include +#include #include #include +#include namespace openspace { diff --git a/src/util/histogram.cpp b/src/util/histogram.cpp index ec21445525..04ca696fda 100644 --- a/src/util/histogram.cpp +++ b/src/util/histogram.cpp @@ -26,7 +26,10 @@ #include #include +#include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "Histogram"; @@ -203,7 +206,7 @@ const float* Histogram::data() const { std::vector> Histogram::getDecimated(int) const { // Return a copy of _data decimated as in Ljung 2004 - return std::vector>(); + return std::vector>(); } void Histogram::normalize() { diff --git a/src/util/httprequest.cpp b/src/util/httprequest.cpp index 53a47585e4..7214bb07de 100644 --- a/src/util/httprequest.cpp +++ b/src/util/httprequest.cpp @@ -24,10 +24,13 @@ #include -#include #include +#include #include +#include #include +#include +#include namespace openspace { @@ -251,8 +254,6 @@ bool HttpDownload::teardown() { return true; } - - std::atomic_int HttpFileDownload::nCurrentFileHandles = 0; std::mutex HttpFileDownload::_directoryCreationMutex; diff --git a/src/util/json_helper.cpp b/src/util/json_helper.cpp index 3476a00dda..4d0b986fb4 100644 --- a/src/util/json_helper.cpp +++ b/src/util/json_helper.cpp @@ -24,7 +24,12 @@ #include +#include +#include +#include #include +#include +#include namespace openspace { diff --git a/src/util/openspacemodule.cpp b/src/util/openspacemodule.cpp index 1f92ae61d4..0b5d80b699 100644 --- a/src/util/openspacemodule.cpp +++ b/src/util/openspacemodule.cpp @@ -33,6 +33,8 @@ #include #include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "OpenSpaceModule"; diff --git a/src/util/planegeometry.cpp b/src/util/planegeometry.cpp index bc62e1ed89..56cdd2850e 100644 --- a/src/util/planegeometry.cpp +++ b/src/util/planegeometry.cpp @@ -24,7 +24,9 @@ #include -#include +#include +#include +#include namespace openspace { diff --git a/src/util/progressbar.cpp b/src/util/progressbar.cpp index 4251da9853..4c9d2aae99 100644 --- a/src/util/progressbar.cpp +++ b/src/util/progressbar.cpp @@ -25,6 +25,7 @@ #include #include +#include namespace openspace { diff --git a/src/util/resourcesynchronization.cpp b/src/util/resourcesynchronization.cpp index ecf6b6e3da..6ac5a6f4be 100644 --- a/src/util/resourcesynchronization.cpp +++ b/src/util/resourcesynchronization.cpp @@ -24,11 +24,13 @@ #include -#include +#include #include +#include #include #include #include +#include namespace { struct [[codegen::Dictionary(ResourceSynchronization)]] Parameters { diff --git a/src/util/sphere.cpp b/src/util/sphere.cpp index 94b5c588a4..72e7803f36 100644 --- a/src/util/sphere.cpp +++ b/src/util/sphere.cpp @@ -25,11 +25,12 @@ #include #include -#include +#include #include +#include namespace { - constexpr std::string_view _loggerCat = "PowerScaledSphere"; + constexpr std::string_view _loggerCat = "Sphere"; } // namespace namespace openspace { diff --git a/src/util/spicemanager.cpp b/src/util/spicemanager.cpp index 8a6e50e2af..71606eb710 100644 --- a/src/util/spicemanager.cpp +++ b/src/util/spicemanager.cpp @@ -28,10 +28,17 @@ #include #include #include +#include #include #include +#include +#include +#include #include #include +#include +#include +#include #include "spicemanager_lua.inl" @@ -60,6 +67,25 @@ namespace { default: throw ghoul::MissingCaseException(); } } + + + void getValueInternal(const std::string& body, const std::string& value, int size, + double* v) + { + ghoul_assert(!body.empty(), "Empty body"); + ghoul_assert(!value.empty(), "Empty value"); + ghoul_assert(v != nullptr, "Empty value pointer"); + + SpiceInt n = 0; + bodvrd_c(body.c_str(), value.c_str(), size, &n, v); + + if (failed_c()) { + openspace::throwSpiceError(std::format( + "Error getting value '{}' for body '{}'", value, body + )); + } + } + } // namespace namespace openspace { @@ -533,23 +559,6 @@ bool SpiceManager::hasFrameId(const std::string& frame) const { return id != 0; } -void getValueInternal(const std::string& body, const std::string& value, int size, - double* v) -{ - ghoul_assert(!body.empty(), "Empty body"); - ghoul_assert(!value.empty(), "Empty value"); - ghoul_assert(v != nullptr, "Empty value pointer"); - - SpiceInt n = 0; - bodvrd_c(body.c_str(), value.c_str(), size, &n, v); - - if (failed_c()) { - throwSpiceError( - std::format("Error getting value '{}' for body '{}'", value, body) - ); - } -} - void SpiceManager::getValue(const std::string& body, const std::string& value, double& v) const { diff --git a/src/util/spicemanager_lua.inl b/src/util/spicemanager_lua.inl index 18d044ee42..ede83808bf 100644 --- a/src/util/spicemanager_lua.inl +++ b/src/util/spicemanager_lua.inl @@ -22,9 +22,16 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include #include #include +#include +#include #include +#include +#include +#include +#include namespace { diff --git a/src/util/syncable.cpp b/src/util/syncable.cpp new file mode 100644 index 0000000000..b9b587dbc2 --- /dev/null +++ b/src/util/syncable.cpp @@ -0,0 +1,33 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2025 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#include + +namespace openspace { + +void Syncable::preSync(bool) {} + +void Syncable::postSync(bool) {} + +} // namespace openspace diff --git a/src/util/syncbuffer.cpp b/src/util/syncbuffer.cpp index a4a012a487..f528e0440b 100644 --- a/src/util/syncbuffer.cpp +++ b/src/util/syncbuffer.cpp @@ -24,7 +24,11 @@ #include +#include #include +#include +#include +#include namespace openspace { @@ -45,13 +49,13 @@ void SyncBuffer::encode(const std::string& s) { } int32_t length = static_cast(s.size() * sizeof(char)); - memcpy( + std::memcpy( _dataStream.data() + _encodeOffset, reinterpret_cast(&length), sizeof(int32_t) ); _encodeOffset += sizeof(int32_t); - memcpy(_dataStream.data() + _encodeOffset, s.c_str(), length); + std::memcpy(_dataStream.data() + _encodeOffset, s.c_str(), length); _encodeOffset += length; } diff --git a/src/util/task.cpp b/src/util/task.cpp index 3c0d5e902c..8bd29f732f 100644 --- a/src/util/task.cpp +++ b/src/util/task.cpp @@ -25,10 +25,10 @@ #include #include -#include #include #include #include +#include namespace { diff --git a/src/util/taskloader.cpp b/src/util/taskloader.cpp index fb30a31977..32a5d87bdc 100644 --- a/src/util/taskloader.cpp +++ b/src/util/taskloader.cpp @@ -29,9 +29,13 @@ #include #include #include +#include #include +#include #include #include +#include +#include namespace { constexpr std::string_view _loggerCat = "TaskRunner"; diff --git a/src/util/threadpool.cpp b/src/util/threadpool.cpp index d8ccccfd7d..4defbf2ee9 100644 --- a/src/util/threadpool.cpp +++ b/src/util/threadpool.cpp @@ -24,29 +24,31 @@ #include +#include + namespace openspace { -Worker::Worker(ThreadPool& p) : pool(p) {} +Worker::Worker(ThreadPool& p) : _pool(p) {} void Worker::operator()() { std::function task; while (true) { { - std::unique_lock lock(pool.queue_mutex); + std::unique_lock lock(_pool._queueMutex); // look for a work item - while (!pool.stop && pool.tasks.empty()) { + while (!_pool._shouldStop && _pool._tasks.empty()) { // if there are none wait for notification - pool.condition.wait(lock); + _pool._condition.wait(lock); } - if (pool.stop) { // exit if the pool is stopped + if (_pool._shouldStop) { // exit if the pool is stopped return; } // get the task from the queue - task = pool.tasks.front(); - pool.tasks.pop_front(); + task = _pool._tasks.front(); + _pool._tasks.pop_front(); } // execute the task @@ -54,25 +56,25 @@ void Worker::operator()() { } } -ThreadPool::ThreadPool(size_t numThreads) : stop(false) { +ThreadPool::ThreadPool(size_t numThreads) { for (size_t i = 0; i < numThreads; i++) { - workers.emplace_back(Worker(*this)); + _workers.emplace_back(Worker(*this)); } } -ThreadPool::ThreadPool(const ThreadPool& toCopy) : ThreadPool(toCopy.workers.size()) {} +ThreadPool::ThreadPool(const ThreadPool& toCopy) : ThreadPool(toCopy._workers.size()) {} // the destructor joins all threads ThreadPool::~ThreadPool() { // stop all threads { - const std::unique_lock lock(queue_mutex); - stop = true; + const std::unique_lock lock(_queueMutex); + _shouldStop = true; } - condition.notify_all(); + _condition.notify_all(); // join them - for (std::thread& w : workers) { + for (std::thread& w : _workers) { w.join(); } } @@ -80,23 +82,23 @@ ThreadPool::~ThreadPool() { // add new work item to the pool void ThreadPool::enqueue(std::function f) { { - const std::unique_lock lock(queue_mutex); + const std::unique_lock lock(_queueMutex); // add the task - tasks.push_back(std::move(f)); + _tasks.push_back(std::move(f)); } // wake up one thread - condition.notify_one(); + _condition.notify_one(); } void ThreadPool::clearTasks() { - const std::unique_lock lock(queue_mutex); - tasks.clear(); + const std::unique_lock lock(_queueMutex); + _tasks.clear(); } bool ThreadPool::hasOutstandingTasks() const { - return !tasks.empty(); + return !_tasks.empty(); } } // namespace openspace diff --git a/src/util/time.cpp b/src/util/time.cpp index 9600ed863a..2a28d56fbf 100644 --- a/src/util/time.cpp +++ b/src/util/time.cpp @@ -25,18 +25,18 @@ #include #include -#include -#include #include #include #include #include -#include #include #include +#include #include #include +#include #include +#include #include #include diff --git a/src/util/time_lua.inl b/src/util/time_lua.inl index b8c705ccc8..8557b952fd 100644 --- a/src/util/time_lua.inl +++ b/src/util/time_lua.inl @@ -22,8 +22,18 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include +#include +#include #include +#include #include +#include +#include +#include +#include +#include +#include namespace { diff --git a/src/util/timeconversion.cpp b/src/util/timeconversion.cpp index 0e6c1ae35f..6078ab4d3f 100644 --- a/src/util/timeconversion.cpp +++ b/src/util/timeconversion.cpp @@ -24,11 +24,14 @@ #include +#include +#include + namespace { std::pair extractUnit(double seconds) { using namespace openspace; - const double secondsVal = glm::abs(seconds); + const double secondsVal = std::abs(seconds); if (secondsVal == 0.0) { return { 0.0, TimeUnit::Second }; diff --git a/src/util/timemanager.cpp b/src/util/timemanager.cpp index c0fa5ab847..f3d3b8743c 100644 --- a/src/util/timemanager.cpp +++ b/src/util/timemanager.cpp @@ -27,14 +27,27 @@ #include #include #include +#include #include #include #include +#include #include #include #include +#include #include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "TimeManager"; diff --git a/src/util/timerange.cpp b/src/util/timerange.cpp index 27d9240b60..0035fed794 100644 --- a/src/util/timerange.cpp +++ b/src/util/timerange.cpp @@ -25,9 +25,9 @@ #include #include -#include #include #include +#include namespace { struct [[codegen::Dictionary(TimeRange)]] Parameters { diff --git a/src/util/touch.cpp b/src/util/touch.cpp index 2f2c5bd4e2..ed627ce286 100644 --- a/src/util/touch.cpp +++ b/src/util/touch.cpp @@ -27,6 +27,7 @@ #include #include #include +#include namespace openspace { diff --git a/src/util/transformationmanager.cpp b/src/util/transformationmanager.cpp index f05b888f49..4f3a55210a 100644 --- a/src/util/transformationmanager.cpp +++ b/src/util/transformationmanager.cpp @@ -55,8 +55,8 @@ TransformationManager::TransformationManager() { ); #endif _kameleonFrames = { - "J2000", "GEI", "GEO", "MAG", "GSE", "GSM", "SM", "RTN", "GSEQ", //geocentric - "HEE", "HAE", "HEEQ" //heliocentric + "J2000", "GEI", "GEO", "MAG", "GSE", "GSM", "SM", "RTN", "GSEQ", // geocentric + "HEE", "HAE", "HEEQ" // heliocentric }; } @@ -110,9 +110,9 @@ glm::dmat3 TransformationManager::kameleonTransformationMatrix( out1.c0, out1.c1, out1.c2, out2.c0, out2.c1, out2.c2 ); -#else +#else // ^^^^ OPENSPACE_MODULE_KAMELEON_ENABLED // !OPENSPACE_MODULE_KAMELEON_ENABLED vvvv return glm::dmat3(0.0); -#endif +#endif // OPENSPACE_MODULE_KAMELEON_ENABLED } glm::dmat3 TransformationManager::frameTransformationMatrix( @@ -122,13 +122,13 @@ glm::dmat3 TransformationManager::frameTransformationMatrix( { #ifdef OPENSPACE_MODULE_KAMELEON_ENABLED auto fromit = _kameleonFrames.find(from); - auto toit = _kameleonFrames.find(to); + auto toit = _kameleonFrames.find(to); - bool fromKameleon = (fromit != _kameleonFrames.end()); - bool toKameleon = (toit != _kameleonFrames.end()); + bool fromKameleon = (fromit != _kameleonFrames.end()); + bool toKameleon = (toit != _kameleonFrames.end()); if (!fromKameleon && !toKameleon) { - return SpiceManager::ref().frameTransformationMatrix(from, to, ephemerisTime); + return SpiceManager::ref().frameTransformationMatrix(from, to, ephemerisTime); } if (fromKameleon && toKameleon) { @@ -162,12 +162,12 @@ glm::dmat3 TransformationManager::frameTransformationMatrix( return kameleonTransformation*spiceTransformation; } -#else +#else // ^^^^ OPENSPACE_MODULE_KAMELEON_ENABLED // !OPENSPACE_MODULE_KAMELEON_ENABLED vvvv LERRORC( "TransformationManager", "Can not transform dynamic frames without kameleon module enabled" ); -#endif +#endif // OPENSPACE_MODULE_KAMELEON_ENABLED return glm::dmat3(1.0); } diff --git a/src/util/tstring.cpp b/src/util/tstring.cpp index ef3ed28bd7..f8f9b01069 100644 --- a/src/util/tstring.cpp +++ b/src/util/tstring.cpp @@ -26,6 +26,7 @@ #include #include +#include namespace openspace { diff --git a/src/util/universalhelpers.cpp b/src/util/universalhelpers.cpp index d52b2e0e7c..55f0bddbdf 100644 --- a/src/util/universalhelpers.cpp +++ b/src/util/universalhelpers.cpp @@ -24,6 +24,9 @@ #include +#include +#include + namespace openspace::helpers { double shiftAndScale(double t, double start, double end) { diff --git a/src/util/versionchecker.cpp b/src/util/versionchecker.cpp index 76777137bd..d61110ce80 100644 --- a/src/util/versionchecker.cpp +++ b/src/util/versionchecker.cpp @@ -34,6 +34,11 @@ #include #include #include +#include +#include +#include +#include +#include namespace { constexpr std::string_view _loggerCat = "VersionChecker"; @@ -91,58 +96,61 @@ void VersionChecker::cancel() { if (_latestVersion.has_value()) { return true; } - if (_request) { - if (_request->hasSucceeded()) { - _request->wait(); - std::vector data = _request->downloadedData(); - const std::string versionString(data.begin(), data.end()); - std::istringstream versionData(versionString); - - std::string token; - ghoul::getline(versionData, token, '.'); - const int major = std::atoi(token.c_str()); - ghoul::getline(versionData, token, '.'); - const int minor = std::atoi(token.c_str()); - ghoul::getline(versionData, token, '.'); - const int patch = std::atoi(token.c_str()); - - _latestVersion = { major, minor, patch }; - _request = nullptr; - - SemanticVersion currentVersion{ - OPENSPACE_VERSION_MAJOR, - OPENSPACE_VERSION_MINOR, - OPENSPACE_VERSION_PATCH - }; - - if (currentVersion < _latestVersion) { - LINFO(std::format( - "Newer OpenSpace version {}.{}.{} is available. " - "Currently running {}.{}.{}", - _latestVersion->major, - _latestVersion->minor, - _latestVersion->patch, - currentVersion.major, - currentVersion.minor, - currentVersion.patch - )); - } - return true; - } - if (_request->hasFailed()) { - _request->cancel(); - _request->wait(); - std::vector data = _request->downloadedData(); - const std::string response = std::string(data.begin(), data.end()); - LWARNING(std::format( - "Failed to get OpenSpace version information from {}. Response: {}", - _request->url(), - response - )); - _request = nullptr; - return false; - } + if (!_request) { + return false; } + + if (_request->hasSucceeded()) { + _request->wait(); + std::vector data = _request->downloadedData(); + const std::string versionString(data.begin(), data.end()); + std::istringstream versionData(versionString); + + std::string token; + ghoul::getline(versionData, token, '.'); + const int major = std::atoi(token.c_str()); + ghoul::getline(versionData, token, '.'); + const int minor = std::atoi(token.c_str()); + ghoul::getline(versionData, token, '.'); + const int patch = std::atoi(token.c_str()); + + _latestVersion = { major, minor, patch }; + _request = nullptr; + + SemanticVersion currentVersion{ + OPENSPACE_VERSION_MAJOR, + OPENSPACE_VERSION_MINOR, + OPENSPACE_VERSION_PATCH + }; + + if (currentVersion < _latestVersion) { + LINFO(std::format( + "Newer OpenSpace version {}.{}.{} is available. " + "Currently running {}.{}.{}", + _latestVersion->major, + _latestVersion->minor, + _latestVersion->patch, + currentVersion.major, + currentVersion.minor, + currentVersion.patch + )); + } + return true; + } + + if (_request->hasFailed()) { + _request->cancel(); + _request->wait(); + std::vector data = _request->downloadedData(); + const std::string response = std::string(data.begin(), data.end()); + LWARNING(std::format( + "Failed to get OpenSpace version information from {}. Response: {}", + _request->url(), response + )); + _request = nullptr; + return false; + } + return false; } diff --git a/support/coding/codegen b/support/coding/codegen index fc88af99c9..2a78626025 160000 --- a/support/coding/codegen +++ b/support/coding/codegen @@ -1 +1 @@ -Subproject commit fc88af99c94d344ea913de4dc4c01f82e8537ff5 +Subproject commit 2a78626025db89e211ec6dd60e02969751246531 From 00bf492c8bf9025c26cdeb4d7ca1a876548d1b8e Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Tue, 16 Dec 2025 15:46:45 +0100 Subject: [PATCH 36/43] Prevent crash when a session recording includes a malformed setPropertyValue --- src/interaction/sessionrecordinghandler.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/interaction/sessionrecordinghandler.cpp b/src/interaction/sessionrecordinghandler.cpp index 0141639b65..ce197a4453 100644 --- a/src/interaction/sessionrecordinghandler.cpp +++ b/src/interaction/sessionrecordinghandler.cpp @@ -677,7 +677,10 @@ void SessionRecordingHandler::checkIfScriptUsesScenegraphNode( else { // There were no closing quotes so we remove as much as possible constexpr std::string_view UnwantedChars = " );"; - s.remove_suffix(s.find_last_not_of(UnwantedChars)); + size_t i = s.find_last_not_of(UnwantedChars); + if (i != std::string_view::npos) { + s.remove_suffix(i); + } return s; } }; From a8d16de652bc991b8942ab28ae4cebf7e8963b16 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Tue, 16 Dec 2025 15:47:08 +0100 Subject: [PATCH 37/43] Remove unused keyframe time reference modes --- include/openspace/navigation/keyframenavigator.h | 9 +-------- src/interaction/sessionrecordinghandler.cpp | 3 +-- src/navigation/keyframenavigator.cpp | 15 ++------------- 3 files changed, 4 insertions(+), 23 deletions(-) diff --git a/include/openspace/navigation/keyframenavigator.h b/include/openspace/navigation/keyframenavigator.h index 516ee42a1e..3e93b81f04 100644 --- a/include/openspace/navigation/keyframenavigator.h +++ b/include/openspace/navigation/keyframenavigator.h @@ -38,12 +38,6 @@ namespace openspace { namespace openspace::interaction { -enum class KeyframeTimeRef { - Relative_applicationStart, - Relative_recordedStart, - Absolute_simTimeJ2000 -}; - class KeyframeNavigator { public: BooleanType(Inclusive); @@ -79,11 +73,10 @@ public: void clearKeyframes(); size_t nKeyframes() const; double currentTime() const; - void setTimeReferenceMode(KeyframeTimeRef refType, double referenceTimestamp); + void setReferenceTime(double referenceTimestamp); private: Timeline _cameraPoseTimeline; - KeyframeTimeRef _timeframeMode = KeyframeTimeRef::Relative_applicationStart; double _referenceTimestamp = 0.0; }; diff --git a/src/interaction/sessionrecordinghandler.cpp b/src/interaction/sessionrecordinghandler.cpp index ce197a4453..59157a8bd9 100644 --- a/src/interaction/sessionrecordinghandler.cpp +++ b/src/interaction/sessionrecordinghandler.cpp @@ -446,8 +446,7 @@ void SessionRecordingHandler::setupPlayback(double startTime) { _playback.saveScreenshots.currentRecordedTime = std::chrono::steady_clock::now(); _playback.saveScreenshots.currentApplicationTime = global::windowDelegate->applicationTime(); - global::navigationHandler->keyframeNavigator().setTimeReferenceMode( - KeyframeTimeRef::Relative_recordedStart, startTime); + global::navigationHandler->keyframeNavigator().setReferenceTime(startTime); auto firstCamera = _timeline.entries.begin(); diff --git a/src/navigation/keyframenavigator.cpp b/src/navigation/keyframenavigator.cpp index ab96db4cb9..e6315a99c2 100644 --- a/src/navigation/keyframenavigator.cpp +++ b/src/navigation/keyframenavigator.cpp @@ -160,21 +160,10 @@ void KeyframeNavigator::updateCamera(Camera* camera, const CameraPose& prevPose, } double KeyframeNavigator::currentTime() const { - if (_timeframeMode == KeyframeTimeRef::Relative_recordedStart) { - return (global::windowDelegate->applicationTime() - _referenceTimestamp); - } - else if (_timeframeMode == KeyframeTimeRef::Absolute_simTimeJ2000) { - return global::timeManager->time().j2000Seconds(); - } - else { - return global::windowDelegate->applicationTime(); - } + return (global::windowDelegate->applicationTime() - _referenceTimestamp); } -void KeyframeNavigator::setTimeReferenceMode(KeyframeTimeRef refType, - double referenceTimestamp) -{ - _timeframeMode = refType; +void KeyframeNavigator::setReferenceTime(double referenceTimestamp) { _referenceTimestamp = referenceTimestamp; } From 89f449212c57c153fc40c0498c6de61d1a15ffdb Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Tue, 16 Dec 2025 17:07:33 +0100 Subject: [PATCH 38/43] Replace Celestrak with non-HTTPS and using the .org TLD --- .../planets/earth/satellites/communications/amateur.asset | 2 +- .../earth/satellites/communications/experimental.asset | 2 +- .../earth/satellites/communications/geostationary.asset | 2 +- .../planets/earth/satellites/communications/globalstar.asset | 2 +- .../planets/earth/satellites/communications/gorizont.asset | 2 +- .../planets/earth/satellites/communications/intelsat.asset | 2 +- .../planets/earth/satellites/communications/iridium.asset | 2 +- .../earth/satellites/communications/iridium_next.asset | 2 +- .../planets/earth/satellites/communications/molniya.asset | 2 +- .../planets/earth/satellites/communications/orbcomm.asset | 2 +- .../planets/earth/satellites/communications/other_comm.asset | 2 +- .../planets/earth/satellites/communications/raduga.asset | 2 +- .../planets/earth/satellites/communications/ses.asset | 2 +- .../planets/earth/satellites/communications/starlink.asset | 2 +- .../planets/earth/satellites/debris/debris_breezem.asset | 2 +- .../planets/earth/satellites/debris/debris_fengyun.asset | 2 +- .../planets/earth/satellites/debris/debris_iridium33.asset | 2 +- .../planets/earth/satellites/debris/debris_kosmos2251.asset | 2 +- .../solarsystem/planets/earth/satellites/misc/active.asset | 2 +- .../solarsystem/planets/earth/satellites/misc/brightest.asset | 2 +- .../solarsystem/planets/earth/satellites/misc/cubesats.asset | 2 +- .../planets/earth/satellites/misc/hubble_trail.asset | 2 +- .../scene/solarsystem/planets/earth/satellites/misc/iss.asset | 4 ++-- .../solarsystem/planets/earth/satellites/misc/military.asset | 2 +- .../solarsystem/planets/earth/satellites/misc/other.asset | 2 +- .../solarsystem/planets/earth/satellites/misc/radar.asset | 2 +- .../planets/earth/satellites/misc/spacestations.asset | 2 +- .../solarsystem/planets/earth/satellites/misc/tiangong.asset | 2 +- .../solarsystem/planets/earth/satellites/misc/tle-new.asset | 2 +- .../planets/earth/satellites/navigation/beidou.asset | 2 +- .../planets/earth/satellites/navigation/galileo.asset | 2 +- .../planets/earth/satellites/navigation/glosnass.asset | 2 +- .../solarsystem/planets/earth/satellites/navigation/gps.asset | 2 +- .../planets/earth/satellites/navigation/musson.asset | 2 +- .../planets/earth/satellites/navigation/nnss.asset | 2 +- .../planets/earth/satellites/navigation/sbas.asset | 2 +- .../planets/earth/satellites/science/education.asset | 2 +- .../planets/earth/satellites/science/engineering.asset | 2 +- .../planets/earth/satellites/science/geodetic.asset | 2 +- .../planets/earth/satellites/science/spaceearth.asset | 2 +- .../solarsystem/planets/earth/satellites/weather/aqua.asset | 2 +- .../solarsystem/planets/earth/satellites/weather/argos.asset | 2 +- .../solarsystem/planets/earth/satellites/weather/dmc.asset | 2 +- .../planets/earth/satellites/weather/earth_resources.asset | 2 +- .../solarsystem/planets/earth/satellites/weather/goes.asset | 2 +- .../solarsystem/planets/earth/satellites/weather/noaa.asset | 2 +- .../solarsystem/planets/earth/satellites/weather/planet.asset | 2 +- .../solarsystem/planets/earth/satellites/weather/sarsat.asset | 2 +- .../solarsystem/planets/earth/satellites/weather/snpp.asset | 2 +- .../solarsystem/planets/earth/satellites/weather/spire.asset | 2 +- .../solarsystem/planets/earth/satellites/weather/tdrss.asset | 2 +- .../solarsystem/planets/earth/satellites/weather/terra.asset | 2 +- .../planets/earth/satellites/weather/weather.asset | 2 +- 53 files changed, 54 insertions(+), 54 deletions(-) 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 b46ed23b85..84cb720794 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/amateur.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/amateur.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Amateur Radio)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_amateur_radio", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=amateur&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=amateur&FORMAT=kvn", Filename = "amateur.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 2696e21905..a61fb5e3ee 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/experimental.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/experimental.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Experimental)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_x-comm", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=x-comm&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=x-comm&FORMAT=kvn", Filename = "x-comm.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 67e814edc4..92eadb231b 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/geostationary.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/geostationary.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Geostationary)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_geo", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=geo&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=geo&FORMAT=kvn", Filename = "geo.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 3ea3ade5a0..40b650fd12 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/globalstar.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/globalstar.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (GlobalStar)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_globalstar", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=globalstar&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=globalstar&FORMAT=kvn", Filename = "globalstar.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 0b3858db90..1939d3c789 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/gorizont.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/gorizont.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Gorizont)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_gorizont", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=gorizont&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=gorizont&FORMAT=kvn", Filename = "gorizont.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 74246f3bd5..323c7d0cdd 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/intelsat.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/intelsat.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Intelsat)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_intelsat", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=intelsat&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=intelsat&FORMAT=kvn", Filename = "intelsat.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 9588ffbd7b..3aac4b67a9 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/iridium.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/iridium.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Iridium)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_iridium", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=iridium&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=iridium&FORMAT=kvn", Filename = "iridium.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 1d632a70d9..8c1c25112f 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 @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Iridium NEXT)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_iridium-NEXT", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=iridium-NEXT&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=iridium-NEXT&FORMAT=kvn", Filename = "iridium-NEXT.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 5f15a1695e..912a3114ae 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/molniya.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/molniya.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Molniya)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_molniya", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=molniya&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=molniya&FORMAT=kvn", Filename = "molniya.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 bd0fc73554..0566d0e772 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/orbcomm.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/orbcomm.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Orbcomm)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_orbcomm", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=orbcomm&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=orbcomm&FORMAT=kvn", Filename = "orbcomm.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 b3ad87f9e8..1d2303a8b1 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 @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Other comm)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_other-comm", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=other-comm&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=other-comm&FORMAT=kvn", Filename = "other-comm.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 645d481fac..261a3c740c 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/raduga.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/raduga.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Raduga)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_raduga", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=raduga&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=raduga&FORMAT=kvn", Filename = "raduga.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 a0cce6703a..5f8eba3ccc 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/ses.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/ses.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (SES)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_ses", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=ses&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=ses&FORMAT=kvn", Filename = "ses.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 0797b0b5eb..25b24fb6b4 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/starlink.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/starlink.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Starlink)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_starlink", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=starlink&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=starlink&FORMAT=kvn", Filename = "starlink.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 6325970fc4..c88a012901 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 @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Breeze-M Breakup)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_2012-044", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?INTDES=2012-044&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?INTDES=2012-044&FORMAT=kvn", Filename = "2012-044.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 6b082194a9..a55db8dd6d 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 @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Fengyun Debris)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_1999-025", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?INTDES=1999-025&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?INTDES=1999-025&FORMAT=kvn", Filename = "1999-025.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 3cbefd817d..3608d0cc2e 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 @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Iridium 33 Debris)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_iridium-33-debris", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=iridium-33-debris&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=iridium-33-debris&FORMAT=kvn", Filename = "iridium-33-debris.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 71949a168f..bd2c2fe85b 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 @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Kosmos 2251 Debris)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_cosmos-2251-debris", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=cosmos-2251-debris&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=cosmos-2251-debris&FORMAT=kvn", Filename = "cosmos-2251-debris.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 f24b1331bf..b1f2f8061a 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/active.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/active.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Active)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_active", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=active&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=active&FORMAT=kvn", Filename = "active.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 31941a1481..c443c3ba29 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/brightest.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/brightest.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (100 Brightest)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_visual", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=visual&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=visual&FORMAT=kvn", Filename = "visual.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 5c769c5cf2..ede6bac24e 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/cubesats.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/cubesats.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (CubeSat)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_cubesat", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=cubesat&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=cubesat&FORMAT=kvn", Filename = "cubesat.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 9849267e6f..f966920f25 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 @@ -7,7 +7,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Hubble)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_hst", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?CATNR=20580&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?CATNR=20580&FORMAT=kvn", Filename = "hst.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 abb3ee01e5..22e74c1790 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset @@ -22,7 +22,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (ISS)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_iss", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?CATNR=25544&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?CATNR=25544&FORMAT=kvn", Filename = "ISS.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) @@ -31,7 +31,7 @@ local tle = asset.resource({ Name = "Satellite TLE Data (ISS)", Type = "UrlSynchronization", Identifier = "satellite_tle_data_iss", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?CATNR=25544&FORMAT=tle", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?CATNR=25544&FORMAT=tle", Filename = "ISS.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 1a5bade094..0e154055c9 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/military.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/military.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Military)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_military", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=military&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=military&FORMAT=kvn", Filename = "military.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 2521eaf549..fff55f126f 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/other.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/other.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Other)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_other", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=other&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=other&FORMAT=kvn", Filename = "other.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 ef0cbd1306..df2292b30e 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/radar.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/radar.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Radar Calibration)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_radar", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=radar&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=radar&FORMAT=kvn", Filename = "radar.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 63c5cd5a7a..ae8f917961 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/spacestations.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/spacestations.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (SpaceStations)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_stations", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=stations&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=stations&FORMAT=kvn", Filename = "stations.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/misc/tiangong.asset b/data/assets/scene/solarsystem/planets/earth/satellites/misc/tiangong.asset index 4cc73cf686..2464778e91 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/tiangong.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/tiangong.asset @@ -14,7 +14,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Tiangong)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_tiangong", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?CATNR=48274&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?CATNR=48274&FORMAT=kvn", Filename = "Tiangong.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 8e34e99bfc..71db6c8a07 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 @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Last 30 Days)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_tle-new", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=last-30-days&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=last-30-days&FORMAT=kvn", Filename = "tle-new.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 8770680ded..554473c031 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/beidou.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/beidou.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Beidou)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_beidou", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=beidou&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=beidou&FORMAT=kvn", Filename = "beidou.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 a13e237a8c..038eb5212d 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/galileo.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/galileo.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Galileo)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_galileo", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=galileo&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=galileo&FORMAT=kvn", Filename = "galileo.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 06b3e20dd6..25a69f9155 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/glosnass.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/glosnass.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Glosnass)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_glo-ops", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=glo-ops&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=glo-ops&FORMAT=kvn", Filename = "glo-ops.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 796dd46f0c..9017679085 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/gps.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/gps.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (GPS)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_gps-ops", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=gps-ops&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=gps-ops&FORMAT=kvn", Filename = "gps-ops.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 1123530e2e..72795868fa 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/musson.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/musson.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Russian LEO Navigation)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_musson", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=musson&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=musson&FORMAT=kvn", Filename = "musson.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 a18fbb2aef..d90da2eca3 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/nnss.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/nnss.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Navy Navigation Satellite System)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_nnss", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=nnss&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=nnss&FORMAT=kvn", Filename = "nnss.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 c2d1883ec3..9debc8ab5b 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/sbas.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/sbas.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Satellite Based Augmentation System)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_sbas", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=sbas&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=sbas&FORMAT=kvn", Filename = "sbas.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 7d7cd0165b..17daff8969 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/science/education.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/science/education.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Education)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_education", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=education&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=education&FORMAT=kvn", Filename = "education.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 65d74ea8aa..d8f55c4ec8 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/science/engineering.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/science/engineering.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Engineering)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_engineering", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=engineering&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=engineering&FORMAT=kvn", Filename = "engineering.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 a8dcb6d935..df804f06f2 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/science/geodetic.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/science/geodetic.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Geodetic)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_geodetic", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=geodetic&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=geodetic&FORMAT=kvn", Filename = "geodetic.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 89fa152d9e..9d789e7fe9 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/science/spaceearth.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/science/spaceearth.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Space & Earth Science)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_science", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=science&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=science&FORMAT=kvn", Filename = "science.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 f5c0123979..eb81d65917 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/aqua.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/aqua.asset @@ -7,7 +7,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Aqua)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_aqua", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?CATNR=27424&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?CATNR=27424&FORMAT=kvn", Filename = "Aqua.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 6f5871d6ac..4f10f2b38c 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/argos.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/argos.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (ARGOS)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_argos", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=argos&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=argos&FORMAT=kvn", Filename = "argos.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 f7810d2894..e9819a8461 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/dmc.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/dmc.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Disaster Monitoring)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_dmc", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=dmc&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=dmc&FORMAT=kvn", Filename = "dmc.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 22de3bad19..cdc444f443 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 @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Earth Resources)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_resource", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=resource&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=resource&FORMAT=kvn", Filename = "resource.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 b43d3205ae..35e600fa60 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/goes.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/goes.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (GOES)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_goes", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=goes&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=goes&FORMAT=kvn", Filename = "goes.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 77227dcbeb..b746aa5ab2 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/noaa.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/noaa.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (NOAA)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_noaa", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=noaa&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=noaa&FORMAT=kvn", Filename = "noaa.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 99dfc5fa0d..5ee54f5cbf 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/planet.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/planet.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Planet)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_planet", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=planet&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=planet&FORMAT=kvn", Filename = "planet.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 e7fa6f5132..afd57317e0 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/sarsat.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/sarsat.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Search & Rescue (SARSAT))", Type = "UrlSynchronization", Identifier = "satellite_omm_data_sarsat", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=sarsat&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=sarsat&FORMAT=kvn", Filename = "sarsat.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 b3bac7fb97..7830e78af0 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/snpp.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/snpp.asset @@ -7,7 +7,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (SNPP)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_snpp", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?CATNR=37849&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?CATNR=37849&FORMAT=kvn", Filename = "SNPP.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 38174babb3..b79b391e0a 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/spire.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/spire.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Spire)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_spire", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=spire&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=spire&FORMAT=kvn", Filename = "spire.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 d1f8a5cee4..0d8b28e459 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/tdrss.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/tdrss.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Tracking and Data Relay Satellite System (TDRSS))", Type = "UrlSynchronization", Identifier = "satellite_omm_data_tdrss", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=tdrss&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=tdrss&FORMAT=kvn", Filename = "tdrss.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 4e6e7c860b..37ed734f01 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/terra.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/terra.asset @@ -7,7 +7,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Terra)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_terra", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?CATNR=25994&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?CATNR=25994&FORMAT=kvn", Filename = "Terra.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) 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 bddba2caa1..52b3d5df2a 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/weather.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/weather.asset @@ -6,7 +6,7 @@ local omm = asset.resource({ Name = "Satellite OMM Data (Weather)", Type = "UrlSynchronization", Identifier = "satellite_omm_data_weather", - Url = "https://www.celestrak.com/NORAD/elements/gp.php?GROUP=weather&FORMAT=kvn", + Url = "http://www.celestrak.org/NORAD/elements/gp.php?GROUP=weather&FORMAT=kvn", Filename = "weather.txt", SecondsUntilResync = openspace.time.secondsPerDay() }) From c14be1f91f19b2189379e09c1a4c52b5ea420cd9 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Tue, 16 Dec 2025 22:27:34 +0100 Subject: [PATCH 39/43] Using std string in verifiers --- include/openspace/documentation/verifier.inl | 50 +++++++++++--------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/include/openspace/documentation/verifier.inl b/include/openspace/documentation/verifier.inl index 635443af72..d676befb0c 100644 --- a/include/openspace/documentation/verifier.inl +++ b/include/openspace/documentation/verifier.inl @@ -22,12 +22,15 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include #include #include #include #include #include +#include #include +#include namespace openspace::documentation { @@ -72,7 +75,7 @@ TestResult TemplateVerifier::operator()(const ghoul::Dictionary& dict, template std::string TemplateVerifier::documentation() const { - return "Value of type '" + type() + "'"; + return std::format("Value of type '{}'", type()); } template @@ -84,7 +87,7 @@ std::string Vector2Verifier::type() const { return "Vector2"; } else { - return std::string("Vector2<") + typeid(T).name() + ">"; + return std::format("Vector2<{}>", typeid(T).name()); } } @@ -97,7 +100,7 @@ std::string Vector3Verifier::type() const { return "Vector3"; } else { - return std::string("Vector3<") + typeid(T).name() + ">"; + return std::format("Vector3<{}>", typeid(T).name()); } } @@ -110,7 +113,7 @@ std::string Vector4Verifier::type() const { return "Vector4"; } else { - return std::string("Vector4<") + typeid(T).name() + ">"; + return std::format("Vector4<{}>", typeid(T).name()); } } @@ -123,7 +126,7 @@ std::string Matrix2x2Verifier::type() const { return "Matrix2x2"; } else { - return std::string("Matrix2x2<") + typeid(T).name() + ">"; + return std::format("Matrix2x2<{}>", typeid(T).name()); } } @@ -136,7 +139,7 @@ std::string Matrix2x3Verifier::type() const { return "Matrix2x3"; } else { - return std::string("Matrix2x3<") + typeid(T).name() + ">"; + return std::format("Matrix2x3<{}>", typeid(T).name()); } } @@ -149,7 +152,7 @@ std::string Matrix2x4Verifier::type() const { return "Matrix2x4"; } else { - return std::string("Matrix2x4<") + typeid(T).name() + ">"; + return std::format("Matrix2x4<{}>", typeid(T).name()); } } @@ -162,7 +165,7 @@ std::string Matrix3x2Verifier::type() const { return "Matrix3x2"; } else { - return std::string("Matrix3x2<") + typeid(T).name() + ">"; + return std::format("Matrix3x2<{}>", typeid(T).name()); } } @@ -175,7 +178,7 @@ std::string Matrix3x3Verifier::type() const { return "Matrix3x3"; } else { - return std::string("Matrix3x3<") + typeid(T).name() + ">"; + return std::format("Matrix3x3<{}>", typeid(T).name()); } } @@ -188,7 +191,7 @@ std::string Matrix3x4Verifier::type() const { return "Matrix3x4"; } else { - return std::string("Matrix3x4<") + typeid(T).name() + ">"; + return std::format("Matrix3x4<{}>", typeid(T).name()); } } @@ -201,7 +204,7 @@ std::string Matrix4x2Verifier::type() const { return "Matrix4x2"; } else { - return std::string("Matrix4x2<") + typeid(T).name() + ">"; + return std::format("Matrix4x2<{}>", typeid(T).name()); } } @@ -214,7 +217,7 @@ std::string Matrix4x3Verifier::type() const { return "Matrix4x3"; } else { - return std::string("Matrix4x3<") + typeid(T).name() + ">"; + return std::format("Matrix4x3<{}>", typeid(T).name()); } } @@ -227,7 +230,7 @@ std::string Matrix4x4Verifier::type() const { return "Matrix4x4"; } else { - return std::string("Matrix4x4<") + typeid(T).name() + ">"; + return std::format("Matrix4x4<{}>", typeid(T).name()); } } @@ -293,32 +296,32 @@ TestResult OperatorVerifier::operator()(const ghoul::Dictionary& di template std::string LessVerifier::documentation() const { - return "Less than: " + ghoul::to_string(value); + return std::format("Less than: {}", ghoul::to_string(value)); } template std::string LessEqualVerifier::documentation() const { - return "Less or equal to: " + ghoul::to_string(value); + return std::format("Less or equal to: {}", ghoul::to_string(value)); } template std::string GreaterVerifier::documentation() const { - return "Greater than: " + ghoul::to_string(value); + return std::format("Greater than: {}", ghoul::to_string(value)); } template std::string GreaterEqualVerifier::documentation() const { - return "Greater or equal to: " + ghoul::to_string(value); + return std::format("Greater or equal to: {}", ghoul::to_string(value)); } template std::string EqualVerifier::documentation() const { - return "Equal to: " + ghoul::to_string(value); + return std::format("Equal to: {}", ghoul::to_string(value)); } template std::string UnequalVerifier::documentation() const { - return "Unequal to: " + ghoul::to_string(value); + return std::format("Unequal to: {}", ghoul::to_string(value)); } template @@ -544,7 +547,7 @@ TestResult InRangeVerifier::operator()(const ghoul::Dictionary& dict, else if constexpr (std::is_same_v) { const double d = dict.value(key); double intPart; - bool isInt = modf(d, &intPart) == 0.0; + const bool isInt = std::modf(d, &intPart) == 0.0; if (isInt) { val = static_cast(d); } @@ -584,8 +587,9 @@ TestResult InRangeVerifier::operator()(const ghoul::Dictionary& dict, template std::string InRangeVerifier::documentation() const { - return "In range: ( " + ghoul::to_string(lower) + "," + - ghoul::to_string(upper) + " )"; + return std::format( + "In range: ( {}, {})", ghoul::to_string(lower), ghoul::to_string(upper) + ); } template @@ -637,7 +641,7 @@ TestResult NotInRangeVerifier::operator()(const ghoul::Dictionary& dict, else if constexpr (std::is_same_v) { const double d = dict.value(key); double intPart; - bool isInt = modf(d, &intPart) == 0.0; + const bool isInt = std::modf(d, &intPart) == 0.0; if (isInt) { val = static_cast(d); } From e20e4e5d09578b1b9e4f5d448b7107d50aeb1e5f Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 17 Dec 2025 11:36:39 +0100 Subject: [PATCH 40/43] Remove correct codegen tool. Update Ghoul --- ext/ghoul | 2 +- include/openspace/interaction/tasks/convertrecformattask.h | 3 --- modules/gaia/tasks/constructoctreetask.h | 2 -- modules/galaxy/tasks/milkywayconversiontask.h | 1 + support/deploy.bat | 2 +- 5 files changed, 3 insertions(+), 7 deletions(-) diff --git a/ext/ghoul b/ext/ghoul index 524a5760d9..aed53a5188 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit 524a5760d993df75a935418722faee960ceb8f7d +Subproject commit aed53a518857c271e5e6f685169bc73a2c8dd3e3 diff --git a/include/openspace/interaction/tasks/convertrecformattask.h b/include/openspace/interaction/tasks/convertrecformattask.h index 530a210bb4..413acae70f 100644 --- a/include/openspace/interaction/tasks/convertrecformattask.h +++ b/include/openspace/interaction/tasks/convertrecformattask.h @@ -30,9 +30,6 @@ #include #include -namespace ghoul { class Dictionary; } -namespace openspace::documentation { struct Documentation; } - namespace openspace::interaction { class ConvertRecFormatTask : public Task { diff --git a/modules/gaia/tasks/constructoctreetask.h b/modules/gaia/tasks/constructoctreetask.h index 2fd950253b..b902c977ef 100644 --- a/modules/gaia/tasks/constructoctreetask.h +++ b/modules/gaia/tasks/constructoctreetask.h @@ -34,8 +34,6 @@ namespace openspace { -namespace documentation { struct Documentation; } - class ConstructOctreeTask : public Task { public: explicit ConstructOctreeTask(const ghoul::Dictionary& dictionary); diff --git a/modules/galaxy/tasks/milkywayconversiontask.h b/modules/galaxy/tasks/milkywayconversiontask.h index 8cc56c184f..09e3a34ea9 100644 --- a/modules/galaxy/tasks/milkywayconversiontask.h +++ b/modules/galaxy/tasks/milkywayconversiontask.h @@ -39,6 +39,7 @@ class MilkywayConversionTask : public Task { public: explicit MilkywayConversionTask(const ghoul::Dictionary& dictionary); ~MilkywayConversionTask() override = default; + std::string description() override; void perform(const Task::ProgressCallback& onProgress) override; diff --git a/support/deploy.bat b/support/deploy.bat index 8706e35aa7..1cbed48b0e 100644 --- a/support/deploy.bat +++ b/support/deploy.bat @@ -109,7 +109,7 @@ exit /b 0 echo ### Dealing with some files :: Remove unnecessary files of our own making del bin\RelWithDebInfo\*.pdb -del bin\RelWithDebInfo\codegen.exe +del bin\RelWithDebInfo\codegen-tool.exe del bin\RelWithDebInfo\Qt6Svg.dll :: Remove unnecessary Qt files From 9eb5196c29f7e13f62cc60565e8e4a0c80dd0539 Mon Sep 17 00:00:00 2001 From: hn-88 Date: Wed, 17 Dec 2025 16:33:34 +0530 Subject: [PATCH 41/43] Explicitly specify namespaces and MacOS fixes (#3860) --- apps/OpenSpace/main.cpp | 9 ++++- include/openspace/documentation/verifier.inl | 18 +++++++++- .../src/geojson/globegeometryfeature.cpp | 6 ++-- .../src/geojson/globegeometryhelper.cpp | 8 ++--- src/interaction/touchbar.mm | 34 +++++++++---------- src/scene/scene_lua.inl | 6 +++- 6 files changed, 53 insertions(+), 28 deletions(-) diff --git a/apps/OpenSpace/main.cpp b/apps/OpenSpace/main.cpp index 2683289563..8ca4097605 100644 --- a/apps/OpenSpace/main.cpp +++ b/apps/OpenSpace/main.cpp @@ -22,6 +22,12 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +// Explicitly including OpenGL for APPLE +#ifdef __APPLE__ +#define GLFW_INCLUDE_NONE +#include +#endif // __APPLE__ + #include #include #include @@ -44,9 +50,10 @@ #include #include #include +#include #ifdef WIN32 #define GLFW_EXPOSE_NATIVE_WIN32 -#endif +#endif // WIN32 #include #include #include diff --git a/include/openspace/documentation/verifier.inl b/include/openspace/documentation/verifier.inl index d676befb0c..94b944344f 100644 --- a/include/openspace/documentation/verifier.inl +++ b/include/openspace/documentation/verifier.inl @@ -34,6 +34,22 @@ namespace openspace::documentation { +// Workaround for macOS libc++ std::format with std::vector +namespace detail { + template + decltype(auto) format_value(T&& value) { + using Type = std::remove_cvref_t; + if constexpr (std::is_same_v::reference> || + std::is_same_v::const_reference>) + { + return static_cast(std::forward(value)); + } + else { + return std::forward(value); + } + } +} // detail + template <> TestResult TemplateVerifier::operator()(const ghoul::Dictionary& dict, const std::string& key) const; @@ -380,7 +396,7 @@ TestResult InListVerifier::operator()(const ghoul::Dictionary& dict, std::string list = std::accumulate( values.begin() + 1, values.end(), - std::format("{}", values.front()), + std::format("{}", detail::format_value(values.front())), [](std::string lhs, typename T::Type rhs) { return std::format("{}, {}", lhs, rhs); } diff --git a/modules/globebrowsing/src/geojson/globegeometryfeature.cpp b/modules/globebrowsing/src/geojson/globegeometryfeature.cpp index d7cf1ef23f..2db740811c 100644 --- a/modules/globebrowsing/src/geojson/globegeometryfeature.cpp +++ b/modules/globebrowsing/src/geojson/globegeometryfeature.cpp @@ -199,7 +199,7 @@ void GlobeGeometryFeature::createFromSingleGeosGeometry(const geos::geom::Geomet // Note that Constrained Delaunay triangulation supports polygons with // holes :) std::vector triCoords; - TriList triangles; + geos::triangulate::tri::TriList triangles; using geos::triangulate::polygon::ConstrainedDelaunayTriangulator; ConstrainedDelaunayTriangulator::triangulatePolygon(p, triangles); @@ -207,7 +207,7 @@ void GlobeGeometryFeature::createFromSingleGeosGeometry(const geos::geom::Geomet // Add three coordinates per triangle. Note flipped winding order // (want counter clockwise, but GEOS provides clockwise) - for (const Tri* t : triangles) { + for (const geos::triangulate::tri::Tri* t : triangles) { triCoords.push_back(t->getCoordinate(0)); triCoords.push_back(t->getCoordinate(2)); triCoords.push_back(t->getCoordinate(1)); @@ -217,7 +217,7 @@ void GlobeGeometryFeature::createFromSingleGeosGeometry(const geos::geom::Geomet // Boundaries / Lines // Normalize to make sure rings have correct orientation - std::unique_ptr pNormalized = p->clone(); + std::unique_ptr pNormalized = p->clone(); pNormalized->normalize(); const geos::geom::LinearRing* outerRing = pNormalized->getExteriorRing(); diff --git a/modules/globebrowsing/src/geojson/globegeometryhelper.cpp b/modules/globebrowsing/src/geojson/globegeometryhelper.cpp index 9779649dbf..b595d881ee 100644 --- a/modules/globebrowsing/src/geojson/globegeometryhelper.cpp +++ b/modules/globebrowsing/src/geojson/globegeometryhelper.cpp @@ -257,7 +257,7 @@ subdivideTriangle(const glm::vec3& v0, const glm::vec3& v1, const glm::vec3& v2, vertices.reserve(maxSteps * maxSteps); // Add points inside the triangle - std::vector pointCoords; + std::vector pointCoords; pointCoords.reserve(3 * maxSteps + 1); const Ellipsoid& ellipsoid = globe.ellipsoid(); @@ -326,7 +326,7 @@ subdivideTriangle(const glm::vec3& v0, const glm::vec3& v1, const glm::vec3& v2, // time std::vector> geosPoints; geosPoints.reserve(pointCoords.size()); - for (const Coordinate& c : pointCoords) { + for (const geos::geom::Coordinate& c : pointCoords) { geosPoints.emplace_back(geometryFactory->createPoint(c)); } std::unique_ptr points = geometryFactory->createMultiPoint( @@ -338,13 +338,13 @@ subdivideTriangle(const glm::vec3& v0, const glm::vec3& v1, const glm::vec3& v2, // Returns a list of triangles, as geos polygons GeometryCollection* triangleGeoms = builder.getTriangles(*geometryFactory).release(); - std::vector triCoords; + std::vector triCoords; triangleGeoms->getCoordinates()->toVector(triCoords); vertices.reserve(vertices.size() + triCoords.size() + 1); int count = 0; - for (const Coordinate& coord : triCoords) { + for (const geos::geom::Coordinate& coord : triCoords) { count++; if (count == 4) { // Skip every 4th coord, as polygons have one extra coord per triangle. diff --git a/src/interaction/touchbar.mm b/src/interaction/touchbar.mm index 2de60e439c..a22addfafc 100644 --- a/src/interaction/touchbar.mm +++ b/src/interaction/touchbar.mm @@ -174,11 +174,11 @@ 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::ShouldBeSynchronized::No, - scripting::ScriptEngine::ShouldSendToRemote::No - ); + global::scriptEngine->queueScript({ + .code = "openspace.time.togglePause();", + .synchronized = scripting::ScriptEngine::ShouldBeSynchronized::No, + .sendToRemote = scripting::ScriptEngine::ShouldSendToRemote::No + }); NSButton* button = static_cast(sender); // This check is inverted since the togglePause script has not run yet @@ -198,11 +198,11 @@ NSArray* focusIdentifiers; "NavigationHandler.OrbitalNavigator.Aim", "NavigationHandler.OrbitalNavigator.RetargetAnchor" ); - global::scriptEngine->queueScript( - str, - scripting::ScriptEngine::ShouldBeSynchronized::Yes, - scripting::ScriptEngine::ShouldSendToRemote::Yes - ); + global::scriptEngine->queueScript({ + .code = str, + .synchronized = scripting::ScriptEngine::ShouldBeSynchronized::Yes, + .sendToRemote = scripting::ScriptEngine::ShouldSendToRemote::Yes + }); } - (void)hideTextAction:(id)sender { @@ -214,21 +214,19 @@ NSArray* focusIdentifiers; openspace.setPropertyValueSingle('Dashboard.IsEnabled', not isEnabled);\ openspace.setPropertyValueSingle('RenderEngine.ShowLog', not isEnabled);\ openspace.setPropertyValueSingle('RenderEngine.ShowVersion', not isEnabled);\ - openspace.setPropertyValueSingle('RenderEngine.ShowCamera', not isEnabled)", - scripting::ScriptEngine::ShouldBeSynchronized::No, - scripting::ScriptEngine::ShouldSendToRemote::No + openspace.setPropertyValueSingle('RenderEngine.ShowCamera', not isEnabled)" ); } - (void)hideGuiAction:(id)sender { // Remove unused variable warning (void)sender; - global::scriptEngine->queueScript( - "local isEnabled = openspace.propertyValue('Modules.CefWebGui.Visible');\ + global::scriptEngine->queueScript({ + .code = "local isEnabled = openspace.propertyValue('Modules.CefWebGui.Visible');\ openspace.setPropertyValueSingle('Modules.CefWebGui.Visible', not isEnabled);", - scripting::ScriptEngine::ShouldBeSynchronized::No, - scripting::ScriptEngine::ShouldSendToRemote::No - ); + .synchronized = scripting::ScriptEngine::ShouldBeSynchronized::No, + .sendToRemote = scripting::ScriptEngine::ShouldSendToRemote::No + }); } @end diff --git a/src/scene/scene_lua.inl b/src/scene/scene_lua.inl index 596d9ad689..1c3a8ffdb2 100644 --- a/src/scene/scene_lua.inl +++ b/src/scene/scene_lua.inl @@ -308,7 +308,9 @@ std::vector findMatchesInAllProperties( std::mutex mutex; std::for_each( +#ifndef __APPLE__ std::execution::par_unseq, +#endif // __APPLE__ properties.cbegin(), properties.cend(), [&](Property* prop) { @@ -356,13 +358,15 @@ std::vector findMatchesInAllPropertyOwner std::mutex mutex; std::for_each( +#ifndef __APPLE__ std::execution::par_unseq, +#endif // __APPLE__ propertyOwners.cbegin(), propertyOwners.cend(), [&](PropertyOwner* propOwner) { if (inputIsOnlyTag) { // If we only got a tag as input, the result is all owners that directly - // match the group tag (without looking recusively in parent owners) + // match the group tag (without looking recursively in parent owners) if (!ownerMatchesGroupTag(propOwner, groupTag, false)) { return; } From 1fa8cc3e48381884f0a7b0e211fabd4abeabada6 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 17 Dec 2025 20:33:52 +0100 Subject: [PATCH 42/43] Add the ability to paste into the Lua console with the middle mouse button --- include/openspace/rendering/luaconsole.h | 3 +++ src/engine/openspaceengine.cpp | 12 ++++++++++++ src/rendering/luaconsole.cpp | 16 +++++++++++++++- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/include/openspace/rendering/luaconsole.h b/include/openspace/rendering/luaconsole.h index 344ca75504..ab03f51bdf 100644 --- a/include/openspace/rendering/luaconsole.h +++ b/include/openspace/rendering/luaconsole.h @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -54,6 +55,8 @@ public: bool keyboardCallback(Key key, KeyModifier modifier, KeyAction action); void charCallback(unsigned int codepoint, KeyModifier modifier); + bool mouseActivationCallback(glm::vec2 pos, MouseButton button, MouseAction action, + KeyModifier mods); void update(); void render(); diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index fa9afb165c..2d3bb7be00 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -1498,6 +1498,18 @@ void OpenSpaceEngine::mouseButtonCallback(MouseButton button, MouseAction action } } + if (action == MouseAction::Press && isGuiWindow) { + const bool isConsumed = global::luaConsole->mouseActivationCallback( + _mousePosition, + button, + action, + mods + ); + if (isConsumed) { + return; + } + } + global::navigationHandler->mouseButtonCallback(button, action); global::interactionMonitor->markInteraction(); diff --git a/src/rendering/luaconsole.cpp b/src/rendering/luaconsole.cpp index 88381c0d78..4dc722e50f 100644 --- a/src/rendering/luaconsole.cpp +++ b/src/rendering/luaconsole.cpp @@ -414,7 +414,7 @@ void LuaConsole::charCallback(unsigned int codepoint, if (modifierControl && (codepoint == codepoint_C || codepoint == codepoint_V)) { return; } -#endif +#endif // WIN32 // Disallow all non ASCII characters for now if (codepoint > 0x7f) { @@ -424,6 +424,20 @@ void LuaConsole::charCallback(unsigned int codepoint, addToCommand(std::string(1, static_cast(codepoint))); } +bool LuaConsole::mouseActivationCallback(glm::vec2, MouseButton button, + MouseAction action, KeyModifier) +{ + const bool isMiddleMouseButton = button == MouseButton::Button3; + const bool isPress = action == MouseAction::Press; + + if (_isVisible && isMiddleMouseButton && isPress) { + addToCommand(sanitizeInput(ghoul::clipboardText())); + return true; + } + + return false; +} + void LuaConsole::update() { ZoneScoped; From bd10685f1fad46b1e4c7ed94a8b3f8542f271333 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 18 Dec 2025 13:46:32 +0100 Subject: [PATCH 43/43] Make the middle mouse button paste on Linux pick data from the primary selection area --- ext/ghoul | 2 +- src/rendering/luaconsole.cpp | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ext/ghoul b/ext/ghoul index aed53a5188..c748bc9d41 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit aed53a518857c271e5e6f685169bc73a2c8dd3e3 +Subproject commit c748bc9d416821b46af25d1e23ff4f4c89a75993 diff --git a/src/rendering/luaconsole.cpp b/src/rendering/luaconsole.cpp index 4dc722e50f..1c41eaddd0 100644 --- a/src/rendering/luaconsole.cpp +++ b/src/rendering/luaconsole.cpp @@ -431,7 +431,12 @@ bool LuaConsole::mouseActivationCallback(glm::vec2, MouseButton button, const bool isPress = action == MouseAction::Press; if (_isVisible && isMiddleMouseButton && isPress) { - addToCommand(sanitizeInput(ghoul::clipboardText())); + // Using the Primary selection area as that is more akin to the behavior on Linux + // where the middle mouse button pastes the currently selected text that comes + // from the primary selection area. + // On Windows, specifying this selection area doesn't change anything as there is + // only a single clipboard + addToCommand(sanitizeInput(ghoul::clipboardText(ghoul::SelectionArea::Primary))); return true; }