From 965cf6bd9a21d827fd77d27f78de779b1f12c3d2 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 22 Feb 2017 15:31:59 -0500 Subject: [PATCH] Fix crash that occurs if there is an error in the SGCT configuration file --- apps/OpenSpace/main.cpp | 2 ++ include/openspace/engine/openspaceengine.h | 1 + modules/onscreengui/src/gui.cpp | 12 +++++++++--- src/engine/openspaceengine.cpp | 9 ++++----- src/engine/wrapper/sgctwindowwrapper.cpp | 1 - src/rendering/renderengine.cpp | 2 +- 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/apps/OpenSpace/main.cpp b/apps/OpenSpace/main.cpp index 0ff4b1d46d..31bdcea3ad 100644 --- a/apps/OpenSpace/main.cpp +++ b/apps/OpenSpace/main.cpp @@ -198,6 +198,8 @@ int main_main(int argc, char** argv) { _sgctEngine->render(); LDEBUG("Ending rendering loop"); + OsEng.deinitialize(); + //clear function bindings to avoid crash after destroying the OpenSpace Engine sgct::MessageHandler::instance()->setLogToCallback(false); sgct::MessageHandler::instance()->setLogCallback(nullptr); diff --git a/include/openspace/engine/openspaceengine.h b/include/openspace/engine/openspaceengine.h index 1c7ac2db50..d515aa46cc 100644 --- a/include/openspace/engine/openspaceengine.h +++ b/include/openspace/engine/openspaceengine.h @@ -98,6 +98,7 @@ public: // SGCT callbacks bool initialize(); bool initializeGL(); + void deinitialize(); void preSynchronization(); void postSynchronizationPreDraw(); void render(const glm::mat4& projectionMatrix, const glm::mat4& viewMatrix); diff --git a/modules/onscreengui/src/gui.cpp b/modules/onscreengui/src/gui.cpp index 6fa3417705..fa34ff997f 100644 --- a/modules/onscreengui/src/gui.cpp +++ b/modules/onscreengui/src/gui.cpp @@ -408,9 +408,15 @@ void GUI::deinitializeGL() { _program = nullptr; _fontTexture = nullptr; - glDeleteVertexArrays(1, &vao); - glDeleteBuffers(1, &vbo); - glDeleteBuffers(1, &vboElements); + if (vao) { + glDeleteVertexArrays(1, &vao); + } + if (vbo) { + glDeleteBuffers(1, &vbo); + } + if (vboElements) { + glDeleteBuffers(1, &vboElements); + } _iswa.deinitializeGL(); _help.deinitializeGL(); diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index 65db037815..f0f16e7ccf 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -175,11 +175,6 @@ OpenSpaceEngine::OpenSpaceEngine(std::string programName, } OpenSpaceEngine::~OpenSpaceEngine() { - LINFO("_windowWrapper->isUsingSwapGroups(): " << _windowWrapper->isUsingSwapGroups()); - LINFO("_windowWrapper->isSwapGroupMaster(): " << _windowWrapper->isSwapGroupMaster()); - _interactionHandler->deinitialize(); - _renderEngine->deinitialize(); - _globalPropertyNamespace = nullptr; _windowWrapper = nullptr; _parallelConnection = nullptr; @@ -529,6 +524,10 @@ bool OpenSpaceEngine::initialize() { return true; } +void OpenSpaceEngine::deinitialize() { + _interactionHandler->deinitialize(); + _renderEngine->deinitialize(); +} void OpenSpaceEngine::writeDocumentation() { // If a LuaDocumentationFile was specified, generate it now diff --git a/src/engine/wrapper/sgctwindowwrapper.cpp b/src/engine/wrapper/sgctwindowwrapper.cpp index c1edb1d17a..0693645023 100644 --- a/src/engine/wrapper/sgctwindowwrapper.cpp +++ b/src/engine/wrapper/sgctwindowwrapper.cpp @@ -170,7 +170,6 @@ bool SGCTWindowWrapper::isSwapGroupMaster() const { bool SGCTWindowWrapper::isUsingSwapGroups() const { return sgct::Engine::instance()->getCurrentWindowPtr()->isUsingSwapGroups(); } - glm::mat4 SGCTWindowWrapper::viewProjectionMatrix() const { return sgct::Engine::instance()->getCurrentModelViewProjectionMatrix(); diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index deb3e0a974..15cb24dec2 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -114,6 +114,7 @@ const std::vector RenderEngine::FrametimeTypes({ RenderEngine::RenderEngine() : _mainCamera(nullptr) + , _raycasterManager(nullptr) , _performanceMeasurements("performanceMeasurements", "Performance Measurements") , _frametimeType( "frametimeType", @@ -172,7 +173,6 @@ RenderEngine::~RenderEngine() { delete _mainCamera; delete _raycasterManager; - } bool RenderEngine::deinitialize() {