From b2861183ae59fd8a86d1d8935bf6742d7bcb6f87 Mon Sep 17 00:00:00 2001 From: Lovisa Hassler Date: Fri, 20 Dec 2019 10:15:12 +0100 Subject: [PATCH] Distance label hack, needs cleanup and replacement --- modules/base/rendering/renderablelabels.cpp | 43 ++++++++++++++++++- modules/base/rendering/renderablelabels.h | 1 + modules/base/rendering/renderablenodeline.cpp | 22 +++++++--- modules/base/rendering/renderablenodeline.h | 16 +++++-- 4 files changed, 72 insertions(+), 10 deletions(-) diff --git a/modules/base/rendering/renderablelabels.cpp b/modules/base/rendering/renderablelabels.cpp index 5c8bbd20ae..d5a51afea1 100644 --- a/modules/base/rendering/renderablelabels.cpp +++ b/modules/base/rendering/renderablelabels.cpp @@ -46,6 +46,11 @@ #include #include +#include +#include +#include +#include + namespace { constexpr const char* _loggerCat = "base::RenderableLabels"; @@ -175,6 +180,13 @@ namespace { "Fade-In/-Out ending speed.", "Fade-In/-Out ending speed." }; + + constexpr openspace::properties::Property::PropertyInfo NodeLineInfo = { + "NodeLine", + "Node Line", + "Optional property to track a nodeline. When tracking the label text will be updating the distance " + "from the nodeline start and end. " + }; } // namespace namespace openspace { @@ -315,6 +327,7 @@ RenderableLabels::RenderableLabels(const ghoul::Dictionary& dictionary) , _pixelSizeControl(PixelSizeControlInfo, false) , _enableFadingEffect(EnableFadingEffectInfo, false) , _labelText(LabelTextInfo) + , _nodeLine(NodeLineInfo) , _fadeStartDistance(FadeStartDistInfo, 1.f, 0.f, 100.f) , _fadeEndDistance(FadeEndDistInfo, 1.f, 0.f, 100.f) , _fadeStartSpeed(FadeStartSpeedInfo, 1.f, 1.f, 100.f) @@ -447,6 +460,11 @@ RenderableLabels::RenderableLabels(const ghoul::Dictionary& dictionary) _fadeStartDistance = dictionary.value(FadeStartDistInfo.identifier); } + if (dictionary.hasKey(NodeLineInfo.identifier)) { + _nodeLine = dictionary.value(NodeLineInfo.identifier); + addProperty(_nodeLine); + } + addProperty(_fadeStartDistance); _fadeStartUnitOption.addOption(Meter, MeterUnit); @@ -683,7 +701,30 @@ void RenderableLabels::render(const RenderData& data, RendererTasks&) { //} } -void RenderableLabels::update(const UpdateData&) { +void RenderableLabels::update(const UpdateData& data) { + + if (global::renderEngine.scene()->sceneGraphNode(_nodeLine)) { + + // Calculate distance + SceneGraphNode* nodelineNode = global::renderEngine.scene()->sceneGraphNode(_nodeLine); + RenderableNodeLine* nodeline = dynamic_cast(nodelineNode->renderable()); + double myDistance = nodeline->getDistance(); + + // format string + float scale = getUnit(Kilometer); + std::string distanceText = std::to_string(std::round(myDistance / scale)); + int pos = distanceText.find("."); + std::string subStr = distanceText.substr(pos); + distanceText.erase(pos, subStr.size()); + std::string finalText = distanceText + " " + KilometerUnit; + setLabelText(finalText); + + // Update placement of label with transformation matrix + glm::dvec3 start = global::renderEngine.scene()->sceneGraphNode(nodeline->_start)->worldPosition(); + glm::dvec3 end = global::renderEngine.scene()->sceneGraphNode(nodeline->_end)->worldPosition(); + glm::dvec3 goalPos = start + (end - start) / 2.0; + _transformationMatrix = glm::translate(glm::dmat4(1.0), goalPos); + } } void RenderableLabels::setLabelText(const std::string & newText) { diff --git a/modules/base/rendering/renderablelabels.h b/modules/base/rendering/renderablelabels.h index 0f5bbf6f99..7b97b80a98 100644 --- a/modules/base/rendering/renderablelabels.h +++ b/modules/base/rendering/renderablelabels.h @@ -107,6 +107,7 @@ private: properties::BoolProperty _pixelSizeControl; properties::BoolProperty _enableFadingEffect; properties::StringProperty _labelText; + properties::StringProperty _nodeLine; properties::FloatProperty _fadeStartDistance; properties::FloatProperty _fadeEndDistance; properties::FloatProperty _fadeStartSpeed; diff --git a/modules/base/rendering/renderablenodeline.cpp b/modules/base/rendering/renderablenodeline.cpp index 56bbdd53a0..36fbbe5a50 100644 --- a/modules/base/rendering/renderablenodeline.cpp +++ b/modules/base/rendering/renderablenodeline.cpp @@ -43,13 +43,13 @@ namespace { constexpr openspace::properties::Property::PropertyInfo StartNodeInfo = { "StartNode", "Start Node", - "The identifier of the node the line starts from. " + "The identifier of the node the line starts from. Defaults to 'Root' if not specified. " }; constexpr openspace::properties::Property::PropertyInfo EndNodeInfo = { "EndNode", "End Node", - "The identifier of the node the line ends at. " + "The identifier of the node the line ends at. Defaults to 'Root' if not specified. " }; constexpr openspace::properties::Property::PropertyInfo LineColorInfo = { @@ -76,13 +76,13 @@ documentation::Documentation RenderableNodeLine::Documentation() { { StartNodeInfo.identifier, new StringVerifier, - Optional::No, + Optional::Yes, StartNodeInfo.description }, { EndNodeInfo.identifier, new StringVerifier, - Optional::No, + Optional::Yes, EndNodeInfo.description }, { @@ -114,8 +114,13 @@ RenderableNodeLine::RenderableNodeLine(const ghoul::Dictionary& dictionary) "RenderableNodeLine" ); - _start = dictionary.value(StartNodeInfo.identifier); - _end = dictionary.value(EndNodeInfo.identifier); + if (dictionary.hasKey(StartNodeInfo.identifier)) { + _start = dictionary.value(StartNodeInfo.identifier); + } + + if (dictionary.hasKey(EndNodeInfo.identifier)) { + _end = dictionary.value(EndNodeInfo.identifier); + } if (dictionary.hasKey(LineColorInfo.identifier)) { _lineColor = dictionary.value(LineColorInfo.identifier); @@ -131,6 +136,11 @@ RenderableNodeLine::RenderableNodeLine(const ghoul::Dictionary& dictionary) addProperty(_opacity); } +double RenderableNodeLine::getDistance() +{ + return glm::distance(_startPos, _endPos); +} + void RenderableNodeLine::initializeGL() { _program = BaseModule::ProgramObjectManager.request( ProgramName, diff --git a/modules/base/rendering/renderablenodeline.h b/modules/base/rendering/renderablenodeline.h index d8866def1b..2792f986d5 100644 --- a/modules/base/rendering/renderablenodeline.h +++ b/modules/base/rendering/renderablenodeline.h @@ -27,6 +27,7 @@ #include +#include #include #include #include @@ -50,7 +51,18 @@ public: ~RenderableNodeLine() = default; static documentation::Documentation Documentation(); - + + // Identifier of the optional distance label + std::string _distanceLabelId; + //SceneGraphNode* distanceLabelNode = nullptr; + //RenderableLabels* distanceLabel; + + // Get the distance between the start and end node + double getDistance(); + + properties::StringProperty _start; + properties::StringProperty _end; + private: void initializeGL() override; void deinitializeGL() override; @@ -75,8 +87,6 @@ private: glm::dvec3 _startPos; glm::dvec3 _endPos; - properties::StringProperty _start; - properties::StringProperty _end; properties::Vec3Property _lineColor; properties::FloatProperty _lineWidth; };