diff --git a/components/sceneutil/lightmanager.cpp b/components/sceneutil/lightmanager.cpp index 16af3880f..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]; @@ -726,7 +730,7 @@ namespace SceneUtil META_StateAttribute(NifOsg, LightManagerStateAttribute, osg::StateAttribute::LIGHT) - void initSharedLayout(osg::GLExtensions* ext, int handle, LightManager& lightManager) const + void initSharedLayout(osg::GLExtensions* ext, int handle) const { constexpr std::array index = { static_cast(Shader::UBOBinding::LightBuffer) }; int totalBlockSize = -1; @@ -748,17 +752,13 @@ namespace SceneUtil for (int i = 0; i < 2; ++i) { - auto& buf = lightManager.getLightBuffer(i); + auto& buf = mLightManager->getLightBuffer(i); buf = new LightBuffer(*buf, offsets[0], offsets[1], offsets[2], totalBlockSize, stride); } } void apply(osg::State& state) const override { - osg::ref_ptr lightManager; - if (!mLightManager.lock(lightManager)) - return; - if (!mInitLayout) { mDummyProgram->apply(state); @@ -771,12 +771,12 @@ namespace SceneUtil // wait until the UBO binding is created if (activeUniformBlocks > 0) { - initSharedLayout(ext, handle, *lightManager); + initSharedLayout(ext, handle); mInitLayout = true; } } - lightManager->getLightBuffer(state.getFrameStamp()->getFrameNumber())->uploadCachedSunPos(state.getInitialViewMatrix()); - lightManager->getLightBuffer(state.getFrameStamp()->getFrameNumber())->dirty(); + mLightManager->getLightBuffer(state.getFrameStamp()->getFrameNumber())->uploadCachedSunPos(state.getInitialViewMatrix()); + mLightManager->getLightBuffer(state.getFrameStamp()->getFrameNumber())->dirty(); } private: @@ -806,7 +806,7 @@ namespace SceneUtil return shader; } - osg::observer_ptr mLightManager; + LightManager* mLightManager; osg::ref_ptr mDummyProgram; mutable bool mInitLayout; }; @@ -836,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