From e25a5605910ee6c02e8c1f3c4ebc32aa8c681781 Mon Sep 17 00:00:00 2001 From: James Hogan Date: Mon, 2 Aug 2021 23:38:56 +0100 Subject: [PATCH] CameraGroup: Add compositor reload callbacks Add a compositor reload callback object to CameraInfo, with callbacks for just prior and after the CameraInfo's compositor is reloaded by reloadCompositors(). This will allow VR cameras to be reconfigured after a reload. --- src/Viewer/CameraGroup.cxx | 6 ++++++ src/Viewer/CameraGroup.hxx | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Viewer/CameraGroup.cxx b/src/Viewer/CameraGroup.cxx index a32ad3f15..e122b9c0e 100644 --- a/src/Viewer/CameraGroup.cxx +++ b/src/Viewer/CameraGroup.cxx @@ -982,6 +982,9 @@ void reloadCompositors(CameraGroup *cgroup) SGReaderWriterOptions::fromPath(globals->get_fg_root()); options->setPropertyNode(globals->get_props()); + if (info->reloadCompositorCallback.valid()) + info->reloadCompositorCallback->preReloadCompositor(cgroup, info); + // Force deletion info->compositor.reset(nullptr); // Then replace it with a new instance @@ -993,6 +996,9 @@ void reloadCompositors(CameraGroup *cgroup) viewport, compositor_path, options)); + + if (info->reloadCompositorCallback.valid()) + info->reloadCompositorCallback->postReloadCompositor(cgroup, info); } cgroup->_viewer->getViewerBase()->startThreading(); diff --git a/src/Viewer/CameraGroup.hxx b/src/Viewer/CameraGroup.hxx index 9ebcc570e..6e0bc58aa 100644 --- a/src/Viewer/CameraGroup.hxx +++ b/src/Viewer/CameraGroup.hxx @@ -51,6 +51,7 @@ namespace flightgear class CameraGroupListener; class GraphicsWindow; +class CameraGroup; /** A wrapper around osg::Camera that contains some extra information. */ @@ -76,7 +77,7 @@ struct CameraInfo : public osg::Referenced flags(flags_), physicalWidth(0), physicalHeight(0), bezelHeightTop(0), bezelHeightBottom(0), bezelWidthLeft(0), bezelWidthRight(0), - relativeCameraParent(0) { } + relativeCameraParent(0), reloadCompositorCallback(nullptr) { } /** The name as given in the config file. */ std::string name; @@ -120,6 +121,14 @@ struct CameraInfo : public osg::Referenced * Compositor path and should use the default one. */ std::string compositor_path; + + struct ReloadCompositorCallback : public virtual osg::Referenced + { + virtual void preReloadCompositor(CameraGroup *, CameraInfo *) = 0; + virtual void postReloadCompositor(CameraGroup *, CameraInfo *) = 0; + }; + osg::ref_ptr reloadCompositorCallback; + }; class CameraGroup : public osg::Referenced