diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index 3ed2fe0d8f..4c82c4c650 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -104,6 +104,7 @@ public: void registerScreenSpaceRenderable(std::shared_ptr s); void unregisterScreenSpaceRenderable(std::shared_ptr s); + void unregisterScreenSpaceRenderable(std::string name); std::shared_ptr screenSpaceRenderable(std::string name); std::unique_ptr buildRenderProgram( @@ -179,6 +180,7 @@ private: std::vector _programs; std::vector> _screenSpaceRenderables; + std::vector> _deletedScreenSpaceRenderables; std::shared_ptr _fontInfo = nullptr; std::shared_ptr _fontDate = nullptr; diff --git a/include/openspace/rendering/screenspacerenderable.h b/include/openspace/rendering/screenspacerenderable.h index 5d538eea8c..828060689f 100644 --- a/include/openspace/rendering/screenspacerenderable.h +++ b/include/openspace/rendering/screenspacerenderable.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -88,6 +89,8 @@ protected: */ glm::vec2 toSpherical(glm::vec2 euclidean); void registerProperties(); + void unregisterProperties(); + void createShaders(); glm::mat4 scaleMatrix(); glm::mat4 rotationMatrix(); @@ -101,6 +104,7 @@ protected: properties::FloatProperty _depth; properties::FloatProperty _scale; properties::FloatProperty _alpha; + properties::TriggerProperty _delete; GLuint _quad; GLuint _vertexPositionBuffer; @@ -115,7 +119,8 @@ protected: const float _planeDepth = -2.0; glm::vec2 _originalViewportSize; - float _radius; + float _radius; + bool _toDelete; }; } // namespace openspace #endif // __SCREENSPACERENDERABLE_H__ \ No newline at end of file diff --git a/modules/base/rendering/screenspaceframebuffer.cpp b/modules/base/rendering/screenspaceframebuffer.cpp index 1d11e7fde0..92eff43179 100644 --- a/modules/base/rendering/screenspaceframebuffer.cpp +++ b/modules/base/rendering/screenspaceframebuffer.cpp @@ -43,7 +43,7 @@ ScreenSpaceFramebuffer::ScreenSpaceFramebuffer() glm::vec2 resolution = OsEng.windowWrapper().currentWindowResolution(); addProperty(_size); - OsEng.gui()._property.registerProperty(&_size); + OsEng.gui()._screenSpaceProperty.registerProperty(&_size); _size.set(glm::vec4(0, 0, resolution.x,resolution.y)); _scale.setValue(1.0f); @@ -62,6 +62,8 @@ bool ScreenSpaceFramebuffer::initialize(){ } bool ScreenSpaceFramebuffer::deinitialize(){ + unregisterProperties(); + glDeleteVertexArrays(1, &_quad); _quad = 0; @@ -114,7 +116,10 @@ void ScreenSpaceFramebuffer::render(){ } } -void ScreenSpaceFramebuffer::update(){} +void ScreenSpaceFramebuffer::update(){ + // if(_toDelete) + // OsEng.renderEngine().unregisterScreenSpaceRenderable(name()); +} bool ScreenSpaceFramebuffer::isReady() const{ bool ready = true; diff --git a/modules/base/rendering/screenspaceimage.cpp b/modules/base/rendering/screenspaceimage.cpp index 1002b5732b..0ffaf95e07 100644 --- a/modules/base/rendering/screenspaceimage.cpp +++ b/modules/base/rendering/screenspaceimage.cpp @@ -41,7 +41,7 @@ ScreenSpaceImage::ScreenSpaceImage(std::string texturePath) registerProperties(); addProperty(_texturePath); - OsEng.gui()._property.registerProperty(&_texturePath); + OsEng.gui()._screenSpaceProperty.registerProperty(&_texturePath); _texturePath.onChange([this](){ loadTexture(); }); } @@ -58,6 +58,8 @@ bool ScreenSpaceImage::initialize(){ } bool ScreenSpaceImage::deinitialize(){ + unregisterProperties(); + glDeleteVertexArrays(1, &_quad); _quad = 0; @@ -85,7 +87,10 @@ void ScreenSpaceImage::render(){ draw(modelTransform); } -void ScreenSpaceImage::update(){} +void ScreenSpaceImage::update(){ + // if(_toDelete) + // OsEng.renderEngine().unregisterScreenSpaceRenderable(name()); +} bool ScreenSpaceImage::isReady() const{ diff --git a/modules/iswa/rendering/cygnetplane.cpp b/modules/iswa/rendering/cygnetplane.cpp index 0360c6fcf9..de2f6d1505 100644 --- a/modules/iswa/rendering/cygnetplane.cpp +++ b/modules/iswa/rendering/cygnetplane.cpp @@ -81,6 +81,8 @@ bool CygnetPlane::isReady(){ void CygnetPlane::render(){} void CygnetPlane::update(){ + ISWACygnet::update(); + _time = Time::ref().currentTime(); _stateMatrix = SpiceManager::ref().positionTransformMatrix("GALACTIC", _frame, _time); diff --git a/modules/iswa/rendering/iswacontainer.cpp b/modules/iswa/rendering/iswacontainer.cpp index 82eee347bd..6310d64a40 100644 --- a/modules/iswa/rendering/iswacontainer.cpp +++ b/modules/iswa/rendering/iswacontainer.cpp @@ -76,7 +76,6 @@ void ISWAContainer::update(const UpdateData& data){ if(!_deletedCygnets.empty()) _deletedCygnets.clear(); - for(auto iSWACygnet : _iSWACygnets) iSWACygnet->update(); } diff --git a/modules/iswa/rendering/iswacontainer.h b/modules/iswa/rendering/iswacontainer.h index 2a1ba9a75d..f3d36461b0 100644 --- a/modules/iswa/rendering/iswacontainer.h +++ b/modules/iswa/rendering/iswacontainer.h @@ -52,6 +52,7 @@ public: private: std::vector> _iSWACygnets; std::vector> _deletedCygnets; + }; }//namespace openspace diff --git a/modules/iswa/rendering/iswacygnet.cpp b/modules/iswa/rendering/iswacygnet.cpp index 6ecd8e14e1..b041f586ed 100644 --- a/modules/iswa/rendering/iswacygnet.cpp +++ b/modules/iswa/rendering/iswacygnet.cpp @@ -39,6 +39,7 @@ ISWACygnet::ISWACygnet() ,_shader(nullptr) ,_texture(nullptr) ,_frame("GALACTIC") + ,_toDelete(false) { addProperty(_enabled); addProperty(_cygnetId); diff --git a/modules/iswa/rendering/iswacygnet.h b/modules/iswa/rendering/iswacygnet.h index 9a8b288005..4e12faa79b 100644 --- a/modules/iswa/rendering/iswacygnet.h +++ b/modules/iswa/rendering/iswacygnet.h @@ -84,6 +84,8 @@ protected: float _openSpaceUpdateInterval; + bool _toDelete; + int _id; }; diff --git a/modules/iswa/rendering/screenspacecygnet.cpp b/modules/iswa/rendering/screenspacecygnet.cpp index ab08b3f27e..78dfed7c2a 100644 --- a/modules/iswa/rendering/screenspacecygnet.cpp +++ b/modules/iswa/rendering/screenspacecygnet.cpp @@ -54,6 +54,7 @@ ScreenSpaceCygnet::ScreenSpaceCygnet(int cygnetId) OsEng.gui()._iSWAproperty.registerProperty(&_alpha); OsEng.gui()._iSWAproperty.registerProperty(&_cygnetId); OsEng.gui()._iSWAproperty.registerProperty(&_updateInterval); + OsEng.gui()._iSWAproperty.registerProperty(&_delete); _fileExtension = ""; _path = ""; @@ -83,6 +84,8 @@ bool ScreenSpaceCygnet::initialize(){ } bool ScreenSpaceCygnet::deinitialize(){ + OsEng.gui()._iSWAproperty.unregisterProperties(name()); + glDeleteVertexArrays(1, &_quad); _quad = 0; @@ -106,6 +109,7 @@ bool ScreenSpaceCygnet::deinitialize(){ void ScreenSpaceCygnet::render(){ if(!isReady()) return; + if(!_enabled) return; glm::mat4 rotation = rotationMatrix(); glm::mat4 translation = translationMatrix(); @@ -116,6 +120,8 @@ void ScreenSpaceCygnet::render(){ } void ScreenSpaceCygnet::update(){ + if(_toDelete) + OsEng.renderEngine().unregisterScreenSpaceRenderable(name()); if(_path != ""){ _time = Time::ref().currentTime(); diff --git a/modules/iswa/rendering/textureplane.cpp b/modules/iswa/rendering/textureplane.cpp index f0126b901a..3fd675eb3f 100644 --- a/modules/iswa/rendering/textureplane.cpp +++ b/modules/iswa/rendering/textureplane.cpp @@ -144,8 +144,6 @@ void TexturePlane::render(){ } void TexturePlane::update(){ - //if(_planeIsDirty) - // createPlane(); if(_path != ""){ CygnetPlane::update(); if(_futureTexture && _futureTexture->isFinished){ diff --git a/modules/onscreengui/include/gui.h b/modules/onscreengui/include/gui.h index 8e9b6a4403..aae796b60b 100644 --- a/modules/onscreengui/include/gui.h +++ b/modules/onscreengui/include/gui.h @@ -72,6 +72,7 @@ public: GuiPerformanceComponent _performance; GuiPropertyComponent _property; GuiPropertyComponent _iSWAproperty; + GuiPropertyComponent _screenSpaceProperty; GuiTimeComponent _time; bool _isEnabled; diff --git a/modules/onscreengui/src/gui.cpp b/modules/onscreengui/src/gui.cpp index 3a83c4f078..f97bae80fa 100644 --- a/modules/onscreengui/src/gui.cpp +++ b/modules/onscreengui/src/gui.cpp @@ -204,6 +204,7 @@ void GUI::initialize() { _property.initialize(); _iSWAproperty.initialize(); + _screenSpaceProperty.initialize(); _performance.initialize(); _help.initialize(); } @@ -251,6 +252,7 @@ void GUI::initializeGL() { _property.initializeGL(); _iSWAproperty.initializeGL(); + _screenSpaceProperty.initializeGL(); _performance.initializeGL(); _help.initializeGL(); } @@ -263,6 +265,7 @@ void GUI::deinitializeGL() { _property.deinitializeGL(); _iSWAproperty.deinitializeGL(); + _screenSpaceProperty.deinitializeGL(); _performance.deinitializeGL(); _help.deinitializeGL(); } @@ -293,6 +296,8 @@ void GUI::endFrame() { _property.render(); if (_iSWAproperty.isEnabled()) _iSWAproperty.render(); + if (_screenSpaceProperty.isEnabled()) + _screenSpaceProperty.render(); if (_performance.isEnabled()) _performance.render(); if (_help.isEnabled()) @@ -391,7 +396,8 @@ bool GUI::charCallback(unsigned int character, KeyModifier modifier) { void GUI::renderMainWindow() { ImGui::Begin("OpenSpace GUI", nullptr); - ImGui::Checkbox("Properties", &_property._isEnabled); + ImGui::Checkbox("Scene Graph Properties", &_property._isEnabled); + ImGui::Checkbox("ScreenSpace Properties", &_screenSpaceProperty._isEnabled); ImGui::Checkbox("iSWA Properties", &_iSWAproperty._isEnabled); ImGui::Checkbox("Performance", &_performance._isEnabled); _origin.render(); diff --git a/src/query/query.cpp b/src/query/query.cpp index 6c7b94c0ac..1fff927acd 100644 --- a/src/query/query.cpp +++ b/src/query/query.cpp @@ -72,15 +72,7 @@ properties::Property* property(const std::string& uri) { const std::string nameUri = uri.substr(0, nameSeparator); const std::string remainingUri = uri.substr(nameSeparator + 1); - SceneGraphNode* node = sceneGraphNode("iSWA"); - if(node){ - std::shared_ptr cygnet = static_cast (node->renderable())->iSWACygnet(nameUri); - if(cygnet){ - return cygnet->property(remainingUri); - } - } - - node = sceneGraphNode(nameUri); + SceneGraphNode* node = sceneGraphNode(nameUri); if (node) { properties::Property* property = node->property(remainingUri); return property; @@ -91,6 +83,11 @@ properties::Property* property(const std::string& uri) { properties::Property* property = ssr->property(remainingUri); return property; } + + std::shared_ptr cygnet = ISWAManager::ref().iSWACygnet(nameUri); + if(cygnet){ + return cygnet->property(remainingUri); + } LERROR("Node, iSWACygnet or ScreenSpaceRenderable' " << nameUri << "' did not exist"); return nullptr; diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 2630b80a8b..2e05c768b4 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -376,6 +376,9 @@ void RenderEngine::postSynchronizationPreDraw() { } } + if(!_deletedScreenSpaceRenderables.empty()) + _deletedScreenSpaceRenderables.clear(); + for (auto screenspacerenderable : _screenSpaceRenderables) { screenspacerenderable->update(); } @@ -1146,10 +1149,17 @@ void RenderEngine::unregisterScreenSpaceRenderable(std::shared_ptrdeinitialize(); + _deletedScreenSpaceRenderables.push_back(s); _screenSpaceRenderables.erase(it); } } +void RenderEngine::unregisterScreenSpaceRenderable(std::string name){ + auto s = screenSpaceRenderable(name); + if(s) + unregisterScreenSpaceRenderable(s); +} + std::shared_ptr RenderEngine::screenSpaceRenderable(std::string name){ for(auto s : _screenSpaceRenderables){ if(s->name() == name){ diff --git a/src/rendering/screenspacerenderable.cpp b/src/rendering/screenspacerenderable.cpp index 290938a554..658dad091f 100644 --- a/src/rendering/screenspacerenderable.cpp +++ b/src/rendering/screenspacerenderable.cpp @@ -33,6 +33,7 @@ ScreenSpaceRenderable::ScreenSpaceRenderable() , _depth("depth", "Depth", 0, 0, 1) , _scale("scale", "Scale" , 0.5, 0, 2) , _alpha("alpha", "Alpha" , 1, 0, 1) + ,_delete("delete", "Delete") , _quad(0) , _vertexPositionBuffer(0) ,_rendererPath("${SHADERS}/framebuffer/renderframebuffer.frag") @@ -40,6 +41,7 @@ ScreenSpaceRenderable::ScreenSpaceRenderable() ,_fragmentPath("${MODULE_BASE}/shaders/screnspace_fs.glsl") ,_texture(nullptr) ,_shader(nullptr) + ,_toDelete(false) { addProperty(_enabled); addProperty(_useFlatScreen); @@ -48,6 +50,7 @@ ScreenSpaceRenderable::ScreenSpaceRenderable() addProperty(_depth); addProperty(_scale); addProperty(_alpha); + addProperty(_delete); _rendererData = ghoul::Dictionary(); _rendererData.setValue("fragmentRendererPath", _rendererPath); @@ -70,11 +73,18 @@ ScreenSpaceRenderable::ScreenSpaceRenderable() _useFlatScreen.onChange([this](){ useEuclideanCoordinates(_useFlatScreen.value()); }); + + _delete.onChange([this](){OsEng.renderEngine().unregisterScreenSpaceRenderable(name());}); } ScreenSpaceRenderable::~ScreenSpaceRenderable(){} +//deinitialzie(){ + // unregisterProperies +// } + + bool ScreenSpaceRenderable::isEnabled() const { return _enabled; } @@ -129,13 +139,18 @@ glm::vec2 ScreenSpaceRenderable::toSpherical(glm::vec2 euclidean){ } void ScreenSpaceRenderable::registerProperties(){ - OsEng.gui()._property.registerProperty(&_enabled); - OsEng.gui()._property.registerProperty(&_useFlatScreen); - OsEng.gui()._property.registerProperty(&_euclideanPosition); - OsEng.gui()._property.registerProperty(&_sphericalPosition); - OsEng.gui()._property.registerProperty(&_depth); - OsEng.gui()._property.registerProperty(&_scale); - OsEng.gui()._property.registerProperty(&_alpha); + OsEng.gui()._screenSpaceProperty.registerProperty(&_enabled); + OsEng.gui()._screenSpaceProperty.registerProperty(&_useFlatScreen); + OsEng.gui()._screenSpaceProperty.registerProperty(&_euclideanPosition); + OsEng.gui()._screenSpaceProperty.registerProperty(&_sphericalPosition); + OsEng.gui()._screenSpaceProperty.registerProperty(&_depth); + OsEng.gui()._screenSpaceProperty.registerProperty(&_scale); + OsEng.gui()._screenSpaceProperty.registerProperty(&_alpha); + OsEng.gui()._screenSpaceProperty.registerProperty(&_delete); +} + +void ScreenSpaceRenderable::unregisterProperties(){ + OsEng.gui()._screenSpaceProperty.unregisterProperties(name()); } void ScreenSpaceRenderable::createShaders(){