mirror of
https://github.com/OpenMW/openmw.git
synced 2025-01-21 06:53:53 +00:00
Merge branch 'fix_dangling_light_manager' into 'master'
Replace raw pointer by observer_ptr to avoid dangling pointer dereferencing (#6044) Closes #6044 See merge request OpenMW/openmw!865
This commit is contained in:
commit
a1b96cb9cc
1 changed files with 10 additions and 6 deletions
|
@ -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<unsigned int, 1> index = { static_cast<unsigned int>(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> 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<LightManager> mLightManager;
|
||||
osg::ref_ptr<osg::Program> mDummyProgram;
|
||||
mutable bool mInitLayout;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue