From c63ee2d4171799b4ceadb47408f4ade75273f83a Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Wed, 1 Sep 2021 13:57:19 +0200 Subject: [PATCH] Master thesis work done --- data/assets/skyBrowserTargetPair.asset | 8 ++- modules/skybrowser/skybrowsermodule.cpp | 8 ++- .../skybrowser/src/renderableskybrowser.cpp | 30 ++++++----- .../skybrowser/src/screenspaceskybrowser.cpp | 20 ++++--- .../skybrowser/src/screenspaceskytarget.cpp | 52 ++++++++++++------- 5 files changed, 72 insertions(+), 46 deletions(-) diff --git a/data/assets/skyBrowserTargetPair.asset b/data/assets/skyBrowserTargetPair.asset index 5791e33d1c..6c0d6e33eb 100644 --- a/data/assets/skyBrowserTargetPair.asset +++ b/data/assets/skyBrowserTargetPair.asset @@ -2,17 +2,17 @@ local assetHelper = asset.require('util/asset_helper') local targetId= "SkyTarget0" local browserId = "SkyBrowser0" +local serverUrl = "https://data.openspaceproject.com/dist/skybrowser/page/" +--local localHostUrl = "http://localhost:8000" local browser = { Type = "ScreenSpaceSkyBrowser", Identifier = browserId, Name = "Sky Browser", - Url = "https://data.openspaceproject.com/dist/skybrowser/page/", + Url = serverUrl, FaceCamera = false, TargetID = targetId, CartesianPosition = {-1.0, -0.5, -2.1}, - UseRadiusAzimuthElevation = false, - RadiusAzimuthElevation = {1.0, 0.0, 0.0}, -- use for dome }; local target = { @@ -21,8 +21,6 @@ local target = { Name = "Sky Target", FaceCamera = false, BrowserID = browserId, - UseRadiusAzimuthElevation = false, - RadiusAzimuthElevation = {1.0, 0.0, 0.0}, -- use for dome }; asset.onInitialize(function () diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index ecf1160a27..1fe951b0a8 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -547,6 +547,7 @@ void SkyBrowserModule::createTargetBrowserPair() { glm::vec3 positionBrowser = { -1.0f, -0.5f, -2.1f }; std::string guiPath = "/SkyBrowser"; std::string url = "https://data.openspaceproject.com/dist/skybrowser/page/"; + //std::string localHostUrl = "http://localhost:8000"; const std::string browser = "{" "Identifier = '" + idBrowser + "'," @@ -594,6 +595,11 @@ void SkyBrowserModule::createTargetBrowserPair() { "openspace.skybrowser.connectBrowserTarget('" + idTarget + "');", scripting::ScriptEngine::RemoteScripting::Yes ); + + openspace::global::scriptEngine->queueScript( + "openspace.skybrowser.setSelectedBrowser('" + idBrowser + "');", + scripting::ScriptEngine::RemoteScripting::Yes + ); } void SkyBrowserModule::removeTargetBrowserPair(std::string& browserId) { @@ -751,8 +757,6 @@ void SkyBrowserModule::rotateCamera(double deltaTime) { double rotationAngle = smallestAngle * deltaTime; // Create the rotation matrix for local camera space glm::dvec3 rotationAxis = glm::normalize(glm::cross(_coordsStartAnimation, _coordsToAnimateTo)); - glm::dmat4 camMat = global::navigationHandler->camera()->viewRotationMatrix(); - glm::dvec3 viewDirectionLocal = camMat * glm::dvec4(rotationAxis, 1.0); glm::dmat4 rotmat = glm::rotate(rotationAngle, rotationAxis); // Rotate global::navigationHandler->camera()->rotate(glm::quat_cast(rotmat)); diff --git a/modules/skybrowser/src/renderableskybrowser.cpp b/modules/skybrowser/src/renderableskybrowser.cpp index 0a8768f9b4..a284c25a43 100644 --- a/modules/skybrowser/src/renderableskybrowser.cpp +++ b/modules/skybrowser/src/renderableskybrowser.cpp @@ -69,7 +69,7 @@ namespace openspace { , _dimensions(DimensionsInfo, glm::vec2(0.f), glm::vec2(0.f), glm::vec2(3000.f)) , _reload(ReloadInfo) , _fov(70.f) - , _connectToWwt(true) + , _connectToWwt(false) { // Handle target dimension property const Parameters p = codegen::bake(dictionary); @@ -221,20 +221,24 @@ namespace openspace { } void RenderableSkyBrowser::connectToWwt() { + // If the camera is already synced, the browser is already initialized + if (!_connectToWwt) { + _connectToWwt = true; + // Start a thread to enable user interaction while sending the calls to WWT + _threadWwtMessages = std::thread([&] { + while (_connectToWwt) { - // Start a thread to enable user interaction while sending the calls to WWT - _threadWwtMessages = std::thread([&] { - while (_connectToWwt) { + glm::dvec2 aim{ 0.0 }; + // Send a message just to establish contact + ghoul::Dictionary message = wwtmessage::moveCamera(aim, _fov, 0.0); + sendMessageToWWT(message); - glm::dvec2 aim { 0.0 }; - // Send a message just to establish contact - ghoul::Dictionary message = wwtmessage::moveCamera(aim, _fov, 0.0); - sendMessageToWWT(message); - - // Sleep so we don't bombard WWT with too many messages - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - } - }); + // Sleep so we don't bombard WWT with too many messages + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + } + }); + } + } void RenderableSkyBrowser::stopConnectingToWwt() { diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index 89a0fd4ccb..d83e881db3 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -79,7 +79,7 @@ namespace openspace { , _vfieldOfView(ZoomInfo, 10.f, 0.1f, 70.f) , _borderColor(BorderColorInfo, glm::ivec3(rand() % 256, rand() % 256, rand() % 256)) , _skyTargetID(TargetIDInfo) - , _camIsSyncedWWT(true) + , _camIsSyncedWWT(false) , _skyTarget(nullptr) { // Ensure the color of the border is bright enough. @@ -156,12 +156,18 @@ namespace openspace { } void ScreenSpaceSkyBrowser::initializeBrowser() { - // Set border color - setBorderColor(_borderColor.value()); - // Connect to target - setConnectedTarget(); - // Track target - WWTfollowCamera(); + // If the camera is already synced, the browser is already initialized + if (!_camIsSyncedWWT) { + _camIsSyncedWWT = true; + // Set border color + setBorderColor(_borderColor.value()); + // Connect to target if they haven't been connected + if (!_skyTarget) { + setConnectedTarget(); + } + // Track target + WWTfollowCamera(); + } } bool ScreenSpaceSkyBrowser::deinitializeGL() { diff --git a/modules/skybrowser/src/screenspaceskytarget.cpp b/modules/skybrowser/src/screenspaceskytarget.cpp index ec8f0f0841..c28679d27a 100644 --- a/modules/skybrowser/src/screenspaceskytarget.cpp +++ b/modules/skybrowser/src/screenspaceskytarget.cpp @@ -39,7 +39,8 @@ namespace { }; constexpr const std::array UniformNames = { - "ModelTransform", "ViewProjectionMatrix", "texture", "showCrosshair", "showCrosshairInTarget", "borderWidth", "targetDimensions", "borderColor" + "ModelTransform", "ViewProjectionMatrix", "texture", "showCrosshair", + "showCrosshairInTarget", "borderWidth", "targetDimensions", "borderColor" }; constexpr const openspace::properties::Property::PropertyInfo BrowserIDInfo = @@ -75,7 +76,8 @@ namespace { namespace openspace { ScreenSpaceSkyTarget::ScreenSpaceSkyTarget(const ghoul::Dictionary& dictionary) : ScreenSpaceRenderable(dictionary) - , _targetDimensions(TargetDimensionInfo, glm::ivec2(1000.f), glm::ivec2(0.f), glm::ivec2(6000.f)) + , _targetDimensions(TargetDimensionInfo, glm::ivec2(1000.f), glm::ivec2(0.f), + glm::ivec2(6000.f)) , _skyBrowserID(BrowserIDInfo) , _showCrosshairThreshold(CrosshairThresholdInfo, 0.6f, 0.1f, 70.f) , _borderColor(220, 220, 220) @@ -106,7 +108,10 @@ namespace openspace { identifier = makeUniqueIdentifier(identifier); setIdentifier(identifier); - _cartesianPosition.setValue(glm::dvec3(_cartesianPosition.value().x, _cartesianPosition.value().y, skybrowser::SCREENSPACE_Z)); + glm::dvec3 startPos{ _cartesianPosition.value().x, _cartesianPosition.value().y, + skybrowser::SCREENSPACE_Z }; + + _cartesianPosition.setValue(startPos); //_useRadiusAzimuthElevation.setValue(true); // Always make sure that the target and browser are visible together @@ -131,7 +136,9 @@ namespace openspace { } bool ScreenSpaceSkyTarget::setConnectedBrowser() { - _skyBrowser = dynamic_cast(global::renderEngine->screenSpaceRenderable(_skyBrowserID.value())); + ScreenSpaceRenderable* browser = global::renderEngine->screenSpaceRenderable( + _skyBrowserID.value()); + _skyBrowser = dynamic_cast(browser); return _skyBrowser; } @@ -178,8 +185,7 @@ namespace openspace { // The _scale us how much of the windows height the // browser covers: eg a browser that covers 0.25 of the // height of the window will have scale = 0.25 - float textureRatio = - static_cast(_targetDimensions.value().x) / static_cast(_targetDimensions.value().y); + float textureRatio = _targetDimensions.value().x / _targetDimensions.value().y; glm::mat4 scale = glm::scale( glm::mat4(1.f), @@ -221,19 +227,27 @@ namespace openspace { glDisable(GL_CULL_FACE); - glm::mat4 modelTransform = globalRotationMatrix() * translationMatrix() * localRotationMatrix() * scaleMatrix(); + glm::mat4 modelTransform = globalRotationMatrix() * translationMatrix() * + localRotationMatrix() * scaleMatrix(); float borderWidth = 0.0016f/_scale.value(); - float showCrosshairInTargetThreshold = 2.f; // show crosshair and target when browser FOV < 2 degrees + glm::vec2 targetDim; - bool showCrosshair; - bool showCrosshairInTarget; - _targetDimensions.value() == glm::vec2(0) ? targetDim = glm::vec2(1) : targetDim = _targetDimensions.value(); + if(_targetDimensions.value() == glm::vec2(0)) { + targetDim = glm::vec2(1); + } + else { + targetDim = _targetDimensions.value(); + } _shader->activate(); - _fieldOfView < showCrosshairInTargetThreshold && _fieldOfView > _showCrosshairThreshold ? showCrosshairInTarget = true : showCrosshairInTarget = false; - _fieldOfView < _showCrosshairThreshold ? showCrosshair = true : showCrosshair = false; - - _shader->setUniform(_uniformCache.showCrosshair, showCrosshair); + // Show crosshair and target when browser FOV < 2 degrees + float showCrosshairInTargetThreshold = 2.f; + bool showOnlyCrosshair; + bool showCrosshairInTarget; + showOnlyCrosshair = _fieldOfView < _showCrosshairThreshold; + showCrosshairInTarget = _fieldOfView < showCrosshairInTargetThreshold && !showOnlyCrosshair; + + _shader->setUniform(_uniformCache.showCrosshair, showOnlyCrosshair); _shader->setUniform(_uniformCache.showCrosshairInTarget, showCrosshairInTarget); _shader->setUniform(_uniformCache.borderWidth, borderWidth); _shader->setUniform(_uniformCache.targetDimensions, targetDim); @@ -291,9 +305,9 @@ namespace openspace { glm::dvec3 ScreenSpaceSkyTarget::getTargetDirectionGalactic() { // Get camera view direction and orthogonal coordinate system of camera view direction glm::dvec3 camPos = global::navigationHandler->camera()->positionVec3(); - glm::dvec3 targetPosWorldSpace = glm::inverse(global::navigationHandler->camera()->combinedViewMatrix()) * glm::dvec4(_cartesianPosition.value(), 1.0); - glm::dvec3 targetDirection = glm::normalize(targetPosWorldSpace - camPos); - + //glm::dvec3 targetPosWorldSpace = glm::inverse(global::navigationHandler->camera()->combinedViewMatrix()) * glm::dvec4(_cartesianPosition.value(), 1.0); + //glm::dvec3 targetDirection = glm::normalize(targetPosWorldSpace - camPos); + glm::dvec3 targetDirection = glm::normalize(glm::inverse(global::navigationHandler->camera()->viewRotationMatrix()) * glm::dvec4(_cartesianPosition.value(), 1.0)); return targetDirection; } @@ -402,7 +416,7 @@ namespace openspace { void ScreenSpaceSkyTarget::startAnimation(glm::dvec2 coordsEnd, float FOVEnd, bool lockAfterwards) { // Save the Cartesian celestial coordinates for animation - // to make sure wrap around works + // The coordinates are Cartesian to avoid wrap-around issues _coordsToAnimateTo = glm::normalize(skybrowser::sphericalToCartesian(coordsEnd)); _coordsStartAnimation = glm::normalize(skybrowser::sphericalToCartesian( getTargetDirectionCelestial()));