From 11c57978b69174eb87b6d8ec572a57696fd0bc73 Mon Sep 17 00:00:00 2001 From: Andrei Kortunov Date: Mon, 17 May 2021 13:01:15 +0400 Subject: [PATCH] Fix crashes on exit in the LightManager (bug #6044) --- components/sceneutil/lightmanager.cpp | 11 ++++++++++- components/sceneutil/lightmanager.hpp | 2 ++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/components/sceneutil/lightmanager.cpp b/components/sceneutil/lightmanager.cpp index e8cfad522..a69a64ba3 100644 --- a/components/sceneutil/lightmanager.cpp +++ b/components/sceneutil/lightmanager.cpp @@ -439,7 +439,11 @@ namespace SceneUtil void apply(osg::State &state) const override { - auto* lightUniform = mLightManager->getStateSet()->getUniform("LightBuffer"); + osg::StateSet* stateSet = mLightManager->getStateSet(); + if (!stateSet) + return; + + auto* lightUniform = stateSet->getUniform("LightBuffer"); for (size_t i = 0; i < mLights.size(); ++i) { auto light = mLights[i]; @@ -832,6 +836,11 @@ namespace SceneUtil return ""; } + LightManager::~LightManager() + { + getOrCreateStateSet()->removeAttribute(osg::StateAttribute::LIGHT); + } + LightManager::LightManager(bool ffp) : mStartLight(0) , mLightingMask(~0u) diff --git a/components/sceneutil/lightmanager.hpp b/components/sceneutil/lightmanager.hpp index dc7f36e96..6dbe7a3f7 100644 --- a/components/sceneutil/lightmanager.hpp +++ b/components/sceneutil/lightmanager.hpp @@ -137,6 +137,8 @@ namespace SceneUtil LightManager(const LightManager& copy, const osg::CopyOp& copyop); + ~LightManager(); + /// @param mask This mask is compared with the current Camera's cull mask to determine if lighting is desired. /// By default, it's ~0u i.e. always on. /// If you have some views that do not require lighting, then set the Camera's cull mask to not include