diff --git a/modules/skybrowser/include/screenspaceskytarget.h b/modules/skybrowser/include/screenspaceskytarget.h index 33384b4760..2ab7eb3d2c 100644 --- a/modules/skybrowser/include/screenspaceskytarget.h +++ b/modules/skybrowser/include/screenspaceskytarget.h @@ -32,6 +32,7 @@ namespace openspace { void createShaders(); void setScreenSpaceTargetDimension(glm::vec2 currentBrowserDimension); + void updateFOV(float fov); glm::vec2 getScreenSpacePosition(); glm::vec2 getAnglePosition(); @@ -48,14 +49,14 @@ namespace openspace { void bindTexture() override; private: - + properties::Vec2Property _targetDimensions; - std::unique_ptr _texture; //glm::vec2 _browserDimension = glm::vec2(0); - UniformCache(modelTransform, viewProj, texture, borderWidth, targetRatio) _uniformCache; + UniformCache(modelTransform, viewProj, texture, fieldOfView, borderWidth, targetRatio) _uniformCache; GLuint _vertexArray = 0; GLuint _vertexBuffer = 0; + float _fieldOfView = 100.f; }; } diff --git a/modules/skybrowser/shaders/target_fs.glsl b/modules/skybrowser/shaders/target_fs.glsl index 7182c50aeb..7ab88be136 100644 --- a/modules/skybrowser/shaders/target_fs.glsl +++ b/modules/skybrowser/shaders/target_fs.glsl @@ -1,15 +1,32 @@ uniform sampler2D texture1; uniform float borderWidth; uniform vec2 targetRatio; +uniform float fieldOfView; in vec2 vs_st; in vec4 vs_position; +float box(in vec2 _st, in vec2 _size){ + _size = vec2(0.5) - _size*0.5; + vec2 uv = smoothstep(_size,_size, vs_st); + uv *= smoothstep(_size,_size,vec2(1.0)-vs_st); + return uv.x*uv.y; +} + +float cross(in vec2 _st, float _size){ + return box(vs_st, vec2(_size/.6, _size/3.)) + + box(vs_st, vec2(_size/5.,_size/.4)); +} + #include "fragment.glsl" Fragment getFragment() { Fragment frag; + + // draw cross + vec3 crosshair = vec3(cross(vs_st, 0.1)); + // draw square border vec2 bl = step(vec2(borderWidth),(1.0-vs_st)*targetRatio); // bottom-left line vec2 tr = step(vec2(borderWidth),vs_st*targetRatio); // top-right line @@ -17,10 +34,43 @@ Fragment getFragment() { frag.color = vec4(1,1,1,1); + if(fieldOfView < 10.f) { + frag.color = vec4(1,1,1,1); + if(crosshair == vec3(0.0)) { + frag.color.a = 0.0; + } + } + else { + if(border == vec3(1.0)) { + frag.color.a = 0.0; + + } + } + + return frag; +} + + + /* + if(crosshair == vec3(0.0) { + frag.color.a = 0.0; + } + */ + + + /* + // draw square border + vec2 bl = step(vec2(borderWidth),(1.0-vs_st)*targetRatio); // bottom-left line + vec2 tr = step(vec2(borderWidth),vs_st*targetRatio); // top-right line + vec3 border = vec3(tr.x * tr.y * bl.x * bl.y); + + frag.color = vec4(1,1,1,1); + if(border == vec3(1.0)) { frag.color.a = 0.0; } - - return frag; -} + + */ + + diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 872a3baf78..866bc96ab3 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -86,7 +86,7 @@ namespace openspace { SkyBrowserModule::SkyBrowserModule() : OpenSpaceModule(SkyBrowserModule::Name) , _showBrowserAndTarget(ShowSkyBrowserInfo) - , _zoomFactor(ZoomInfo, 50.f ,0.1f ,70.f) + , _fieldOfView(ZoomInfo, 50.f ,0.1f ,70.f) , _skyBrowser(nullptr) , _skyTarget(nullptr) , _camIsSyncedWWT(true) @@ -98,8 +98,19 @@ SkyBrowserModule::SkyBrowserModule() , mouseIsOnTarget(false) { + addProperty(_showBrowserAndTarget); - addProperty(_zoomFactor); + addProperty(_fieldOfView); + + _fieldOfView.onChange([&]() { + if (_skyTarget) { + _skyTarget->updateFOV(_fieldOfView); + float scaleWhenFovIs10 = static_cast(10.f / global::windowDelegate->getHorizFieldOfView()); + _skyTarget->setScale(std::max(static_cast(_fieldOfView / global::windowDelegate->getHorizFieldOfView()), scaleWhenFovIs10)); + } + }); + + _showBrowserAndTarget.onChange([&]() { if (_showBrowserAndTarget) { @@ -140,8 +151,8 @@ SkyBrowserModule::SkyBrowserModule() global::callback::mouseScrollWheel->emplace_back( [&](double, double scroll) -> bool { if (mouseIsOnBrowser) { - float zoom = scroll > 0.0 ? -log(_zoomFactor + 1.1f) : log(_zoomFactor + 1.1f); - _zoomFactor = std::clamp(_zoomFactor + zoom, 0.001f, 70.0f); + float zoom = scroll > 0.0 ? -log(_fieldOfView + 1.1f) : log(_fieldOfView + 1.1f); + _fieldOfView = std::clamp(_fieldOfView + zoom, 0.001f, 70.0f); return true; } @@ -264,15 +275,15 @@ scripting::LuaLibrary SkyBrowserModule::luaLibrary() const { return res; } -float SkyBrowserModule::zoomFactor() const{ - return _zoomFactor; +float SkyBrowserModule::fieldOfView() const{ + return _fieldOfView; } void SkyBrowserModule::internalInitialize(const ghoul::Dictionary& dict) { const Parameters p = codegen::bake(dict); _showBrowserAndTarget = p.show.value_or(_showBrowserAndTarget); - _zoomFactor = p.zoom.value_or(_zoomFactor); + _fieldOfView = p.zoom.value_or(_fieldOfView); // register ScreenSpaceBrowser auto fScreenSpaceRenderable = FactoryManager::ref().factory(); @@ -359,7 +370,7 @@ void SkyBrowserModule::WWTfollowCamera() { // Convert to celestial coordinates glm::dvec2 celestCoords = convertGalacticToCelestial(targetDirection); - ghoul::Dictionary message = createMessageForMovingWWTCamera(celestCoords, _zoomFactor); + ghoul::Dictionary message = createMessageForMovingWWTCamera(celestCoords, _fieldOfView); // Sleep so we don't bombard WWT with too many messages std::this_thread::sleep_for(std::chrono::milliseconds(50)); diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index e50554bf25..eb39fb2cf4 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -46,7 +46,7 @@ public: SkyBrowserModule(); virtual ~SkyBrowserModule() = default; - float zoomFactor() const; + float fieldOfView() const; glm::dvec2 convertGalacticToCelestial(glm::dvec3 coords) const; void WWTfollowCamera(); @@ -72,7 +72,7 @@ protected: void internalDeinitialize() override; properties::BoolProperty _showBrowserAndTarget; - properties::FloatProperty _zoomFactor; + properties::FloatProperty _fieldOfView; ScreenSpaceSkyBrowser* _skyBrowser; ScreenSpaceSkyTarget* _skyTarget; bool _camIsSyncedWWT; diff --git a/modules/skybrowser/src/screenspaceskytarget.cpp b/modules/skybrowser/src/screenspaceskytarget.cpp index ed07c4652f..d087914fc5 100644 --- a/modules/skybrowser/src/screenspaceskytarget.cpp +++ b/modules/skybrowser/src/screenspaceskytarget.cpp @@ -37,8 +37,8 @@ namespace { "Set the dimensions of the SkyTarget according to the SkyBrowser ratio " }; - constexpr const std::array UniformNames = { - "ModelTransform", "ViewProjectionMatrix", "texture1", "borderWidth", "targetRatio" + constexpr const std::array UniformNames = { + "ModelTransform", "ViewProjectionMatrix", "texture1", "fieldOfView", "borderWidth", "targetRatio" }; struct [[codegen::Dictionary(ScreenSpaceSkyTarget)]] Parameters { @@ -169,12 +169,13 @@ namespace openspace { glDisable(GL_CULL_FACE); glm::mat4 modelTransform = globalRotationMatrix() * translationMatrix() * localRotationMatrix() * scaleMatrix(); - float borderWidth = 0.005f / _scale.value(); + float borderWidth = 0.005f / (_scale.value() * 2.f); glm::vec2 targetRatio; - + float fov = _fieldOfView; _targetDimensions.value() == glm::vec2(0) ? targetRatio = glm::vec2(1) : targetRatio = _targetDimensions.value() / _targetDimensions.value().y; _shader->activate(); + _shader->setUniform(_uniformCache.fieldOfView, fov); _shader->setUniform(_uniformCache.borderWidth, borderWidth); _shader->setUniform(_uniformCache.targetRatio, targetRatio); _shader->setUniform(_uniformCache.modelTransform, modelTransform); @@ -236,7 +237,11 @@ namespace openspace { } void ScreenSpaceSkyTarget::setScreenSpaceTargetDimension(glm::vec2 currentBrowserDimension) { - _targetDimensions = currentBrowserDimension; // TA IN SOM EN PROP! + _targetDimensions = currentBrowserDimension; + } + + void ScreenSpaceSkyTarget::updateFOV(float fov) { + _fieldOfView = fov; }