From 2eecb08bcf0d89cf02a5eac5ffe5f00ae5be623d Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Tue, 4 May 2021 09:14:35 +0200 Subject: [PATCH] Add random colored borders to browsers and targets that are sufficiently bright, and add function to pass them to GUI --- .../include/screenspaceskybrowser.h | 5 +- .../skybrowser/include/screenspaceskytarget.h | 2 +- modules/skybrowser/skybrowsermodule.cpp | 10 ++++ modules/skybrowser/skybrowsermodule.h | 1 + modules/skybrowser/skybrowsermodule_lua.inl | 52 ++++++++++++------- .../skybrowser/src/screenspaceskybrowser.cpp | 34 +++++++++--- .../skybrowser/src/screenspaceskytarget.cpp | 10 +++- 7 files changed, 82 insertions(+), 32 deletions(-) diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index 877212294c..e4b9a68f31 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -51,15 +51,14 @@ namespace openspace { bool _browserDimIsDirty; properties::FloatProperty _vfieldOfView; properties::StringProperty _skyTargetID; + properties::Vec3Property _borderColor; private: glm::vec2 _startDimensionsSize; float _startScale; properties::Vec2Property _browserDimensions; bool _camIsSyncedWWT; ScreenSpaceSkyTarget* _skyTarget; - std::thread _threadWWTMessages; - glm::ivec3 _borderColor; - + std::thread _threadWWTMessages; }; } diff --git a/modules/skybrowser/include/screenspaceskytarget.h b/modules/skybrowser/include/screenspaceskytarget.h index d4f593e4e9..1a2a69b264 100644 --- a/modules/skybrowser/include/screenspaceskytarget.h +++ b/modules/skybrowser/include/screenspaceskytarget.h @@ -59,7 +59,7 @@ namespace openspace { GLuint _vertexBuffer = 0; float _fieldOfView = 100.f; ScreenSpaceSkyBrowser* _skyBrowser; - glm::vec3 _borderColor; + glm::ivec3 _borderColor; }; } diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 240fc87029..17e09e934a 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -357,6 +357,16 @@ 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::documentations() const { return { diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index fd8f11b9ad..a9158cfee9 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -54,6 +54,7 @@ public: glm::vec2 getMousePositionInScreenSpaceCoords(glm::vec2& mousePos); void addRenderable(ScreenSpaceRenderable* object); WWTDataHandler* getWWTDataHandler(); + std::vector getSkyBrowsers(); scripting::LuaLibrary luaLibrary() const override; //std::vector documentations() const override; diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 14154056d1..616bd140a4 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -178,29 +178,41 @@ namespace openspace::skybrowser::luascriptfunctions { // Send image list to GUI ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::getTargetData"); - ScreenSpaceSkyBrowser* browser = dynamic_cast(global::renderEngine->screenSpaceRenderable("SkyBrowser1")); - ScreenSpaceSkyTarget* target = dynamic_cast(global::renderEngine->screenSpaceRenderable("SkyTarget1")); + SkyBrowserModule* module = global::moduleEngine->module(); - float FOV = browser->fieldOfView(); - - glm::dvec3 coords = target->getTargetDirection(); - glm::dvec2 celestCoords = skybrowser::galacticCartesianToJ2000(coords); lua_newtable(L); + int index = 1; + // Pass data for all the browsers and the corresponding targets + std::vector browsers = module->getSkyBrowsers(); - // Index for many browsers - // For now it's only one - ghoul::lua::push(L, 1); - lua_newtable(L); - // Push ("Key", value) - ghoul::lua::push(L, "FOV", FOV); - lua_settable(L, -3); - ghoul::lua::push(L, "RA", celestCoords.x); - lua_settable(L, -3); - ghoul::lua::push(L, "Dec", celestCoords.y); - lua_settable(L, -3); - - // Set table for the current ImageData - lua_settable(L, -3); + for (int i = 0; i < browsers.size(); i++) { + // Only add browsers that have an initialized target + ScreenSpaceSkyTarget* target = browsers[i]->getSkyTarget(); + if (target) { + glm::dvec3 coords = target->getTargetDirection(); + glm::dvec2 celestCoords = skybrowser::galacticCartesianToJ2000(coords); + // Convert color to vector so ghoul can read it + glm::ivec3 color = browsers[i]->_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()); + lua_settable(L, -3); + ghoul::lua::push(L, "RA", celestCoords.x); + lua_settable(L, -3); + ghoul::lua::push(L, "Dec", celestCoords.y); + lua_settable(L, -3); + ghoul::lua::push(L, "Color", colorVec); + lua_settable(L, -3); + + // Set table for the current ImageData + lua_settable(L, -3); + } + } + return 1; } diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index 73c150fa4a..b929b443c8 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -44,6 +44,12 @@ namespace { "Target Info", "tjobidabidobidabidopp plupp" }; + constexpr const openspace::properties::Property::PropertyInfo BorderColorInfo = + { + "BorderColor", + "Border color Info", + "tjobidabidobidabidopp plupp" + }; struct [[codegen::Dictionary(ScreenSpaceSkyBrowser)]] Parameters { @@ -56,6 +62,9 @@ namespace { // [[codegen::verbatim(TargetIDInfo.description)]] std::optional targetID; + + // [[codegen::verbatim(BorderColorInfo.description)]] + std::optional borderColor; }; #include "screenspaceskybrowser_codegen.cpp" @@ -66,12 +75,19 @@ namespace openspace { ScreenSpaceSkyBrowser::ScreenSpaceSkyBrowser(const ghoul::Dictionary& dictionary) : ScreenSpaceBrowser(dictionary) , _browserDimensions(BrowserDimensionInfo, _dimensions, glm::ivec2(0), glm::ivec2(300)) - , _vfieldOfView(ZoomInfo, 50.f, 0.1f, 70.f) + , _vfieldOfView(ZoomInfo, 10.f, 0.1f, 70.f) + , _borderColor(BorderColorInfo, glm::ivec3(rand() % 256, rand() % 256, rand() % 256)) , _skyTargetID(TargetIDInfo) , _camIsSyncedWWT(true) , _skyTarget(nullptr) - , _borderColor(220, 220, 220) { + // Ensure the color of the border is bright enough. + // Make sure the RGB color at least is 50% brightness + // By making each channel 50% bright in general + // 222 = sqrt(3*(0.5*256)^2) + while (glm::length(_borderColor.value()) < 222) { + _borderColor = glm::ivec3(rand() % 256, rand() % 256, rand() % 256); + } // Handle target dimension property const Parameters p = codegen::bake(dictionary); _browserDimensions = p.browserDimensions.value_or(_browserDimensions); @@ -145,7 +161,13 @@ namespace openspace { } bool ScreenSpaceSkyBrowser::setConnectedTarget() { + setBorderColor(_borderColor.value()); _skyTarget = dynamic_cast(global::renderEngine->screenSpaceRenderable(_skyTargetID.value())); + if (_skyTarget) { + _skyTarget->setBorderColor(_borderColor.value()); + _skyTarget->updateFOV(_vfieldOfView.value()); + _skyTarget->setDimensions(getBrowserPixelDimensions()); + } return _skyTarget != nullptr; } @@ -178,7 +200,7 @@ namespace openspace { } glm::ivec3 ScreenSpaceSkyBrowser::getColor() { - return _borderColor; + return _borderColor.value(); } void ScreenSpaceSkyBrowser::setBorderColor(glm::ivec3 col) { @@ -188,9 +210,9 @@ namespace openspace { } bool ScreenSpaceSkyBrowser::sendMessageToWWT(const ghoul::Dictionary& msg) { - std::string script = "sendMessageToWWT(" + ghoul::formatJson(msg) + ");"; - executeJavascript(script); - return true; + std::string script = "sendMessageToWWT(" + ghoul::formatJson(msg) + ");"; + executeJavascript(script); + return true; } diff --git a/modules/skybrowser/src/screenspaceskytarget.cpp b/modules/skybrowser/src/screenspaceskytarget.cpp index bdc181e3ee..d0424410f3 100644 --- a/modules/skybrowser/src/screenspaceskytarget.cpp +++ b/modules/skybrowser/src/screenspaceskytarget.cpp @@ -76,7 +76,7 @@ namespace openspace { , _targetDimensions(TargetDimensionInfo, glm::ivec2(1000.f), glm::ivec2(0.f), glm::ivec2(6000.f)) , _skyBrowserID(BrowserIDInfo) , _showCrosshairThreshold(CrosshairThresholdInfo, 2.f, 1.f, 70.f) - , _borderColor(220.f, 220.f, 220.f) + , _borderColor(220, 220, 220) { // Handle target dimension property const Parameters p = codegen::bake(dictionary); @@ -123,6 +123,12 @@ namespace openspace { void ScreenSpaceSkyTarget::setConnectedBrowser() { _skyBrowser = dynamic_cast(global::renderEngine->screenSpaceRenderable(_skyBrowserID.value())); + if (_skyBrowser) { + _skyBrowser->setBorderColor(_skyBrowser->getColor()); + _borderColor = _skyBrowser->getColor(); + updateFOV(_skyBrowser->_vfieldOfView.value()); + _targetDimensions = _skyBrowser->getBrowserPixelDimensions(); + } } bool ScreenSpaceSkyTarget::isReady() const { @@ -219,7 +225,7 @@ namespace openspace { _shader->setUniform(_uniformCache.borderWidth, borderWidth); _shader->setUniform(_uniformCache.targetDimensions, targetDim); _shader->setUniform(_uniformCache.modelTransform, modelTransform); - _shader->setUniform(_uniformCache.borderColor, _borderColor); + _shader->setUniform(_uniformCache.borderColor, glm::vec3(_borderColor)); _shader->setUniform( _uniformCache.viewProj,