mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-02-27 15:29:26 -06:00
Fade in and out browser and target when going outside of the solar system
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -321,4 +321,8 @@ namespace openspace {
|
||||
sendMessageToWWT(wwtmessage::setLayerOpacity(image, 1.0));
|
||||
_imageId++;
|
||||
}
|
||||
|
||||
properties::FloatProperty& ScreenSpaceSkyBrowser::getOpacity() {
|
||||
return _opacity;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user