From 4bb88a4a757b2979ec5c5c1150b5f3ffa6d8b82b Mon Sep 17 00:00:00 2001 From: AnyOldName3 Date: Sat, 27 Aug 2022 01:03:19 +0000 Subject: [PATCH] Merge branch 'light_fix' into 'master' Fix incorrect scene lighting #6952 See merge request OpenMW/openmw!2335 (cherry picked from commit 1d177e2d71adcccc6565d97c4a4f27ef27d30b54) 1f2d9f22 don't recycle statesets for light cullcallback for now --- components/sceneutil/lightmanager.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/components/sceneutil/lightmanager.cpp b/components/sceneutil/lightmanager.cpp index 85c3b67c68..0129dcf26f 100644 --- a/components/sceneutil/lightmanager.cpp +++ b/components/sceneutil/lightmanager.cpp @@ -606,22 +606,22 @@ namespace SceneUtil if (!lightManager->getUBOManager()) return; - for (size_t i = 0; i < mStateSet.size(); ++i) + for (size_t i = 0; i < mUBBs.size(); ++i) { auto& buffer = lightManager->getUBOManager()->getLightBuffer(i); - osg::ref_ptr ubb = new osg::UniformBufferBinding(static_cast(Resource::SceneManager::UBOBinding::LightBuffer), buffer->getData(), 0, buffer->getData()->getTotalDataSize()); - mStateSet[i]->setAttributeAndModes(ubb, osg::StateAttribute::ON); + mUBBs[i] = new osg::UniformBufferBinding(static_cast(Resource::SceneManager::UBOBinding::LightBuffer), buffer->getData(), 0, buffer->getData()->getTotalDataSize()); } } void operator()(LightManager* node, osgUtil::CullVisitor* cv) { - const size_t frameId = cv->getTraversalNumber() % 2; - - auto& stateset = mStateSet[frameId]; + osg::ref_ptr stateset = new osg::StateSet; if (node->getLightingMethod() == LightingMethod::SingleUBO) { + const size_t frameId = cv->getTraversalNumber() % 2; + stateset->setAttributeAndModes(mUBBs[frameId], osg::StateAttribute::ON); + auto& buffer = node->getUBOManager()->getLightBuffer(cv->getTraversalNumber()); if (auto sun = node->getSunlight()) @@ -654,7 +654,7 @@ namespace SceneUtil node->getPPLightsBuffer()->updateCount(cv->getTraversalNumber()); } - std::array, 2> mStateSet = { new osg::StateSet, new osg::StateSet }; + std::array, 2> mUBBs; }; UBOManager::UBOManager(int lightCount)