From 8d4b68285155b8fd13f1aba64a99a35f97b71689 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Mon, 4 Jun 2018 15:09:12 -0400 Subject: [PATCH 1/2] Fixed font rendering issues in non dome environments. --- .../digitaluniverse/constellations.asset | 4 +- .../rendering/renderablebillboardscloud.cpp | 67 ++++++++++--------- .../rendering/renderabledumeshes.cpp | 12 +++- 3 files changed, 49 insertions(+), 34 deletions(-) diff --git a/data/assets/scene/digitaluniverse/constellations.asset b/data/assets/scene/digitaluniverse/constellations.asset index 0b18a7e549..18f1911df8 100644 --- a/data/assets/scene/digitaluniverse/constellations.asset +++ b/data/assets/scene/digitaluniverse/constellations.asset @@ -43,8 +43,8 @@ local constellations = { File = speck .. "/constellations.speck", LabelFile = speck .. "/constellations.label", TextColor = { 0.8, 0.8, 0.8, 1.0 }, - TextMinSize = 10.0, - TextMaxSize = 30.0, + TextSize = 14.5, + TextMaxSize = 170.0, TextMinSize = 8.0, MeshColor = { { 0.6, 0.4, 0.4 }, { 0.8, 0.0, 0.0 }, { 0.0, 0.3, 0.8 } }, Unit = "pc" diff --git a/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp index 3e5441d5af..871ebe6419 100644 --- a/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp +++ b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -570,7 +571,7 @@ namespace openspace { addProperty(_scaleFactor); if (dictionary.hasKey(PolygonSidesInfo.identifier)) { - _polygonSides = static_cast( + _polygonSides = static_cast( dictionary.value(PolygonSidesInfo.identifier) ); _hasPolygon = true; @@ -597,21 +598,19 @@ namespace openspace { if (dictionary.hasKey(TextSizeInfo.identifier)) { - _textSize = dictionary.value(TextSizeInfo.identifier); + _textSize = dictionary.value(TextSizeInfo.identifier); } addProperty(_textSize); if (dictionary.hasKey(LabelMinSizeInfo.identifier)) { - _textMinSize = static_cast( - dictionary.value(LabelMinSizeInfo.identifier) - ); + _textMinSize = + dictionary.value(LabelMinSizeInfo.identifier); } addProperty(_textMinSize); if (dictionary.hasKey(LabelMaxSizeInfo.identifier)) { - _textMaxSize = static_cast( - dictionary.value(LabelMaxSizeInfo.identifier) - ); + _textMaxSize = + dictionary.value(LabelMaxSizeInfo.identifier); } addProperty(_textMaxSize); } @@ -895,19 +894,19 @@ namespace openspace { scale = 1e3; break; case Parsec: - scale = PARSEC; + scale = static_cast(PARSEC); break; case Kiloparsec: - scale = 1e3 * PARSEC; + scale = static_cast(1e3 * PARSEC); break; case Megaparsec: - scale = 1e6 * PARSEC; + scale = static_cast(1e6 * PARSEC); break; case Gigaparsec: - scale = 1e9 * PARSEC; + scale = static_cast(1e9 * PARSEC); break; case GigalightYears: - scale = 306391534.73091 * PARSEC; + scale = static_cast(306391534.73091 * PARSEC); break; } @@ -921,9 +920,9 @@ namespace openspace { *_font, scaledPos, textColor, - pow(10.0, _textSize.value()), - _textMinSize, - _textMaxSize, + powf(10.f, _textSize.value()), + static_cast(_textMinSize), + static_cast(_textMaxSize), modelViewProjectionMatrix, orthoRight, orthoUp, @@ -947,32 +946,32 @@ namespace openspace { scale = 1e3; break; case Parsec: - scale = PARSEC; + scale = static_cast(PARSEC); break; case Kiloparsec: - scale = 1e3 * PARSEC; + scale = static_cast(1e3 * PARSEC); break; case Megaparsec: - scale = 1e6 * PARSEC; + scale = static_cast(1e6 * PARSEC); break; case Gigaparsec: - scale = 1e9 * PARSEC; + scale = static_cast(1e9 * PARSEC); break; case GigalightYears: - scale = 306391534.73091 * PARSEC; + scale = static_cast(306391534.73091 * PARSEC); break; } float fadeInVariable = 1.0f; if (!_disableFadeInDistance) { - float distCamera = glm::length(data.camera.positionVec3()); + float distCamera = static_cast(glm::length(data.camera.positionVec3())); glm::vec2 fadeRange = _fadeInDistance; float a = 1.0f / ((fadeRange.y - fadeRange.x) * scale); float b = -(fadeRange.x / (fadeRange.y - fadeRange.x)); float funcValue = a * distCamera + b; - fadeInVariable *= funcValue > 1.0 ? 1.0 : funcValue; + fadeInVariable *= funcValue > 1.f ? 1.f : funcValue; - if (funcValue < 0.01) { + if (funcValue < 0.01f) { return; } } @@ -989,14 +988,22 @@ namespace openspace { glm::dmat4 modelViewProjectionMatrix = glm::dmat4(projectionMatrix) * modelViewMatrix; - glm::dvec3 cameraViewDirectionWorld = glm::normalize(data.camera.viewDirectionWorldSpace()); - glm::dvec3 cameraUpDirectionWorld = glm::normalize(data.camera.lookUpVectorWorldSpace()); - glm::dvec3 orthoRight = glm::dvec3(glm::cross(cameraUpDirectionWorld, cameraViewDirectionWorld)); + glm::dvec3 cameraViewDirectionWorld = -data.camera.viewDirectionWorldSpace(); + glm::dvec3 cameraUpDirectionWorld = data.camera.lookUpVectorWorldSpace(); + glm::dvec3 orthoRight = glm::normalize( + glm::cross(cameraUpDirectionWorld, cameraViewDirectionWorld) + ); if (orthoRight == glm::dvec3(0.0)) { - glm::dvec3 otherVector(cameraUpDirectionWorld.y, cameraUpDirectionWorld.x, cameraUpDirectionWorld.z); - orthoRight = glm::dvec3(glm::cross(otherVector, cameraViewDirectionWorld)); + glm::dvec3 otherVector( + cameraUpDirectionWorld.y, + cameraUpDirectionWorld.x, + cameraUpDirectionWorld.z + ); + orthoRight = glm::normalize(glm::cross(otherVector, cameraViewDirectionWorld)); } - glm::dvec3 orthoUp = cameraUpDirectionWorld; + glm::dvec3 orthoUp = glm::normalize( + glm::cross(cameraViewDirectionWorld, orthoRight) + ); if (_hasSpeckFile) { renderBillboards( diff --git a/modules/digitaluniverse/rendering/renderabledumeshes.cpp b/modules/digitaluniverse/rendering/renderabledumeshes.cpp index 96000dc2d7..1a07926055 100644 --- a/modules/digitaluniverse/rendering/renderabledumeshes.cpp +++ b/modules/digitaluniverse/rendering/renderabledumeshes.cpp @@ -283,10 +283,9 @@ RenderableDUMeshes::RenderableDUMeshes(const ghoul::Dictionary& dictionary) addProperty(_drawElements); } - // DEBUG: _renderOption.addOption(0, "Camera View Direction"); _renderOption.addOption(1, "Camera Position Normal"); - _renderOption.addOption(2, "Screen center Position Normal"); + _renderOption.set(1); addProperty(_renderOption); if (dictionary.hasKey(keyUnit)) { @@ -596,6 +595,15 @@ void RenderableDUMeshes::render(const RenderData& data, RendererTasks&) { glm::vec3 orthoRight = glm::normalize( glm::vec3(worldToModelTransform * glm::vec4(right, 0.0)) ); + + if (orthoRight == glm::vec3(0.0)) { + glm::vec3 otherVector(lookup.y, lookup.x, lookup.z); + right = glm::cross(viewDirection, otherVector); + orthoRight = glm::normalize( + glm::vec3(worldToModelTransform * glm::vec4(right, 0.0)) + ); + } + glm::vec3 orthoUp = glm::normalize( glm::vec3(worldToModelTransform * glm::vec4(up, 0.0)) ); From 29d0a94782d55a156fe91687aace7a71b45abc83 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Mon, 4 Jun 2018 16:28:54 -0400 Subject: [PATCH 2/2] Automatic billboard orientation based on projection type. --- include/openspace/engine/wrapper/sgctwindowwrapper.h | 1 + include/openspace/engine/wrapper/windowwrapper.h | 7 +++++++ .../rendering/renderablebillboardscloud.cpp | 10 ++++++++-- .../digitaluniverse/rendering/renderabledumeshes.cpp | 8 +++++++- src/engine/wrapper/sgctwindowwrapper.cpp | 6 ++++++ src/engine/wrapper/windowwrapper.cpp | 4 ++++ 6 files changed, 33 insertions(+), 3 deletions(-) diff --git a/include/openspace/engine/wrapper/sgctwindowwrapper.h b/include/openspace/engine/wrapper/sgctwindowwrapper.h index d76ec15a94..229c832baf 100644 --- a/include/openspace/engine/wrapper/sgctwindowwrapper.h +++ b/include/openspace/engine/wrapper/sgctwindowwrapper.h @@ -78,6 +78,7 @@ public: void sendMessageToExternalControl(const std::vector& message) const override; bool isSimpleRendering() const override; + bool isFisheyeRendering() const override; void takeScreenshot(bool applyWarping = false) const override; diff --git a/include/openspace/engine/wrapper/windowwrapper.h b/include/openspace/engine/wrapper/windowwrapper.h index 6bec15b1e0..ce8bdaf396 100644 --- a/include/openspace/engine/wrapper/windowwrapper.h +++ b/include/openspace/engine/wrapper/windowwrapper.h @@ -282,6 +282,13 @@ public: */ virtual bool isSimpleRendering() const; + /** + * Returns true if the rendering is being done using a Fisheye lens; + * false otherwise. On default, this method returns + * false + */ + virtual bool isFisheyeRendering() const; + /** * Advises the windowing system to take a screenshot. This method defaults to a no-op. */ diff --git a/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp index 871ebe6419..0e0c6af1c3 100644 --- a/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp +++ b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include @@ -465,7 +465,13 @@ namespace openspace { // DEBUG: _renderOption.addOption(0, "Camera View Direction"); _renderOption.addOption(1, "Camera Position Normal"); - _renderOption.set(1); + if (OsEng.windowWrapper().isFisheyeRendering()) { + _renderOption.set(1); + } + else { + _renderOption.set(0); + } + addProperty(_renderOption); if (dictionary.hasKey(keyUnit)) { diff --git a/modules/digitaluniverse/rendering/renderabledumeshes.cpp b/modules/digitaluniverse/rendering/renderabledumeshes.cpp index 1a07926055..cd696eb7c9 100644 --- a/modules/digitaluniverse/rendering/renderabledumeshes.cpp +++ b/modules/digitaluniverse/rendering/renderabledumeshes.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -285,7 +286,12 @@ RenderableDUMeshes::RenderableDUMeshes(const ghoul::Dictionary& dictionary) _renderOption.addOption(0, "Camera View Direction"); _renderOption.addOption(1, "Camera Position Normal"); - _renderOption.set(1); + if (OsEng.windowWrapper().isFisheyeRendering()) { + _renderOption.set(1); + } + else { + _renderOption.set(0); + } addProperty(_renderOption); if (dictionary.hasKey(keyUnit)) { diff --git a/src/engine/wrapper/sgctwindowwrapper.cpp b/src/engine/wrapper/sgctwindowwrapper.cpp index e85923bb70..a313d2d554 100644 --- a/src/engine/wrapper/sgctwindowwrapper.cpp +++ b/src/engine/wrapper/sgctwindowwrapper.cpp @@ -275,6 +275,12 @@ bool SGCTWindowWrapper::isSimpleRendering() const { sgct::Engine::NonLinearBuffer); } +bool SGCTWindowWrapper::isFisheyeRendering() const { + return dynamic_cast( + sgct::Engine::instance()->getCurrentWindowPtr()->getViewport(0)->getNonLinearProjectionPtr() + ); +} + void SGCTWindowWrapper::takeScreenshot(bool applyWarping) const { sgct::SGCTSettings::instance()->setCaptureFromBackBuffer(applyWarping); sgct::Engine::instance()->takeScreenshot(); diff --git a/src/engine/wrapper/windowwrapper.cpp b/src/engine/wrapper/windowwrapper.cpp index db77a37077..df420cb2c2 100644 --- a/src/engine/wrapper/windowwrapper.cpp +++ b/src/engine/wrapper/windowwrapper.cpp @@ -190,6 +190,10 @@ bool WindowWrapper::isSimpleRendering() const { return true; } +bool WindowWrapper::isFisheyeRendering() const { + return false; +} + void WindowWrapper::takeScreenshot(bool) const {} void WindowWrapper::swapBuffer() const {}