From 56089b9dd90d303e7c14d34b7aa31c511e8ca2d3 Mon Sep 17 00:00:00 2001 From: James Turner <zakalawe@mac.com> Date: Tue, 11 Aug 2020 18:33:05 +0100 Subject: [PATCH] Fix clean up of the PUI event handler on reset --- src/Viewer/PUICamera.cxx | 14 +++++++++++++- src/Viewer/PUICamera.hxx | 6 ++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/Viewer/PUICamera.cxx b/src/Viewer/PUICamera.cxx index 323239c5b..4c6c5e09e 100644 --- a/src/Viewer/PUICamera.cxx +++ b/src/Viewer/PUICamera.cxx @@ -43,6 +43,7 @@ #include <Main/locale.hxx> #include <Viewer/CameraGroup.hxx> #include <Viewer/FGEventHandler.hxx> +#include <Viewer/renderer.hxx> #include <Input/input.hxx> #include <Input/FGMouseInput.hxx> @@ -270,6 +271,16 @@ PUICamera::PUICamera() : { } +PUICamera::~PUICamera() +{ + SG_LOG(SG_GL, SG_INFO, "Deleting PUI camera"); + + auto viewer = globals->get_renderer()->getViewer(); + if (viewer) { + viewer->removeEventHandler(_eventHandler); + } +} + void PUICamera::init(osg::Group* parent, osgViewer::Viewer* viewer) { setName("PUI FBO camera"); @@ -339,7 +350,8 @@ void PUICamera::init(osg::Group* parent, osgViewer::Viewer* viewer) // push_front so we keep the order of event handlers the opposite of // the rendering order (i.e top-most UI layer has the front-most event // handler) - viewer->getEventHandlers().push_front(new PUIEventHandler(this)); + _eventHandler = new PUIEventHandler(this); + viewer->getEventHandlers().push_front(_eventHandler); } // remove once we require OSG 3.4 diff --git a/src/Viewer/PUICamera.hxx b/src/Viewer/PUICamera.hxx index 5bfa34f79..6196ef82b 100644 --- a/src/Viewer/PUICamera.hxx +++ b/src/Viewer/PUICamera.hxx @@ -30,6 +30,10 @@ namespace osgViewer { class Viewer; } +namespace osgGA { +class GUIEventHandler; +} + namespace flightgear { @@ -39,6 +43,7 @@ public: static void initPUI(); PUICamera(); + virtual ~PUICamera(); osg::Object* cloneType() const override { return new PUICamera; } osg::Object* clone(const osg::CopyOp&) const override { return new PUICamera; } @@ -53,6 +58,7 @@ private: osg::Texture2D* _fboTexture = nullptr; osg::Geometry* _fullScreenQuad = nullptr; + osgGA::GUIEventHandler* _eventHandler = nullptr; static void puGetWindowSize(int *width, int *height); static int puGetWindow();