diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index 68d0a8a194..851dcf84ca 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -29,6 +29,7 @@ #include #include + #include namespace ghoul { namespace fontrendering { @@ -144,6 +145,7 @@ public: int _node; } _onScreenInformation; + std::shared_ptr ssr; private: void setRenderer(std::unique_ptr renderer); RendererImplementation rendererFromString(const std::string& method); diff --git a/include/openspace/rendering/screenspacerenderable.h b/include/openspace/rendering/screenspacerenderable.h index de8b053723..e9d6c5fb48 100644 --- a/include/openspace/rendering/screenspacerenderable.h +++ b/include/openspace/rendering/screenspacerenderable.h @@ -44,6 +44,17 @@ public: virtual void update() = 0; virtual bool isReady() const = 0; bool isEnabled() const; + void x(float d){ + glm::vec3 pos = _position.value(); + pos.x += d; + _position.set(pos); + + }; + void y(float d){ + glm::vec3 pos = _position.value(); + pos.y += d; + _position.set(pos); + }; protected: void createPlane(); diff --git a/modules/base/rendering/screenspaceimage.cpp b/modules/base/rendering/screenspaceimage.cpp index 47c16e8ac8..41e5df160c 100644 --- a/modules/base/rendering/screenspaceimage.cpp +++ b/modules/base/rendering/screenspaceimage.cpp @@ -28,13 +28,14 @@ #include #include #include +#include namespace openspace { ScreenSpaceImage::ScreenSpaceImage(std::string texturePath) :ScreenSpaceRenderable(texturePath) { - - setName("ScreenSpaceImage" + std::to_string(id())); + _id = id(); + setName("ScreenSpaceImage" + std::to_string(_id)); OsEng.gui()._property.registerProperty(&_enabled); OsEng.gui()._property.registerProperty(&_flatScreen); OsEng.gui()._property.registerProperty(&_position); @@ -61,7 +62,13 @@ void ScreenSpaceImage::render(Camera* camera){ glm::vec3 position = _position.value(); float occlusionDepth = position.z; - position.z = _planeDepth; + if(!_isFlatScreen){ + occlusionDepth = position.x; + position.x = _planeDepth; + position = toEuclidean(position); + } else { + position.z = _planeDepth; + } glm::mat4 modelTransform = glm::translate(glm::mat4(1.f), position); modelTransform = glm::scale(modelTransform, glm::vec3(_scale.value()*scalingRatioY, _scale.value()*textureRatio*scalingRatioX, 1)); @@ -107,9 +114,35 @@ bool ScreenSpaceImage::deinitialize(){ return true; } void ScreenSpaceImage::update(){ - + + if(_flatScreen.value() != _isFlatScreen){ + _isFlatScreen = _flatScreen.value(); + glm::vec3 pos = _position.value(); + + if(!_isFlatScreen){ + _position.set(toPolar(pos)); + } else { + _position.set(toEuclidean(pos)); + } + + } } +glm::vec3 ScreenSpaceImage::toEuclidean(glm::vec3 polar){ + float x = polar[0]*cos(polar[1])*sin(polar[2]); + float y = polar[0]*sin(polar[1])*sin(polar[2]); + float z = polar[0]*cos(polar[2]); + return glm::vec3(x, y, z); +} + +glm::vec3 ScreenSpaceImage::toPolar(glm::vec3 euclidean){ + float r = sqrt(pow(euclidean[0], 2) + pow(euclidean[1], 2) + pow(euclidean[2], 2)); + float theta= atan2(euclidean[1],euclidean[0]); + float phi = acos(euclidean[2]/r); + return glm::vec3(r, theta, phi); +} + + bool ScreenSpaceImage::isReady() const{ bool ready = true; if (!_shader) diff --git a/modules/base/rendering/screenspaceimage.h b/modules/base/rendering/screenspaceimage.h index 8c0820f7af..25b675a294 100644 --- a/modules/base/rendering/screenspaceimage.h +++ b/modules/base/rendering/screenspaceimage.h @@ -41,11 +41,15 @@ public: bool isReady() const override; private: void loadTexture(); + glm::vec3 toEuclidean(glm::vec3 polar); + glm::vec3 toPolar(glm::vec3 euclidean); static int id(); std::unique_ptr _texture; // The image to render glm::vec2 _originalViewportSize; const float _planeDepth = -2.0; + bool _isFlatScreen = true; + int _id; }; // int ScreenSpaceImage::id = 0; } //namespace openspace diff --git a/src/interaction/mousecontroller.cpp b/src/interaction/mousecontroller.cpp index b646c9214d..ef26f6e6a0 100644 --- a/src/interaction/mousecontroller.cpp +++ b/src/interaction/mousecontroller.cpp @@ -26,7 +26,7 @@ #include #include - +#include #include namespace openspace { @@ -230,7 +230,19 @@ void OrbitalMouseController::update(const double& dt){ static_cast(_middleMouseButtonDown) * static_cast(dt) * _currentCursorDiff[MouseButtons::ButtonMiddle].x * interactionSpeed * (rollInvert ? -1.f : 1.f), static_cast(_rightMouseButtonDown) * static_cast(dt) * _currentCursorDiff[MouseButtons::ButtonRight].y * _navigationSpeed); //} - + if(_middleMouseButtonDown ){ + if(_leftMouseButtonDown ){ + OsEng.renderEngine().ssr->x(-static_cast(dt)); + } else if(_rightMouseButtonDown){ + OsEng.renderEngine().ssr->x(static_cast(dt)); + } + } else { + if(_leftMouseButtonDown ){ + OsEng.renderEngine().ssr->y(-static_cast(dt)); + } else if(_rightMouseButtonDown){ + OsEng.renderEngine().ssr->y(static_cast(dt)); + } + } // if (_leftMouseButtonDown){ // _handler->orbit(static_cast(dt)* _currentCursorDiff[MouseButtons::ButtonLeft].x * _rotationSpeed, static_cast(dt)* _currentCursorDiff[MouseButtons::ButtonLeft].y * _rotationSpeed, 0.f); // } diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 82a60e37bd..24285cdb90 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -205,8 +205,8 @@ bool RenderEngine::initialize() { #endif // GHOUL_USE_SOIL ghoul::io::TextureReader::ref().addReader(std::make_shared()); - - registerScreenSpaceRenderable(std::make_shared("${OPENSPACE_DATA}/test2.jpg")); + ssr = std::make_shared("${OPENSPACE_DATA}/test2.jpg"); + registerScreenSpaceRenderable(ssr); registerScreenSpaceRenderable(std::make_shared("${OPENSPACE_DATA}/test3.jpg")); return true; } @@ -367,6 +367,9 @@ void RenderEngine::postSynchronizationPreDraw() { } } + for (auto screenspacerenderable : _screenSpaceRenderables) { + screenspacerenderable->update(); + } //Allow focus node to update camera (enables camera-following) //FIX LATER: THIS CAUSES MASTER NODE TO BE ONE FRAME AHEAD OF SLAVES //if (const SceneGraphNode* node = OsEng.ref().interactionHandler().focusNode()){