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 0000000000..79838c1580 Binary files /dev/null and b/modules/skybrowser/square.png differ 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() { + + + } + + }