Merge pull request #3093 from akortunov/light_crash

Fix crashes on exit in LightManager
libera
Bret Curtis 4 years ago committed by GitHub
commit 523edd0723
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -439,7 +439,11 @@ namespace SceneUtil
void apply(osg::State &state) const override 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) for (size_t i = 0; i < mLights.size(); ++i)
{ {
auto light = mLights[i]; auto light = mLights[i];
@ -726,7 +730,7 @@ namespace SceneUtil
META_StateAttribute(NifOsg, LightManagerStateAttribute, osg::StateAttribute::LIGHT) 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<unsigned int, 1> index = { static_cast<unsigned int>(Shader::UBOBinding::LightBuffer) }; constexpr std::array<unsigned int, 1> index = { static_cast<unsigned int>(Shader::UBOBinding::LightBuffer) };
int totalBlockSize = -1; int totalBlockSize = -1;
@ -748,17 +752,13 @@ namespace SceneUtil
for (int i = 0; i < 2; ++i) 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); buf = new LightBuffer(*buf, offsets[0], offsets[1], offsets[2], totalBlockSize, stride);
} }
} }
void apply(osg::State& state) const override void apply(osg::State& state) const override
{ {
osg::ref_ptr<LightManager> lightManager;
if (!mLightManager.lock(lightManager))
return;
if (!mInitLayout) if (!mInitLayout)
{ {
mDummyProgram->apply(state); mDummyProgram->apply(state);
@ -771,12 +771,12 @@ namespace SceneUtil
// wait until the UBO binding is created // wait until the UBO binding is created
if (activeUniformBlocks > 0) if (activeUniformBlocks > 0)
{ {
initSharedLayout(ext, handle, *lightManager); initSharedLayout(ext, handle);
mInitLayout = true; mInitLayout = true;
} }
} }
lightManager->getLightBuffer(state.getFrameStamp()->getFrameNumber())->uploadCachedSunPos(state.getInitialViewMatrix()); mLightManager->getLightBuffer(state.getFrameStamp()->getFrameNumber())->uploadCachedSunPos(state.getInitialViewMatrix());
lightManager->getLightBuffer(state.getFrameStamp()->getFrameNumber())->dirty(); mLightManager->getLightBuffer(state.getFrameStamp()->getFrameNumber())->dirty();
} }
private: private:
@ -806,7 +806,7 @@ namespace SceneUtil
return shader; return shader;
} }
osg::observer_ptr<LightManager> mLightManager; LightManager* mLightManager;
osg::ref_ptr<osg::Program> mDummyProgram; osg::ref_ptr<osg::Program> mDummyProgram;
mutable bool mInitLayout; mutable bool mInitLayout;
}; };
@ -836,6 +836,11 @@ namespace SceneUtil
return ""; return "";
} }
LightManager::~LightManager()
{
getOrCreateStateSet()->removeAttribute(osg::StateAttribute::LIGHT);
}
LightManager::LightManager(bool ffp) LightManager::LightManager(bool ffp)
: mStartLight(0) : mStartLight(0)
, mLightingMask(~0u) , mLightingMask(~0u)

@ -137,6 +137,8 @@ namespace SceneUtil
LightManager(const LightManager& copy, const osg::CopyOp& copyop); 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. /// @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. /// 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 /// If you have some views that do not require lighting, then set the Camera's cull mask to not include

Loading…
Cancel
Save