From 128d21b7598c1b92f04c931ac515c553a32dce3e Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Thu, 17 Mar 2022 10:36:04 -0400 Subject: [PATCH] Transform the hovercircle to a renderable so it works in a dome environment --- data/assets/hoverCircle.asset | 40 +++++++++++---------- modules/skybrowser/skybrowsermodule.cpp | 24 +++++-------- modules/skybrowser/skybrowsermodule.h | 4 +-- modules/skybrowser/skybrowsermodule_lua.inl | 3 +- 4 files changed, 34 insertions(+), 37 deletions(-) diff --git a/data/assets/hoverCircle.asset b/data/assets/hoverCircle.asset index 2a00549c29..f5673b1bd3 100644 --- a/data/assets/hoverCircle.asset +++ b/data/assets/hoverCircle.asset @@ -1,25 +1,29 @@ -local id = "HoverCircle" +-- This asset requires OpenSpace to be built with the OPENSPACE_MODULE_SPOUT enabled + +local transforms = asset.require("scene/solarsystem/sun/transforms") local circle = { - Identifier = id, - Type = "ScreenSpaceImageLocal", - Name = "HoverCircle", - FaceCamera = false, - UseRadiusAzimuthElevation = false, - RadiusAzimuthElevation = { 1.0, 0.0, 0.0 }, -- use for dome - Scale = 0.025, - Enabled = false, - TexturePath = "${ASSETS}/circle.png", - CartesianPosition = { 0, 0, -2.1 }, -}; + Identifier = "hoverCircle", + Parent = transforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = 3.0E15, + Origin = "Center", + Billboard = true, + Texture = "${ASSETS}/circle.png" + }, + GUI = { + Path = "/SkyBrowser" + } +} -asset.onInitialize(function () - openspace.addScreenSpaceRenderable(circle) - openspace.skybrowser.setHoverCircle(id) +asset.onInitialize(function() + openspace.addSceneGraphNode(circle) + openspace.skybrowser.setHoverCircle('hoverCircle') end) -asset.onDeinitialize(function () - openspace.removeScreenSpaceRenderable(circle) +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(circle) end) -asset.export("circle", circle) +asset.export(circle) diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 5610623ed5..2905df7f48 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -481,7 +481,7 @@ void SkyBrowserModule::lookAtTarget(const std::string& id) { } } -void SkyBrowserModule::setHoverCircle(ScreenSpaceImageLocal* circle) { +void SkyBrowserModule::setHoverCircle(SceneGraphNode* circle) { _hoverCircle = circle; } @@ -491,26 +491,20 @@ void SkyBrowserModule::moveHoverCircle(int i) { // Only move and show circle if the image has coordinates if (_hoverCircle && image.hasCelestialCoords && _isCameraInSolarSystem) { // Make circle visible - _hoverCircle->setEnabled(true); + _hoverCircle->renderable()->property("Enabled")->set(true); // Set the exact target position - glm::dvec3 localCamera = skybrowser::equatorialToLocalCamera(image.equatorialCartesian); - - if (_hoverCircle->isUsingRaeCoords()) { - glm::vec3 position = _hoverCircle->raePosition().x * glm::vec3(localCamera); - _hoverCircle->setRaeFromCartesianPosition(position); - } - else { - _hoverCircle->setCartesianPosition( - skybrowser::localCameraToScreenSpace3d(localCamera) - ); - } + // Move it slightly outside of the celestial sphere so it doesn't overlap with + // the target + glm::dvec3 pos = skybrowser::equatorialToGalactic(image.equatorialCartesian); + pos *= skybrowser::CelestialSphereRadius * 1.1; + _hoverCircle->property("Translation.Position")->set(pos); } } void SkyBrowserModule::disableHoverCircle() { - if (_hoverCircle && _hoverCircle->isEnabled()) { - _hoverCircle->setEnabled(false); + if (_hoverCircle && _hoverCircle->renderable()) { + _hoverCircle->renderable()->property("Enabled")->set(false); } } diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index 53bc7c0197..f754e7f567 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -72,7 +72,7 @@ public: void setSelectedBrowser(const std::string& id); void setSelectedObject(); // Manage mouse interactions - void setHoverCircle(ScreenSpaceImageLocal* circle); + void setHoverCircle(SceneGraphNode* circle); // Rotation, animation, placement void lookAtTarget(const std::string& id); @@ -115,7 +115,7 @@ private: // The browsers and targets std::vector> _targetsBrowsers; TargetBrowserPair* _mouseOnPair = nullptr; - ScreenSpaceImageLocal* _hoverCircle = nullptr; + SceneGraphNode* _hoverCircle = nullptr; std::string _selectedBrowser = ""; // Currently selected browser // Fading diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 6cc71deddc..33c6306156 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -73,8 +73,7 @@ int setHoverCircle(lua_State* L) { SkyBrowserModule* module = global::moduleEngine->module(); std::string id = ghoul::lua::value(L, 1); - ScreenSpaceImageLocal* circle = dynamic_cast( - global::renderEngine->screenSpaceRenderable(id)); + SceneGraphNode* circle = global::renderEngine->scene()->sceneGraphNode(id); module->setHoverCircle(circle); return 0;