From b17bb823594dddad99088db5621a3070c99eb132 Mon Sep 17 00:00:00 2001 From: Ester Lindgren Date: Fri, 19 Mar 2021 14:43:55 +0100 Subject: [PATCH] Change target to crosshair in relation to field of view --- .../skybrowser/include/screenspaceskytarget.h | 7 ++- modules/skybrowser/shaders/target_fs.glsl | 56 ++++++++++++++++++- modules/skybrowser/skybrowsermodule.cpp | 22 +++++--- modules/skybrowser/skybrowsermodule.h | 4 +- .../skybrowser/src/screenspaceskytarget.cpp | 13 +++-- 5 files changed, 82 insertions(+), 20 deletions(-) diff --git a/modules/skybrowser/include/screenspaceskytarget.h b/modules/skybrowser/include/screenspaceskytarget.h index fcb1e9d89c..5e5c48e1f4 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(); @@ -47,14 +48,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 dbae3abe82..ae987eca42 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -85,7 +85,7 @@ namespace openspace { SkyBrowserModule::SkyBrowserModule() : OpenSpaceModule(SkyBrowserModule::Name) , _testProperty(TestInfo) - , _zoomFactor(ZoomInfo, 50.f ,0.1f ,70.f) + , _fieldOfView(ZoomInfo, 50.f ,0.1f ,70.f) , _skyBrowser(nullptr) , _skyTarget(nullptr) , _camIsSyncedWWT(true) @@ -98,7 +98,13 @@ SkyBrowserModule::SkyBrowserModule() { addProperty(_testProperty); - addProperty(_zoomFactor); + + _fieldOfView.onChange([&]() { + if (_skyTarget) { + _skyTarget->updateFOV(_fieldOfView); + } + }); + addProperty(_fieldOfView); global::callback::mousePosition->emplace_back( [&](double x, double y) { @@ -124,8 +130,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; } @@ -248,15 +254,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); _testProperty = p.test.value_or(_testProperty); - _zoomFactor = p.zoom.value_or(_zoomFactor); + _fieldOfView = p.zoom.value_or(_fieldOfView); // register ScreenSpaceBrowser auto fScreenSpaceRenderable = FactoryManager::ref().factory(); @@ -343,7 +349,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 78b448e5bd..cc565e4536 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::StringProperty _testProperty; - 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 6c1f319960..0b0652db8d 100644 --- a/modules/skybrowser/src/screenspaceskytarget.cpp +++ b/modules/skybrowser/src/screenspaceskytarget.cpp @@ -38,8 +38,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 { @@ -168,10 +168,11 @@ namespace openspace { glm::mat4 modelTransform = globalRotationMatrix() * translationMatrix() * localRotationMatrix() * scaleMatrix(); float borderWidth = 0.005f / _scale.value(); 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); @@ -233,7 +234,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; }