From 9580c617ef5c2c8d3244a9677987ae8d88a5fc2b Mon Sep 17 00:00:00 2001 From: Ester Lindgren Date: Fri, 12 Mar 2021 14:49:53 +0100 Subject: [PATCH 1/2] Add target square with shader --- .../skybrowser/include/screenspaceskytarget.h | 12 +++ modules/skybrowser/shaders/target_fs.glsl | 19 +++- modules/skybrowser/skybrowsermodule.cpp | 21 +---- modules/skybrowser/skybrowsermodule_lua.inl | 7 +- modules/skybrowser/square.png | Bin 0 -> 409 bytes .../skybrowser/src/screenspaceskytarget.cpp | 89 +++++++++++++++++- 6 files changed, 117 insertions(+), 31 deletions(-) create mode 100644 modules/skybrowser/square.png diff --git a/modules/skybrowser/include/screenspaceskytarget.h b/modules/skybrowser/include/screenspaceskytarget.h index 7a923e0838..0ea57db5fb 100644 --- a/modules/skybrowser/include/screenspaceskytarget.h +++ b/modules/skybrowser/include/screenspaceskytarget.h @@ -18,10 +18,22 @@ namespace openspace { ScreenSpaceSkyTarget(const ghoul::Dictionary& dictionary); virtual ~ScreenSpaceSkyTarget() = default; + // from SSR + bool initializeGL() override; + bool isReady() const override; + + void render() override; + void update() override; + + void createShaders(); + void bindTexture() override; private: std::unique_ptr _texture; + UniformCache(modelTransform, viewProj, texture, borderWidth, scale) _uniformCache; + GLuint _vertexArray = 0; + GLuint _vertexBuffer = 0; }; } diff --git a/modules/skybrowser/shaders/target_fs.glsl b/modules/skybrowser/shaders/target_fs.glsl index 260888d8f8..5b18ad2483 100644 --- a/modules/skybrowser/shaders/target_fs.glsl +++ b/modules/skybrowser/shaders/target_fs.glsl @@ -1,6 +1,6 @@ uniform sampler2D texture1; -uniform float OcclusionDepth; -uniform float Alpha; +uniform float Scale; +uniform float BorderWidth; in vec2 vs_st; in vec4 vs_position; @@ -10,8 +10,17 @@ in vec4 vs_position; Fragment getFragment() { Fragment frag; - vec3 color = vec3(1.0); - frag.color = vec4(color, 1.0); + vec2 bl = step(vec2(BorderWidth),1.0-vs_st); // bottom-left line + vec2 tr = step(vec2(BorderWidth),vs_st); // top-right line + vec3 border = vec3(tr.x * tr.y * bl.x * bl.y); + + frag.color = texture(texture1, vs_st); + + if(border == vec3(1.0)) { + + frag.color.a = 0.0; + } + return frag; -} \ No newline at end of file +} diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 475092d763..147c6e25df 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -94,8 +94,6 @@ SkyBrowserModule::SkyBrowserModule() addProperty(_testProperty); addProperty(_zoomFactor); - createTarget(); - global::callback::mousePosition->emplace_back( [&](double x, double y) { _mousePosition = glm::vec2(static_cast(x), static_cast(y)); @@ -291,6 +289,7 @@ ghoul::Dictionary SkyBrowserModule::createMessageForPausingWWTTime() const { void SkyBrowserModule::initializeBrowser(ScreenSpaceSkyBrowser* skyBrowser) { + createTarget(); _skyBrowser = skyBrowser; } @@ -317,38 +316,26 @@ glm::dvec2 SkyBrowserModule::convertGalacticToCelestial(glm::dvec3 rGal) const { return glm::dvec2(glm::degrees(ra), glm::degrees(dec)); } - -void SkyBrowserModule::checkIfTargetExist() { - ScreenSpaceSkyTarget* target = static_cast(global::renderEngine->screenSpaceRenderable("ScreenSpaceTarget")); - - if (target) { - LINFO("Target is not null!"); - - } - LINFO("Target has been checked!"); -} - void SkyBrowserModule::createTarget() { using namespace std::string_literals; - // Create target test std::string node = "{" "Type = 'ScreenSpaceSkyTarget'," "Identifier = 'ScreenSpaceTarget'," "Name = 'Screen Space Target'," - "FaceCamera = false" + "FaceCamera = false," + "Scale = 0.04," "}"; openspace::global::scriptEngine->queueScript( "openspace.addScreenSpaceRenderable(" + node + ")", scripting::ScriptEngine::RemoteScripting::Yes ); - + } - /* std::vector SkyBrowserModule::documentations() const { return { diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index fe1fe696b0..68690e1585 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -59,7 +59,6 @@ namespace openspace::skybrowser::luascriptfunctions { ScreenSpaceSkyBrowser* browser = dynamic_cast(global::renderEngine->screenSpaceRenderable("ScreenSpaceBowser")); module->initializeBrowser(browser); module->skyBrowser()->translate(glm::vec3(-0.8, -0.4, 0.0)); - module->checkIfTargetExist(); return 1; } @@ -89,11 +88,7 @@ namespace openspace::skybrowser::luascriptfunctions { openspace::global::scriptEngine->queueScript( "openspace.addScreenSpaceRenderable(" + node + ")", scripting::ScriptEngine::RemoteScripting::Yes - ); - - //test create target - module->createTarget(); - + ); return 1; } diff --git a/modules/skybrowser/square.png b/modules/skybrowser/square.png new file mode 100644 index 0000000000000000000000000000000000000000..79838c1580d5b058ada4b58bc3bffb209e8948cb GIT binary patch literal 409 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1SEZ8zRdwrjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4SJp~jv*CsZ!a1$GAQsI*w9#i{_#QQdCyih z%)2|+;=8#A^9HsA-UCt%rVQB(*BI6?MvPnm)6WbEY0Q76ANP3ygOkD2)z4*}Q$iB} DfoFKK literal 0 HcmV?d00001 diff --git a/modules/skybrowser/src/screenspaceskytarget.cpp b/modules/skybrowser/src/screenspaceskytarget.cpp index 436403091f..bf247225a8 100644 --- a/modules/skybrowser/src/screenspaceskytarget.cpp +++ b/modules/skybrowser/src/screenspaceskytarget.cpp @@ -13,7 +13,7 @@ #include #include - +#include #include #include #include @@ -23,11 +23,14 @@ #include #include +#include +#include + namespace { constexpr const char* _loggerCat = "ScreenSpaceSkyTarget"; - constexpr const std::array UniformNames = { - "Alpha", "ModelTransform", "ViewProjectionMatrix", "texture1" + constexpr const std::array UniformNames = { + "ModelTransform", "ViewProjectionMatrix", "texture1", "BorderWidth", "Scale" }; } //namespace @@ -52,5 +55,85 @@ namespace openspace { _texture->bind(); } } + + bool ScreenSpaceSkyTarget::isReady() const { + return _shader != nullptr; + } + + bool ScreenSpaceSkyTarget::initializeGL() { + + glGenVertexArrays(1, &_vertexArray); + glGenBuffers(1, &_vertexBuffer); + + std::unique_ptr texture = ghoul::io::TextureReader::ref().loadTexture(absPath("${MODULE_SKYBROWSER}/square.png")); + + + if (texture) { + // Images don't need to start on 4-byte boundaries, for example if the + // image is only RGB + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + texture->uploadTexture(); + texture->setFilter(ghoul::opengl::Texture::FilterMode::LinearMipMap); + texture->purgeFromRAM(); + + _texture = std::move(texture); + _objectSize = _texture->dimensions(); + } + + createShaders(); + + return isReady(); + } + + void ScreenSpaceSkyTarget::createShaders() { + + _shader = global::renderEngine->buildRenderProgram( + "ScreenSpaceProgram", + absPath("${MODULE_SKYBROWSER}/shaders/target_vs.glsl"), + absPath("${MODULE_SKYBROWSER}/shaders/target_fs.glsl") + ); + + ghoul::opengl::updateUniformLocations(*_shader, _uniformCache, UniformNames); + + } + + void ScreenSpaceSkyTarget::render() { + + glDisable(GL_CULL_FACE); + + glm::mat4 modelTransform = globalRotationMatrix() * translationMatrix() * localRotationMatrix() * scaleMatrix(); + float borderWidth = 0.002f; + + _shader->activate(); + + _shader->setUniform(_uniformCache.borderWidth, borderWidth); + _shader->setUniform(_uniformCache.modelTransform, modelTransform); + + _shader->setUniform( + _uniformCache.viewProj, + global::renderEngine->scene()->camera()->viewProjectionMatrix() + ); + + ghoul::opengl::TextureUnit unit; + unit.activate(); + bindTexture(); + _shader->setUniform(_uniformCache.texture, unit); + + glBindVertexArray(rendering::helper::vertexObjects.square.vao); + glDrawArrays(GL_TRIANGLES, 0, 6); + + glEnable(GL_CULL_FACE); + + _shader->deactivate(); + unbindTexture(); + } + + void ScreenSpaceSkyTarget::update() { + + + } + + } From 6ac4e594c5c0a1f144e36c1e0e6a758d434436b8 Mon Sep 17 00:00:00 2001 From: Ester Lindgren Date: Fri, 12 Mar 2021 14:53:08 +0100 Subject: [PATCH 2/2] Move createtarget function call --- modules/skybrowser/skybrowsermodule.h | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index cd20b4f7fd..90da2a298a 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -53,7 +53,6 @@ public: // target void createTarget(); - void checkIfTargetExist(); ghoul::Dictionary createMessageForMovingWWTCamera(const glm::dvec2 celestCoords, const float fov, const bool moveInstantly = true) const; ghoul::Dictionary createMessageForPausingWWTTime() const;