Fade in and out browser and target when going outside of the solar system

This commit is contained in:
Ylva Selling
2021-05-19 17:16:17 +02:00
parent 28db33f199
commit 1380c7a2c4
7 changed files with 93 additions and 13 deletions

View File

@@ -3,6 +3,7 @@
#include <modules/webbrowser/include/screenspacebrowser.h>
#include <modules/skybrowser/include/wwtdatahandler.h>
#include <openspace/properties/scalar/floatproperty.h>
#include <openspace/properties/stringproperty.h>
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);

View File

@@ -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();

View File

@@ -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;
}

View File

@@ -37,6 +37,7 @@
#include <openspace/scene/scenegraphnode.h>
#include <openspace/interaction/navigationhandler.h>
#include <openspace/scene/scene.h>
#include <openspace/util/distanceconstants.h>
#include <openspace/util/factorymanager.h>
#include "skybrowsermodule_lua.inl"
#include <ghoul/logging/logmanager.h>
@@ -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<float>(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<documentation::Documentation> SkyBrowserModule::documentations() const {
return {

View File

@@ -61,11 +61,13 @@ public:
std::vector<ScreenSpaceSkyBrowser*>& 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<documentation::Documentation> 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

View File

@@ -321,4 +321,8 @@ namespace openspace {
sendMessageToWWT(wwtmessage::setLayerOpacity(image, 1.0));
_imageId++;
}
properties::FloatProperty& ScreenSpaceSkyBrowser::getOpacity() {
return _opacity;
}
}

View File

@@ -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;
}
}