mirror of
https://github.com/OpenMW/openmw.git
synced 2025-03-29 04:06:40 +00:00
Make shadow debug HUD thread-safe
* Double buffer the frustum uniforms. * Don't mess with the debug geometry's StateSet. * Change two-element vectors to arrays so the size is explicit.
This commit is contained in:
parent
5c37b5bc4b
commit
98b2d5d921
2 changed files with 14 additions and 11 deletions
|
@ -3104,12 +3104,12 @@ SceneUtil::MWShadowTechnique::DebugHUD::DebugHUD(int numberOfShadowMapsPerLight)
|
||||||
fragmentShader = new osg::Shader(osg::Shader::FRAGMENT, debugFrustumFragmentShaderSource);
|
fragmentShader = new osg::Shader(osg::Shader::FRAGMENT, debugFrustumFragmentShaderSource);
|
||||||
frustumProgram->addShader(fragmentShader);
|
frustumProgram->addShader(fragmentShader);
|
||||||
|
|
||||||
for (int i = 0; i < 2; ++i)
|
for (auto& frustumGeometry : mFrustumGeometries)
|
||||||
{
|
{
|
||||||
mFrustumGeometries.emplace_back(new osg::Geometry());
|
frustumGeometry = new osg::Geometry();
|
||||||
mFrustumGeometries[i]->setCullingActive(false);
|
frustumGeometry->setCullingActive(false);
|
||||||
|
|
||||||
mFrustumGeometries[i]->getOrCreateStateSet()->setAttributeAndModes(frustumProgram, osg::StateAttribute::ON);
|
frustumGeometry->getOrCreateStateSet()->setAttributeAndModes(frustumProgram, osg::StateAttribute::ON);
|
||||||
}
|
}
|
||||||
|
|
||||||
osg::ref_ptr<osg::DrawElementsUShort> frustumDrawElements = new osg::DrawElementsUShort(osg::PrimitiveSet::LINE_STRIP);
|
osg::ref_ptr<osg::DrawElementsUShort> frustumDrawElements = new osg::DrawElementsUShort(osg::PrimitiveSet::LINE_STRIP);
|
||||||
|
@ -3146,11 +3146,13 @@ void SceneUtil::MWShadowTechnique::DebugHUD::draw(osg::ref_ptr<osg::Texture2D> t
|
||||||
if (shadowMapNumber > mDebugCameras.size())
|
if (shadowMapNumber > mDebugCameras.size())
|
||||||
addAnotherShadowMap();
|
addAnotherShadowMap();
|
||||||
|
|
||||||
mFrustumUniforms[shadowMapNumber]->set(matrix);
|
osg::ref_ptr<osg::StateSet> stateSet = new osg::StateSet();
|
||||||
|
|
||||||
osg::ref_ptr<osg::StateSet> stateSet = mDebugGeometry[shadowMapNumber]->getOrCreateStateSet();
|
|
||||||
stateSet->setTextureAttributeAndModes(sDebugTextureUnit, texture, osg::StateAttribute::ON);
|
stateSet->setTextureAttributeAndModes(sDebugTextureUnit, texture, osg::StateAttribute::ON);
|
||||||
|
|
||||||
|
auto frustumUniform = mFrustumUniforms[cv.getTraversalNumber() % 2][shadowMapNumber];
|
||||||
|
frustumUniform->set(matrix);
|
||||||
|
stateSet->addUniform(frustumUniform);
|
||||||
|
|
||||||
// Some of these calls may be superfluous.
|
// Some of these calls may be superfluous.
|
||||||
unsigned int traversalMask = cv.getTraversalMask();
|
unsigned int traversalMask = cv.getTraversalMask();
|
||||||
cv.setTraversalMask(mDebugGeometry[shadowMapNumber]->getNodeMask());
|
cv.setTraversalMask(mDebugGeometry[shadowMapNumber]->getNodeMask());
|
||||||
|
@ -3205,6 +3207,6 @@ void SceneUtil::MWShadowTechnique::DebugHUD::addAnotherShadowMap()
|
||||||
mFrustumTransforms[shadowMapNumber]->setCullingActive(false);
|
mFrustumTransforms[shadowMapNumber]->setCullingActive(false);
|
||||||
mDebugCameras[shadowMapNumber]->addChild(mFrustumTransforms[shadowMapNumber]);
|
mDebugCameras[shadowMapNumber]->addChild(mFrustumTransforms[shadowMapNumber]);
|
||||||
|
|
||||||
mFrustumUniforms.push_back(new osg::Uniform(osg::Uniform::FLOAT_MAT4, "transform"));
|
for(auto& uniformVector : mFrustumUniforms)
|
||||||
mFrustumTransforms[shadowMapNumber]->getOrCreateStateSet()->addUniform(mFrustumUniforms[shadowMapNumber]);
|
uniformVector.push_back(new osg::Uniform(osg::Uniform::FLOAT_MAT4, "transform"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#ifndef COMPONENTS_SCENEUTIL_MWSHADOWTECHNIQUE_H
|
#ifndef COMPONENTS_SCENEUTIL_MWSHADOWTECHNIQUE_H
|
||||||
#define COMPONENTS_SCENEUTIL_MWSHADOWTECHNIQUE_H 1
|
#define COMPONENTS_SCENEUTIL_MWSHADOWTECHNIQUE_H 1
|
||||||
|
|
||||||
|
#include <array>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
#include <osg/Camera>
|
#include <osg/Camera>
|
||||||
|
@ -282,8 +283,8 @@ namespace SceneUtil {
|
||||||
osg::ref_ptr<osg::Program> mDebugProgram;
|
osg::ref_ptr<osg::Program> mDebugProgram;
|
||||||
std::vector<osg::ref_ptr<osg::Node>> mDebugGeometry;
|
std::vector<osg::ref_ptr<osg::Node>> mDebugGeometry;
|
||||||
std::vector<osg::ref_ptr<osg::Group>> mFrustumTransforms;
|
std::vector<osg::ref_ptr<osg::Group>> mFrustumTransforms;
|
||||||
std::vector<osg::ref_ptr<osg::Uniform>> mFrustumUniforms;
|
std::array<std::vector<osg::ref_ptr<osg::Uniform>>, 2> mFrustumUniforms;
|
||||||
std::vector<osg::ref_ptr<osg::Geometry>> mFrustumGeometries;
|
std::array<osg::ref_ptr<osg::Geometry>, 2> mFrustumGeometries;
|
||||||
};
|
};
|
||||||
|
|
||||||
osg::ref_ptr<DebugHUD> _debugHud;
|
osg::ref_ptr<DebugHUD> _debugHud;
|
||||||
|
|
Loading…
Reference in a new issue