From 9582d81fb63c402b33ec279b04e1d43854c32164 Mon Sep 17 00:00:00 2001 From: Malin E Date: Wed, 9 Oct 2024 10:39:13 +0200 Subject: [PATCH] Sync out the anchor node, issue 2854 (#3398) * Sync out anchor node to all connected clients * Remove warning in case anchor node is nullptr * Always sync out the anchor node to nodes --- include/openspace/navigation/orbitalnavigator.h | 5 +++++ src/engine/openspaceengine.cpp | 5 ++++- src/navigation/orbitalnavigator.cpp | 14 ++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/include/openspace/navigation/orbitalnavigator.h b/include/openspace/navigation/orbitalnavigator.h index c5f1cd05ee..deaa8b5f85 100644 --- a/include/openspace/navigation/orbitalnavigator.h +++ b/include/openspace/navigation/orbitalnavigator.h @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -148,6 +149,9 @@ public: */ glm::dvec3 pushToSurfaceOfAnchor(const glm::dvec3& cameraPosition) const; + void updateAnchor(); + std::vector syncables(); + /** * \return The Lua library that contains all Lua functions available to affect the * OrbitalNavigator @@ -244,6 +248,7 @@ private: WebsocketCameraStates _websocketStates; ScriptCameraStates _scriptStates; + SyncData _syncedAnchorNode; const SceneGraphNode* _anchorNode = nullptr; const SceneGraphNode* _aimNode = nullptr; diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index bca6ccc6ed..4bfd4e8662 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -831,6 +831,9 @@ void OpenSpaceEngine::loadAssets() { global::renderEngine->updateScene(); global::syncEngine->addSyncables(global::timeManager->syncables()); + global::syncEngine->addSyncables( + global::navigationHandler->orbitalNavigator().syncables() + ); if (_scene && _scene->camera()) { global::syncEngine->addSyncables(_scene->camera()->syncables()); } @@ -1173,6 +1176,7 @@ void OpenSpaceEngine::postSynchronizationPreDraw() { global::luaConsole->update(); if (!master) { + global::navigationHandler->orbitalNavigator().updateAnchor(); _scene->camera()->invalidateCache(); } @@ -1309,7 +1313,6 @@ void OpenSpaceEngine::postDraw() { global::eventEngine->triggerActions(); global::eventEngine->triggerTopics(); - global::eventEngine->postFrameCleanup(); global::memoryManager->PersistentMemory.housekeeping(); diff --git a/src/navigation/orbitalnavigator.cpp b/src/navigation/orbitalnavigator.cpp index fb729b8485..1e0035552b 100644 --- a/src/navigation/orbitalnavigator.cpp +++ b/src/navigation/orbitalnavigator.cpp @@ -1109,6 +1109,7 @@ void OrbitalNavigator::setAnchorNode(const SceneGraphNode* anchorNode, const bool changedAnchor = _anchorNode != anchorNode; _anchorNode = anchorNode; + _syncedAnchorNode = anchorNode ? anchorNode->identifier() : ""; // Need to reset velocities after the actual switch in anchor node, // since the reset behavior depends on the anchor node. @@ -2084,6 +2085,19 @@ double OrbitalNavigator::rotationSpeedScaleFromCameraHeight( 1.0; } +// This should only be run on nodes and not on master +void OrbitalNavigator::updateAnchor() { + ghoul_assert(!global::windowDelegate->isMaster()); + + if (!_syncedAnchorNode.data().empty()) { + setAnchorNode(_syncedAnchorNode); + } +} + +std::vector OrbitalNavigator::syncables() { + return { &_syncedAnchorNode }; +} + scripting::LuaLibrary OrbitalNavigator::luaLibrary() { return { "orbitalnavigation",