From a456b68b204d85878fdb9f289b4eb7a4e1b63e28 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Fri, 7 May 2021 14:37:52 +0200 Subject: [PATCH] Make it more efficient to get the vector of browsers --- modules/skybrowser/skybrowsermodule.cpp | 16 ++++------- modules/skybrowser/skybrowsermodule.h | 3 +- modules/skybrowser/skybrowsermodule_lua.inl | 32 ++++++++++----------- 3 files changed, 24 insertions(+), 27 deletions(-) diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 3567b1235b..955db4b4cb 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -340,7 +340,7 @@ SkyBrowserModule::SkyBrowserModule() ); global::callback::preSync->emplace_back([this]() { - for (ScreenSpaceSkyBrowser* browser : getSkyBrowsers()) { + for (ScreenSpaceSkyBrowser* browser : browsers) { if (browser->getSkyTarget()) { browser->getSkyTarget()->animateToCoord(global::windowDelegate->deltaTime()); } @@ -387,6 +387,9 @@ void SkyBrowserModule::addRenderable(ScreenSpaceRenderable* object) { renderables.push_back(object); // Sort on z coordinate, objects closer to camera are in beginning of list std::sort(renderables.begin(), renderables.end()); + if (to_browser(object)) { + browsers.push_back(to_browser(object)); + } } ScreenSpaceSkyBrowser* SkyBrowserModule::to_browser(ScreenSpaceRenderable* ptr) { @@ -400,14 +403,8 @@ WWTDataHandler* SkyBrowserModule::getWWTDataHandler() { return dataHandler; } -std::vector SkyBrowserModule::getSkyBrowsers() { - std::vector browsers; - for (ScreenSpaceRenderable* renderable : renderables) { - if (to_browser(renderable)) { - browsers.push_back(to_browser(renderable)); - } - } - return browsers; +std::vector* SkyBrowserModule::getSkyBrowsers() { + return &browsers; } void SkyBrowserModule::startRotation(glm::dvec2 coordsEnd) { @@ -446,7 +443,6 @@ void SkyBrowserModule::rotateCamera(double deltaTime) { void SkyBrowserModule::setSelectedBrowser(ScreenSpaceRenderable* ptr) { ScreenSpaceSkyBrowser* browser = to_browser(ptr) ? to_browser(ptr) : to_target(ptr)->getSkyBrowser(); - std::vector browsers = getSkyBrowsers(); auto it = std::find(browsers.begin(), browsers.end(), browser); // Get index selectedBrowser = std::distance(browsers.begin(), it); diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index 46e5f48064..5594fd9cf1 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -54,7 +54,7 @@ public: glm::vec2 getMousePositionInScreenSpaceCoords(glm::vec2& mousePos); void addRenderable(ScreenSpaceRenderable* object); WWTDataHandler* getWWTDataHandler(); - std::vector getSkyBrowsers(); + std::vector* getSkyBrowsers(); void startRotation(glm::dvec2 coordsEnd); void rotateCamera(double deltaTime); void setSelectedBrowser(ScreenSpaceRenderable* ptr); @@ -76,6 +76,7 @@ protected: // Renderable vector and ptr to where mouse is std::vector renderables; + std::vector browsers; ScreenSpaceRenderable* _mouseOnObject; // Dragging glm::vec2 startDragMousePos; diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index bafb28b719..50312fa439 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -37,7 +37,7 @@ namespace openspace::skybrowser::luascriptfunctions { ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::selectImage"); const int i = ghoul::lua::value(L, 1); SkyBrowserModule* module = global::moduleEngine->module(); - ScreenSpaceSkyBrowser* browser = module->getSkyBrowsers()[module->getSelectedBrowserIndex()]; + ScreenSpaceSkyBrowser* browser = (*module->getSkyBrowsers())[module->getSelectedBrowserIndex()]; const ImageData& resultImage = module->getWWTDataHandler()->getLoadedImages()[i]; // Load image collection, if it isn't loaded already @@ -106,10 +106,10 @@ namespace openspace::skybrowser::luascriptfunctions { ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::lockTarget"); const int i = ghoul::lua::value(L, 1); SkyBrowserModule* module = global::moduleEngine->module(); - std::vector browsers = module->getSkyBrowsers(); - ScreenSpaceSkyTarget* target = browsers[i]->getSkyTarget(); - if (i < browsers.size()) { - ScreenSpaceSkyTarget* target = browsers[i]->getSkyTarget(); + std::vector* browsers = module->getSkyBrowsers(); + ScreenSpaceSkyTarget* target = (*browsers)[i]->getSkyTarget(); + if (i < browsers->size()) { + ScreenSpaceSkyTarget* target = (*browsers)[i]->getSkyTarget(); if (target) { target->lock(); } @@ -121,9 +121,9 @@ namespace openspace::skybrowser::luascriptfunctions { ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::unlockTarget"); const int i = ghoul::lua::value(L, 1); SkyBrowserModule* module = global::moduleEngine->module(); - std::vector browsers = module->getSkyBrowsers(); - if (i < browsers.size()) { - ScreenSpaceSkyTarget* target = browsers[i]->getSkyTarget(); + std::vector* browsers = module->getSkyBrowsers(); + if (i < browsers->size()) { + ScreenSpaceSkyTarget* target = (*browsers)[i]->getSkyTarget(); if (target) { target->unlock(); } @@ -258,24 +258,24 @@ namespace openspace::skybrowser::luascriptfunctions { lua_settable(L, -3); // Pass data for all the browsers and the corresponding targets - std::vector browsers = module->getSkyBrowsers(); + std::vector* browsers = module->getSkyBrowsers(); - for (int i = 0; i < browsers.size(); i++) { + for (ScreenSpaceSkyBrowser* browser : *browsers) { // Only add browsers that have an initialized target - ScreenSpaceSkyTarget* target = browsers[i]->getSkyTarget(); + ScreenSpaceSkyTarget* target = browser->getSkyTarget(); if (target) { glm::dvec2 celestialSpherical = target->getTargetDirectionCelestial(); glm::dvec3 celestialCart = skybrowser::sphericalToCartesian(celestialSpherical); std::vector celestialCartVec = { celestialCart.x, celestialCart.y, celestialCart.z }; // Convert color to vector so ghoul can read it - glm::ivec3 color = browsers[i]->_borderColor.value(); + glm::ivec3 color = browser->_borderColor.value(); std::vector colorVec = { color.r, color.g, color.b }; ghoul::lua::push(L, index); index++; lua_newtable(L); // Push ("Key", value) - ghoul::lua::push(L, "FOV", browsers[i]->fieldOfView()); + ghoul::lua::push(L, "FOV", browser->fieldOfView()); lua_settable(L, -3); ghoul::lua::push(L, "CartesianDirection", celestialCartVec); lua_settable(L, -3); @@ -298,8 +298,8 @@ namespace openspace::skybrowser::luascriptfunctions { ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::adjustCamera"); const int i = ghoul::lua::value(L, 1); SkyBrowserModule* module = global::moduleEngine->module(); - if (module->getSkyBrowsers().size() > i) { - module->startRotation(module->getSkyBrowsers()[i]->getSkyTarget()->getTargetDirectionCelestial()); + if (module->getSkyBrowsers()->size() > i) { + module->startRotation((*module->getSkyBrowsers())[i]->getSkyTarget()->getTargetDirectionCelestial()); } return 0; @@ -309,7 +309,7 @@ namespace openspace::skybrowser::luascriptfunctions { ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::setSelectedBrowser"); const int i = ghoul::lua::value(L, 1); SkyBrowserModule* module = global::moduleEngine->module(); - if (module->getSkyBrowsers().size() < i) { + if (module->getSkyBrowsers()->size() < i) { module->setSelectedBrowser(i); } return 0;