From 558a4988502b98b014c95141492fe6276b578bd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Garc=C3=ADa=20Li=C3=B1=C3=A1n?= Date: Thu, 29 Apr 2021 12:18:50 +0200 Subject: [PATCH] Fix hotspots being shown for a single frame after startup FGRenderer::update() happens after the CameraGroup is updated, which causes the Compositor to use the previous frame cull mask. Setting the cull masks explicitly during FGRenderer::update() fixes the issue. --- src/Viewer/CameraGroup.cxx | 9 +++++++++ src/Viewer/CameraGroup.hxx | 3 +++ src/Viewer/renderer.cxx | 15 +++++++-------- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/Viewer/CameraGroup.cxx b/src/Viewer/CameraGroup.cxx index 7867b1ec7..35a3f2c52 100644 --- a/src/Viewer/CameraGroup.cxx +++ b/src/Viewer/CameraGroup.cxx @@ -816,6 +816,15 @@ CameraGroup* CameraGroup::buildCameraGroup(osgViewer::View* view, return cgroup; } +void CameraGroup::setCameraCullMasks(osg::Node::NodeMask nm) +{ + for (auto& info : _cameras) { + if (info->flags & CameraInfo::GUI) + continue; + info->compositor->setCullMask(nm); + } +} + void CameraGroup::resized() { for (const auto &info : _cameras) diff --git a/src/Viewer/CameraGroup.hxx b/src/Viewer/CameraGroup.hxx index 0490a0c08..60d4faeb1 100644 --- a/src/Viewer/CameraGroup.hxx +++ b/src/Viewer/CameraGroup.hxx @@ -176,6 +176,9 @@ public: * current viewport. */ void setCameraParameters(float vfov, float aspectRatio); + /** Set the cull mask on all non-GUI cameras + */ + void setCameraCullMasks(osg::Node::NodeMask nm); /** Update camera properties after a resize event. */ void resized(); diff --git a/src/Viewer/renderer.cxx b/src/Viewer/renderer.cxx index fd833edd3..697fccb84 100644 --- a/src/Viewer/renderer.cxx +++ b/src/Viewer/renderer.cxx @@ -854,15 +854,14 @@ FGRenderer::update( ) { l->get_sun_angle()*SGD_RADIANS_TO_DEGREES); _updateVisitor->setVisibility(actual_visibility); simgear::GroundLightManager::instance()->update(_updateVisitor.get()); - osg::Node::NodeMask cullMask = ~simgear::LIGHTS_BITS & ~simgear::PICK_BIT; - cullMask |= simgear::GroundLightManager::instance() - ->getLightNodeMask(_updateVisitor.get()); - if (_panel_hotspots->getBoolValue()) - cullMask |= simgear::PICK_BIT; - camera->setCullMask(cullMask); - camera->setCullMaskLeft(cullMask); - camera->setCullMaskRight(cullMask); } + + osg::Node::NodeMask cullMask = ~simgear::LIGHTS_BITS & ~simgear::PICK_BIT; + cullMask |= simgear::GroundLightManager::instance() + ->getLightNodeMask(_updateVisitor.get()); + if (_panel_hotspots->getBoolValue()) + cullMask |= simgear::PICK_BIT; + CameraGroup::getDefault()->setCameraCullMasks(cullMask); } void