diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index 1f26d67467..6ff6a63d2d 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -3,6 +3,7 @@ #include #include +#include #include namespace openspace { @@ -29,6 +30,7 @@ namespace openspace { bool hasLoadedCollections(); void setHasLoadedCollections(bool isLoaded); void addImage(ImageData& image); + properties::FloatProperty& getOpacity(); // Translation //void translate(glm::vec2 translation); diff --git a/modules/skybrowser/include/screenspaceskytarget.h b/modules/skybrowser/include/screenspaceskytarget.h index e2d4b01bec..2b26b667d5 100644 --- a/modules/skybrowser/include/screenspaceskytarget.h +++ b/modules/skybrowser/include/screenspaceskytarget.h @@ -38,6 +38,7 @@ namespace openspace { void setConnectedBrowser(); void setBorderColor(glm::ivec3 color); glm::ivec3 getColor(); + properties::FloatProperty& getOpacity(); glm::dvec2 getScreenSpaceDimensions(); glm::dvec2 getUpperRightCornerScreenSpace(); diff --git a/modules/skybrowser/shaders/target_fs.glsl b/modules/skybrowser/shaders/target_fs.glsl index 047eaf847a..797bbee5f4 100644 --- a/modules/skybrowser/shaders/target_fs.glsl +++ b/modules/skybrowser/shaders/target_fs.glsl @@ -2,7 +2,7 @@ uniform sampler2D texture1; uniform float borderWidth; uniform vec2 targetDimensions; uniform bool showCrosshair; -uniform vec3 borderColor; +uniform vec4 borderColor; in vec2 vs_st; @@ -11,8 +11,8 @@ in vec4 vs_position; float crossLine(in float _width, in float _coord) { float center = 0.5f; - float line = smoothstep(center, center+(_width/2) , _coord) - - smoothstep(center-(_width/2), center, _coord); + float line = smoothstep(center, center+(_width/2) , _coord) - + smoothstep(center-(_width/2), center, _coord); return line; } @@ -32,12 +32,12 @@ Fragment getFragment() { float borderTopRight = step(borderWidth, vs_st.y) * step(borderWidth, (1.0)-vs_st.y); vec3 border = vec3(borderBottomLeft*borderTopRight); - // show crosshair or border + // show crosshair or border frag.color = vec4(1,1,1,1); - frag.color.rgb = vec3(borderColor / 255); + frag.color.rgba = vec4(borderColor); if(showCrosshair) { - frag.color.rgb = vec3(borderColor / 255); + frag.color.rgba = vec4(borderColor); if(crosshair == vec3(0.0)) { frag.color.a = 0.0; } @@ -50,4 +50,3 @@ Fragment getFragment() { return frag; } - diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 980d6c64c7..67019622a3 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include "skybrowsermodule_lua.inl" #include @@ -290,6 +291,7 @@ SkyBrowserModule::SkyBrowserModule() if (button == MouseButton::Left) { + isRotating = false; startDragMousePos = _mousePosition; startDragObjectPos = _mouseOnObject->getScreenSpacePosition(); @@ -344,13 +346,39 @@ SkyBrowserModule::SkyBrowserModule() ); global::callback::preSync->emplace_back([this]() { + // Disable browser and targets when camera is outside of solar system + double solarSystemRadius = 30.0 * distanceconstants::AstronomicalUnit; + double cameraSSBDistance = glm::length( + global::navigationHandler->camera()->positionVec3()); + bool _cameraInSolarSystem = cameraSSBDistance < solarSystemRadius; + double fadingTime = 2.0; + double deltaTime = global::windowDelegate->deltaTime(); + + // Fade out or in browser & target for (ScreenSpaceSkyBrowser* browser : browsers) { - if (browser->getSkyTarget()) { - browser->getSkyTarget()->animateToCoord(global::windowDelegate->deltaTime()); + // If outside solar system and browser is visible + if (!_cameraInSolarSystem && browser->isEnabled()) { + bool fadingIsFinished = fadeBrowserAndTarget(true, fadingTime, deltaTime); + + if (fadingIsFinished) { + browser->property("Enabled")->set(false); + } + } + // If within solar system and browser is not visible + else if (_cameraInSolarSystem && !browser->isEnabled()) { + browser->property("Enabled")->set(true); + } + // If within solar system and browser is visible + if (_cameraInSolarSystem && browser->isEnabled()) { + fadeBrowserAndTarget(false, fadingTime, deltaTime); + + if (browser->getSkyTarget()) { + browser->getSkyTarget()->animateToCoord(deltaTime); + } } } if (isRotating) { - rotateCamera(global::windowDelegate->deltaTime()); + rotateCamera(deltaTime); } }); } @@ -453,6 +481,42 @@ void SkyBrowserModule::rotateCamera(double deltaTime) { } } +bool SkyBrowserModule::fadeBrowserAndTarget(bool makeTransparent, double fadeTime, double deltaTime) { + float opacityDelta = static_cast(deltaTime / fadeTime); + float highTreshold = 0.99f; + float lowThreshold = 0.01f; + float transparent = 0.0; + float opaque = 1.0; + if (makeTransparent) { + opacityDelta *= -1.f; + } + bool finished = true; + for (ScreenSpaceSkyBrowser* browser : browsers) { + // If there is a target, fade it as well. Otherwise, skip + ScreenSpaceSkyTarget* target = browser->getSkyTarget(); + bool targetFinished = true; + if (target) { + target->getOpacity() = target->getOpacity().value() + opacityDelta; + float opacityTarget = abs(target->getOpacity().value()); + targetFinished = makeTransparent ? opacityTarget < lowThreshold : opacityTarget > highTreshold; + if (targetFinished) { + target->getOpacity() = makeTransparent ? transparent : opaque; + } + } + // Keep fading the browsers until all are finished + browser->getOpacity() = browser->getOpacity().value() + opacityDelta; + float opacityBrowser = abs(browser->getOpacity().value()); + bool browserFinished = makeTransparent ? opacityBrowser < lowThreshold : opacityBrowser > highTreshold; + if (browserFinished && targetFinished) { + browser->getOpacity() = makeTransparent ? transparent : opaque; + } + else { + finished = false; + } + } + return finished; +} + void SkyBrowserModule::setSelectedBrowser(ScreenSpaceRenderable* ptr) { ScreenSpaceSkyBrowser* browser = to_browser(ptr) ? to_browser(ptr) : to_target(ptr)->getSkyBrowser(); auto it = std::find(browsers.begin(), browsers.end(), browser); @@ -499,6 +563,10 @@ int SkyBrowserModule::loadImages(const std::string& root, const std::string& dir return nLoadedImages; } + +bool SkyBrowserModule::cameraInSolarSystem() { + return _cameraInSolarSystem; +} /* std::vector SkyBrowserModule::documentations() const { return { diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index 164c273f8e..da09f81aac 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -61,11 +61,13 @@ public: std::vector& getSkyBrowsers(); void startRotation(glm::dvec2 coordsEnd); void rotateCamera(double deltaTime); + bool fadeBrowserAndTarget(bool makeTransparent, double fadeTime, double deltaTime); void setSelectedBrowser(ScreenSpaceRenderable* ptr); void setSelectedBrowser(int i); int getSelectedBrowserIndex(); int loadImages(const std::string& root, const std::string& directory); void add3dBrowser(SceneGraphNode* node); + bool cameraInSolarSystem(); scripting::LuaLibrary luaLibrary() const override; //std::vector documentations() const override; @@ -99,7 +101,6 @@ protected: bool currentlyDraggingObject; // Data handler WWTDataHandler* dataHandler; - // For animating rotation of camera to look at coordinate glm::dvec3 _coordsToAnimateTo; glm::dvec3 _coordsStartAnimation; @@ -107,6 +108,8 @@ protected: // For tracking the currently selected browser int selectedBrowser{ -1 }; glm::ivec3 highlightAddition{ 35, 35, 35 }; + // Mode of browsing + bool _cameraInSolarSystem{ -1 }; }; } // namespace openspace diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index 2ede8d52e1..62520f00d9 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -321,4 +321,8 @@ namespace openspace { sendMessageToWWT(wwtmessage::setLayerOpacity(image, 1.0)); _imageId++; } + + properties::FloatProperty& ScreenSpaceSkyBrowser::getOpacity() { + return _opacity; + } } diff --git a/modules/skybrowser/src/screenspaceskytarget.cpp b/modules/skybrowser/src/screenspaceskytarget.cpp index 7f1918269e..40889faaf1 100644 --- a/modules/skybrowser/src/screenspaceskytarget.cpp +++ b/modules/skybrowser/src/screenspaceskytarget.cpp @@ -233,7 +233,8 @@ namespace openspace { _shader->setUniform(_uniformCache.borderWidth, borderWidth); _shader->setUniform(_uniformCache.targetDimensions, targetDim); _shader->setUniform(_uniformCache.modelTransform, modelTransform); - _shader->setUniform(_uniformCache.borderColor, glm::vec3(_borderColor)); + glm::vec4 color = { glm::vec3(_borderColor) / 255.f, _opacity.value() }; + _shader->setUniform(_uniformCache.borderColor, color); _shader->setUniform( _uniformCache.viewProj, @@ -396,5 +397,7 @@ namespace openspace { FOVToAnimateTo = FOVEnd; isAnimated = true; } - + properties::FloatProperty& ScreenSpaceSkyTarget::getOpacity() { + return _opacity; + } }