diff --git a/modules/skybrowser/CMakeLists.txt b/modules/skybrowser/CMakeLists.txt index cc22253a4d..ae29dbfdfc 100644 --- a/modules/skybrowser/CMakeLists.txt +++ b/modules/skybrowser/CMakeLists.txt @@ -28,6 +28,7 @@ set(HEADER_FILES skybrowsermodule.h include/screenspaceskybrowser.h + include/screenspaceskytarget.h ) source_group("Header Files" FILES ${HEADER_FILES}) @@ -37,6 +38,8 @@ set(SOURCE_FILES skybrowsermodule.cpp skybrowsermodule_lua.inl src/screenspaceskybrowser.cpp + src/screenspaceskytarget.cpp + ) source_group("Source Files" FILES ${SOURCE_FILES}) diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index 0e7e600d25..72cccd17b4 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -14,7 +14,6 @@ namespace openspace { void translate(glm::vec3 translation); private: - }; } diff --git a/modules/skybrowser/include/screenspaceskytarget.h b/modules/skybrowser/include/screenspaceskytarget.h new file mode 100644 index 0000000000..7a923e0838 --- /dev/null +++ b/modules/skybrowser/include/screenspaceskytarget.h @@ -0,0 +1,29 @@ +#ifndef __OPENSPACE_MODULE_SKYBROWSER___SCREENSPACESKYTARGET___H__ +#define __OPENSPACE_MODULE_SKYBROWSER___SCREENSPACESKYTARGET___H__ + +#include + +#include +#include + +#include + +namespace openspace::documentation { struct Documentation; } + +namespace openspace { + + class ScreenSpaceSkyTarget : public ScreenSpaceRenderable { + + public: + ScreenSpaceSkyTarget(const ghoul::Dictionary& dictionary); + virtual ~ScreenSpaceSkyTarget() = default; + + void bindTexture() override; + private: + std::unique_ptr _texture; + + }; +} + +#endif // __OPENSPACE_MODULE_SKYBROWSER___SCREENSPACESKYTARGET___H__ + diff --git a/modules/skybrowser/shaders/target_fs.glsl b/modules/skybrowser/shaders/target_fs.glsl new file mode 100644 index 0000000000..260888d8f8 --- /dev/null +++ b/modules/skybrowser/shaders/target_fs.glsl @@ -0,0 +1,17 @@ +uniform sampler2D texture1; +uniform float OcclusionDepth; +uniform float Alpha; + +in vec2 vs_st; +in vec4 vs_position; + +#include "fragment.glsl" + +Fragment getFragment() { + Fragment frag; + + vec3 color = vec3(1.0); + frag.color = vec4(color, 1.0); + + return frag; +} \ No newline at end of file diff --git a/modules/skybrowser/shaders/target_vs.glsl b/modules/skybrowser/shaders/target_vs.glsl new file mode 100644 index 0000000000..316cc5adb8 --- /dev/null +++ b/modules/skybrowser/shaders/target_vs.glsl @@ -0,0 +1,16 @@ +#version __CONTEXT__ + +uniform mat4 ModelTransform; +uniform mat4 ViewProjectionMatrix; + +layout(location = 0) in vec4 in_position; +layout(location = 1) in vec2 in_st; + +out vec2 vs_st; +out vec4 vs_position; + +void main(){ + vs_st = in_st; + vs_position = ViewProjectionMatrix * ModelTransform * in_position * vec4(1.0, -1.0, 1.0, 1.0); + gl_Position = vec4(vs_position); +} diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 642945b9f6..346ac28e6c 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -26,15 +26,12 @@ //#include //#include -#include #include #include -#include #include - #include #include #include @@ -45,6 +42,10 @@ #include #include "skybrowsermodule_lua.inl" +#include +#include +#include + #include // For atan2 #include // formatJson @@ -145,6 +146,11 @@ void SkyBrowserModule::internalInitialize(const ghoul::Dictionary& dict) { auto fScreenSpaceRenderable = FactoryManager::ref().factory(); ghoul_assert(fScreenSpaceRenderable, "ScreenSpaceRenderable factory was not created"); fScreenSpaceRenderable->registerClass("ScreenSpaceSkyBrowser"); + + // register ScreenSpaceTarget + ghoul_assert(fScreenSpaceRenderable, "ScreenSpaceRenderable factory was not created"); + fScreenSpaceRenderable->registerClass("ScreenSpaceSkyTarget"); + } bool SkyBrowserModule::sendMessageToWWT(const ghoul::Dictionary& msg) { @@ -160,7 +166,6 @@ bool SkyBrowserModule::sendMessageToWWT(const ghoul::Dictionary& msg) { } void SkyBrowserModule::WWTfollowCamera() { - showTarget(); while (true) { // Get camera view direction const glm::dvec3 viewDirection = global::navigationHandler->camera()->viewDirectionWorldSpace(); @@ -232,20 +237,37 @@ glm::dvec2 SkyBrowserModule::convertGalacticToCelestial(glm::dvec3 rGal) const { return glm::dvec2(glm::degrees(ra), glm::degrees(dec)); } -void SkyBrowserModule::showTarget() const { +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; - ghoul::Dictionary node; - node.setValue("Type", "ScreenSpaceImageLocal"s); - node.setValue("Identifier", "Target"s); - node.setValue("TexturePath", "D:/Ylvas/OpenSpace/modules/skybrowser/target.png"s); - node.setValue("Scale", 0.07); + + // Create target test + std::string node = "{" + "Type = 'ScreenSpaceSkyTarget'," + "Identifier = 'ScreenSpaceTarget'," + "Name = 'Screen Space Target'," + "FaceCamera = false" + "}"; + openspace::global::scriptEngine->queueScript( - "openspace.addScreenSpaceRenderable(" + ghoul::formatLua(node) + ")", + "openspace.addScreenSpaceRenderable(" + node + ")", scripting::ScriptEngine::RemoteScripting::Yes ); + } + + /* std::vector SkyBrowserModule::documentations() const { return { diff --git a/modules/skybrowser/skybrowsermodule.h b/modules/skybrowser/skybrowsermodule.h index 3f46cd8a59..1332bf63b4 100644 --- a/modules/skybrowser/skybrowsermodule.h +++ b/modules/skybrowser/skybrowsermodule.h @@ -36,6 +36,7 @@ namespace openspace { class ScreenSpaceSkyBrowser; +class ScreenSpaceSkyTarget; class SkyBrowserModule : public OpenSpaceModule { public: @@ -48,7 +49,10 @@ public: glm::dvec2 convertGalacticToCelestial(glm::dvec3 coords) const; void WWTfollowCamera(); - void showTarget() const; + + // target + void createTarget(); + void checkIfTargetExist(); ghoul::Dictionary createMessageForMovingWWTCamera(const glm::dvec2 celestCoords, const float fov, const bool moveInstantly = true) const; ghoul::Dictionary createMessageForPausingWWTTime() const; diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 07ac781831..240670d22b 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -61,14 +62,14 @@ namespace openspace::skybrowser::luascriptfunctions { module->initializeBrowser(browser); module->skyBrowser()->translate(glm::vec3(-0.8, -0.4, 0.0)); + module->checkIfTargetExist(); return 1; } int createBrowser(lua_State* L) { - ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::createBrowser"); - ghoul::lua::value(L, 1); + ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::createBrowser"); SkyBrowserModule* module = global::moduleEngine->module(); @@ -96,6 +97,9 @@ namespace openspace::skybrowser::luascriptfunctions { scripting::ScriptEngine::RemoteScripting::Yes ); + //test create target + module->createTarget(); + return 1; } diff --git a/modules/skybrowser/src/screenspaceskytarget.cpp b/modules/skybrowser/src/screenspaceskytarget.cpp new file mode 100644 index 0000000000..436403091f --- /dev/null +++ b/modules/skybrowser/src/screenspaceskytarget.cpp @@ -0,0 +1,56 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + constexpr const char* _loggerCat = "ScreenSpaceSkyTarget"; + + constexpr const std::array UniformNames = { + "Alpha", "ModelTransform", "ViewProjectionMatrix", "texture1" + }; + +} //namespace + +namespace openspace { + ScreenSpaceSkyTarget::ScreenSpaceSkyTarget(const ghoul::Dictionary& dictionary) + : ScreenSpaceRenderable(dictionary) + { + std::string identifier; + if (dictionary.hasValue(KeyIdentifier)) { + identifier = dictionary.value(KeyIdentifier); + } + else { + identifier = "ScreenSpaceSkyTarget"; + } + identifier = makeUniqueIdentifier(identifier); + setIdentifier(identifier); + } + + void ScreenSpaceSkyTarget::bindTexture() { + if (_texture) { + _texture->bind(); + } + } + +}