diff --git a/components/sceneutil/lightmanager.cpp b/components/sceneutil/lightmanager.cpp index b5c7af780..00c19dd40 100644 --- a/components/sceneutil/lightmanager.cpp +++ b/components/sceneutil/lightmanager.cpp @@ -731,7 +731,7 @@ namespace SceneUtil META_StateAttribute(NifOsg, LightManagerStateAttribute, osg::StateAttribute::LIGHT) - void initSharedLayout(osg::GLExtensions* ext, int handle) const + void initSharedLayout(osg::GLExtensions* ext, int handle, LightManager& lightManager) const { constexpr std::array index = { static_cast(Shader::UBOBinding::LightBuffer) }; int totalBlockSize = -1; @@ -753,13 +753,17 @@ namespace SceneUtil for (int i = 0; i < 2; ++i) { - auto& buf = mLightManager->getLightBuffer(i); + auto& buf = lightManager.getLightBuffer(i); buf->configureLayout(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); @@ -772,12 +776,12 @@ namespace SceneUtil // wait until the UBO binding is created if (activeUniformBlocks > 0) { - initSharedLayout(ext, handle); + initSharedLayout(ext, handle, *lightManager); mInitLayout = true; } } - mLightManager->getLightBuffer(state.getFrameStamp()->getFrameNumber())->uploadCachedSunPos(state.getInitialViewMatrix()); - mLightManager->getLightBuffer(state.getFrameStamp()->getFrameNumber())->dirty(); + lightManager->getLightBuffer(state.getFrameStamp()->getFrameNumber())->uploadCachedSunPos(state.getInitialViewMatrix()); + lightManager->getLightBuffer(state.getFrameStamp()->getFrameNumber())->dirty(); } private: @@ -807,7 +811,7 @@ namespace SceneUtil return shader; } - LightManager* mLightManager; + osg::observer_ptr mLightManager; osg::ref_ptr mDummyProgram; mutable bool mInitLayout; };