From 01c393ab8b7e25d97d8d166deee873fef0f08bc9 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Wed, 9 Jun 2021 09:56:02 +0200 Subject: [PATCH] Fix so backend can handle layer ordering --- .../skybrowser/include/renderableskybrowser.h | 2 +- .../include/screenspaceskybrowser.h | 2 +- modules/skybrowser/include/utility.h | 8 +++---- modules/skybrowser/skybrowsermodule.cpp | 7 ++++++ modules/skybrowser/skybrowsermodule.h | 6 +++-- modules/skybrowser/skybrowsermodule_lua.inl | 9 ++++---- .../skybrowser/src/renderableskybrowser.cpp | 22 ++++++++++++++----- .../skybrowser/src/screenspaceskybrowser.cpp | 21 ++++++++++++------ modules/skybrowser/src/utility.cpp | 7 +++--- 9 files changed, 55 insertions(+), 29 deletions(-) diff --git a/modules/skybrowser/include/renderableskybrowser.h b/modules/skybrowser/include/renderableskybrowser.h index e6ce191015..d1fabcd9f0 100644 --- a/modules/skybrowser/include/renderableskybrowser.h +++ b/modules/skybrowser/include/renderableskybrowser.h @@ -61,7 +61,7 @@ namespace openspace { void setIdInBrowser(std::string id); float fieldOfView() const; std::deque& selectedImages(); - void setImageLayerOrder(int i, int order); + void setImageLayerOrder(int i, int order, int version); protected: diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index d0a26d7eda..1d7c54ae98 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -36,7 +36,7 @@ namespace openspace { std::deque& selectedImages(); void addSelectedImage(ImageData& image, int i); void removeSelectedImage(ImageData& image, int i); - void setImageLayerOrder(int i, int order); + void setImageLayerOrder(int i, int order, int version); // Translation //void translate(glm::vec2 translation); diff --git a/modules/skybrowser/include/utility.h b/modules/skybrowser/include/utility.h index 6055d4a135..f12998a09d 100644 --- a/modules/skybrowser/include/utility.h +++ b/modules/skybrowser/include/utility.h @@ -46,11 +46,11 @@ namespace openspace { const double fov, const double roll, const bool moveInstantly = true); ghoul::Dictionary loadCollection(const std::string& url); ghoul::Dictionary setForeground(const std::string& name); - ghoul::Dictionary createImageLayer(const std::string& imageUrl, const std::string& id); - ghoul::Dictionary removeImageLayer(const std::string& imageId); - ghoul::Dictionary setLayerOpacity(const std::string& imageId, double opacity); + ghoul::Dictionary createImageLayer(const std::string& id, const std::string& url); + ghoul::Dictionary removeImageLayer(const std::string& id); + ghoul::Dictionary setLayerOpacity(const std::string& id, double opacity); ghoul::Dictionary setForegroundOpacity(double val); - ghoul::Dictionary setLayerOrder(const std::string& id, int order); + ghoul::Dictionary setLayerOrder(const std::string& id, int order, int version); } } diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 5a91cfda63..ecf1160a27 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -256,6 +256,9 @@ SkyBrowserModule::SkyBrowserModule() , resizeVector(0.f, 0.f) , changeViewWithinBrowser(false) , _browser3d(nullptr) + , _layerOrderCounter(0) + , _cameraInSolarSystem(true) + , highlightAddition(35, 35, 35) { global::callback::mousePosition->emplace_back( [&](double x, double y) { @@ -513,6 +516,10 @@ glm::vec2 SkyBrowserModule::getMousePositionInScreenSpaceCoords(glm::vec2& mouse return screenSpacePos; } +int SkyBrowserModule::getAndIncrementLayerOrder() { + return _layerOrderCounter++; +} + void SkyBrowserModule::addRenderable(ScreenSpaceRenderable* object) { renderables.push_back(object); // Sort on z coordinate, objects closer to camera are in beginning of list diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index 756319f7f8..a193624bf4 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -76,6 +76,7 @@ public: void removeTargetBrowserPair(std::string& browserId); void place3dBrowser(ImageData& image); void lookAt3dBrowser(); + int getAndIncrementLayerOrder(); scripting::LuaLibrary luaLibrary() const override; //std::vector documentations() const override; @@ -116,9 +117,10 @@ protected: bool isRotating = false; // For tracking the currently selected browser std::string selectedBrowser; - glm::ivec3 highlightAddition{ 35, 35, 35 }; + glm::ivec3 highlightAddition; // Mode of browsing - bool _cameraInSolarSystem{ true }; + bool _cameraInSolarSystem; + int _layerOrderCounter; }; } // namespace openspace diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index f85b98afde..895504eba4 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -150,18 +150,17 @@ namespace openspace::skybrowser::luascriptfunctions { const int i = ghoul::lua::value(L, 2); int order = ghoul::lua::value(L, 3); SkyBrowserModule* module = global::moduleEngine->module(); - ghoul::Dictionary message = wwtmessage::setLayerOrder(std::to_string(i), order); + int version = module->getAndIncrementLayerOrder(); if (module->browserIdExists(browserId)) { ScreenSpaceSkyBrowser* browser = module->getSkyBrowsers()[browserId]; - browser->sendMessageToWWT(message); - browser->setImageLayerOrder(i, order); + + browser->setImageLayerOrder(i, order, version); } else if (module->get3dBrowser() != nullptr) { RenderableSkyBrowser* browser3d = dynamic_cast( module->get3dBrowser()->renderable()); - browser3d->sendMessageToWWT(message); - browser3d->setImageLayerOrder(i, order); + browser3d->setImageLayerOrder(i, order, version); } return 0; diff --git a/modules/skybrowser/src/renderableskybrowser.cpp b/modules/skybrowser/src/renderableskybrowser.cpp index 9c1bc9f6f1..0a8768f9b4 100644 --- a/modules/skybrowser/src/renderableskybrowser.cpp +++ b/modules/skybrowser/src/renderableskybrowser.cpp @@ -197,7 +197,7 @@ namespace openspace { // Push newly selected image to front _selectedImages.push_front(i); // Create image layer and center WWT app on the image - sendMessageToWWT(wwtmessage::createImageLayer(image.imageUrl, std::to_string(i))); + sendMessageToWWT(wwtmessage::createImageLayer(std::to_string(i), image.imageUrl)); LINFO("Image has been loaded to " + identifier()); } } @@ -249,13 +249,23 @@ namespace openspace { return _selectedImages; } - void RenderableSkyBrowser::setImageLayerOrder(int i, int order) { + void RenderableSkyBrowser::setImageLayerOrder(int i, int order, int version) { // Remove from selected list - auto it = std::find(std::begin(_selectedImages), std::end(_selectedImages), i); - if (it != std::end(_selectedImages)) { - _selectedImages.erase(it); - _selectedImages.insert(std::begin(_selectedImages) + order, i); + auto current = std::find(std::begin(_selectedImages), std::end(_selectedImages), i); + auto target = std::begin(_selectedImages) + order; + + // Make sure the image was found in the list + if (current != std::end(_selectedImages) && target != std::end(_selectedImages)) { + // Swap the two images + std::iter_swap(current, target); } + + int reverseOrder = _selectedImages.size() - order - 1; + ghoul::Dictionary message = wwtmessage::setLayerOrder(std::to_string(i), + reverseOrder, version); + sendMessageToWWT(message); } + + } // namespace diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index abf2aa1016..89a0fd4ccb 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -341,7 +341,7 @@ namespace openspace { // Push newly selected image to front _selectedImages.push_front(i); // Index of image is used as layer ID as it is unique in the image data set - sendMessageToWWT(wwtmessage::createImageLayer(image.imageUrl, std::to_string(i))); + sendMessageToWWT(wwtmessage::createImageLayer(std::to_string(i), image.imageUrl)); sendMessageToWWT(wwtmessage::setLayerOpacity(std::to_string(i), 1.0)); } } @@ -355,13 +355,20 @@ namespace openspace { } } - void ScreenSpaceSkyBrowser::setImageLayerOrder(int i, int order) { + void ScreenSpaceSkyBrowser::setImageLayerOrder(int i, int order, int version) { // Remove from selected list - auto it = std::find(std::begin(_selectedImages), std::end(_selectedImages), i); - if (it != std::end(_selectedImages)) { - _selectedImages.erase(it); - if(_selectedImages.size()) - _selectedImages.insert(std::begin(_selectedImages) + order, i); + auto current = std::find(std::begin(_selectedImages), std::end(_selectedImages), i); + auto target = std::begin(_selectedImages) + order; + + // Make sure the image was found in the list + if (current != std::end(_selectedImages) && target != std::end(_selectedImages)) { + // Swap the two images + std::iter_swap(current, target); } + + int reverseOrder = _selectedImages.size() - order - 1; + ghoul::Dictionary message = wwtmessage::setLayerOrder(std::to_string(i), + reverseOrder, version); + sendMessageToWWT(message); } } diff --git a/modules/skybrowser/src/utility.cpp b/modules/skybrowser/src/utility.cpp index 6dc84bf3e0..6849559b0a 100644 --- a/modules/skybrowser/src/utility.cpp +++ b/modules/skybrowser/src/utility.cpp @@ -150,12 +150,12 @@ namespace openspace::wwtmessage { return msg; } - ghoul::Dictionary createImageLayer(const std::string& imageUrl, const std::string& id) { + ghoul::Dictionary createImageLayer(const std::string& id, const std::string& url) { using namespace std::string_literals; ghoul::Dictionary msg; msg.setValue("event", "image_layer_create"s); msg.setValue("id", id); - msg.setValue("url", imageUrl); + msg.setValue("url", url); msg.setValue("mode", "preloaded"s); msg.setValue("goto", false); @@ -191,7 +191,7 @@ namespace openspace::wwtmessage { return msg; } - ghoul::Dictionary setLayerOrder(const std::string& id, int order) { + ghoul::Dictionary setLayerOrder(const std::string& id, int order, int version) { // The lower the layer order, the more towards the back the image is placed // 0 is the background using namespace std::string_literals; @@ -199,6 +199,7 @@ namespace openspace::wwtmessage { msg.setValue("event", "image_layer_order"s); msg.setValue("id", id); msg.setValue("order", order); + msg.setValue("version", version); return msg; }