mirror of
https://github.com/OpenMW/openmw.git
synced 2025-01-16 03:59:56 +00:00
Merge branch 'disable-shadows-properly-properly' into 'master'
Affect correct texture units when disabling shadows for stateset Closes #7838 See merge request OpenMW/openmw!3891
This commit is contained in:
commit
e4a9e83609
10 changed files with 54 additions and 50 deletions
|
@ -73,6 +73,7 @@
|
|||
Bug #7084: Resurrecting an actor doesn't take into account base record changes
|
||||
Bug #7088: Deleting last save game of last character doesn't clear character name/details
|
||||
Bug #7092: BSA archives from higher priority directories don't take priority
|
||||
Bug #7102: Some HQ Creatures mod models can hit the 8 texture slots limit with 0.48
|
||||
Bug #7103: Multiple paths pointing to the same plugin but with different cases lead to automatically removed config entries
|
||||
Bug #7122: Teleportation to underwater should cancel active water walking effect
|
||||
Bug #7131: MyGUI log spam when post processing HUD is open
|
||||
|
|
|
@ -718,67 +718,66 @@ if (WIN32)
|
|||
)
|
||||
|
||||
foreach(d ${WARNINGS_DISABLE})
|
||||
set(WARNINGS "${WARNINGS} /wd${d}")
|
||||
list(APPEND WARNINGS "/wd${d}")
|
||||
endforeach(d)
|
||||
|
||||
if(OPENMW_MSVC_WERROR)
|
||||
set(WARNINGS "${WARNINGS} /WX")
|
||||
list(APPEND WARNINGS "/WX")
|
||||
endif()
|
||||
|
||||
set_target_properties(components PROPERTIES COMPILE_FLAGS "${WARNINGS}")
|
||||
set_target_properties(osg-ffmpeg-videoplayer PROPERTIES COMPILE_FLAGS "${WARNINGS}")
|
||||
target_compile_options(components PRIVATE ${WARNINGS})
|
||||
target_compile_options(osg-ffmpeg-videoplayer PRIVATE ${WARNINGS})
|
||||
|
||||
if (MSVC_VERSION GREATER_EQUAL 1915 AND MSVC_VERSION LESS 1920)
|
||||
target_compile_definitions(components INTERFACE _ENABLE_EXTENDED_ALIGNED_STORAGE)
|
||||
endif()
|
||||
|
||||
if (BUILD_BSATOOL)
|
||||
set_target_properties(bsatool PROPERTIES COMPILE_FLAGS "${WARNINGS}")
|
||||
target_compile_options(bsatool PRIVATE ${WARNINGS})
|
||||
endif()
|
||||
|
||||
if (BUILD_ESMTOOL)
|
||||
set_target_properties(esmtool PROPERTIES COMPILE_FLAGS "${WARNINGS}")
|
||||
target_compile_options(esmtool PRIVATE ${WARNINGS})
|
||||
endif()
|
||||
|
||||
if (BUILD_ESSIMPORTER)
|
||||
set_target_properties(openmw-essimporter PROPERTIES COMPILE_FLAGS "${WARNINGS}")
|
||||
target_compile_options(openmw-essimporter PRIVATE ${WARNINGS})
|
||||
endif()
|
||||
|
||||
if (BUILD_LAUNCHER)
|
||||
set_target_properties(openmw-launcher PROPERTIES COMPILE_FLAGS "${WARNINGS}")
|
||||
target_compile_options(openmw-launcher PRIVATE ${WARNINGS})
|
||||
endif()
|
||||
|
||||
if (BUILD_MWINIIMPORTER)
|
||||
set_target_properties(openmw-iniimporter PROPERTIES COMPILE_FLAGS "${WARNINGS}")
|
||||
target_compile_options(openmw-iniimporter PRIVATE ${WARNINGS})
|
||||
endif()
|
||||
|
||||
if (BUILD_OPENCS)
|
||||
set_target_properties(openmw-cs PROPERTIES COMPILE_FLAGS "${WARNINGS}")
|
||||
target_compile_options(openmw-cs PRIVATE ${WARNINGS})
|
||||
endif()
|
||||
|
||||
if (BUILD_OPENMW)
|
||||
set_target_properties(openmw PROPERTIES COMPILE_FLAGS "${WARNINGS}")
|
||||
target_compile_options(openmw PRIVATE ${WARNINGS})
|
||||
endif()
|
||||
|
||||
if (BUILD_WIZARD)
|
||||
set_target_properties(openmw-wizard PROPERTIES COMPILE_FLAGS "${WARNINGS}")
|
||||
target_compile_options(openmw-wizard PRIVATE ${WARNINGS})
|
||||
endif()
|
||||
|
||||
if (BUILD_UNITTESTS)
|
||||
set_target_properties(openmw_test_suite PROPERTIES COMPILE_FLAGS "${WARNINGS}")
|
||||
target_compile_options(openmw_test_suite PRIVATE ${WARNINGS})
|
||||
endif()
|
||||
|
||||
if (BUILD_BENCHMARKS)
|
||||
set_target_properties(openmw_detournavigator_navmeshtilescache_benchmark PROPERTIES COMPILE_FLAGS "${WARNINGS}")
|
||||
target_compile_options(openmw_detournavigator_navmeshtilescache_benchmark PRIVATE ${WARNINGS})
|
||||
endif()
|
||||
|
||||
if (BUILD_NAVMESHTOOL)
|
||||
set_target_properties(openmw-navmeshtool PROPERTIES COMPILE_FLAGS "${WARNINGS}")
|
||||
target_compile_options(openmw-navmeshtool PRIVATE ${WARNINGS})
|
||||
endif()
|
||||
|
||||
if (BUILD_BULLETOBJECTTOOL)
|
||||
set(WARNINGS "${WARNINGS} ${MT_BUILD}")
|
||||
set_target_properties(openmw-bulletobjecttool PROPERTIES COMPILE_FLAGS "${WARNINGS}")
|
||||
target_compile_options(openmw-bulletobjecttool PRIVATE ${WARNINGS} ${MT_BUILD})
|
||||
endif()
|
||||
endif(MSVC)
|
||||
|
||||
|
|
|
@ -247,7 +247,7 @@ namespace MWRender
|
|||
defaultMat->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4f(0.f, 0.f, 0.f, 0.f));
|
||||
stateset->setAttribute(defaultMat);
|
||||
|
||||
SceneUtil::ShadowManager::disableShadowsForStateSet(Settings::shadows(), *stateset);
|
||||
SceneUtil::ShadowManager::instance().disableShadowsForStateSet(*stateset);
|
||||
|
||||
// assign large value to effectively turn off fog
|
||||
// shaders don't respect glDisable(GL_FOG)
|
||||
|
|
|
@ -763,7 +763,7 @@ namespace MWRender
|
|||
|
||||
lightSource->setStateSetModes(*stateset, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);
|
||||
|
||||
SceneUtil::ShadowManager::disableShadowsForStateSet(Settings::shadows(), *stateset);
|
||||
SceneUtil::ShadowManager::instance().disableShadowsForStateSet(*stateset);
|
||||
|
||||
// override sun for local map
|
||||
SceneUtil::configureStateSetSunOverride(static_cast<SceneUtil::LightManager*>(mSceneRoot), light, stateset);
|
||||
|
|
|
@ -220,7 +220,7 @@ namespace
|
|||
camera->setNodeMask(MWRender::Mask_RenderToTexture);
|
||||
camera->setCullMask(MWRender::Mask_Sky);
|
||||
camera->addChild(mEarlyRenderBinRoot);
|
||||
SceneUtil::ShadowManager::disableShadowsForStateSet(Settings::shadows(), *camera->getOrCreateStateSet());
|
||||
SceneUtil::ShadowManager::instance().disableShadowsForStateSet(*camera->getOrCreateStateSet());
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -274,7 +274,7 @@ namespace MWRender
|
|||
if (!mSceneManager->getForceShaders())
|
||||
skyroot->getOrCreateStateSet()->setAttributeAndModes(new osg::Program(),
|
||||
osg::StateAttribute::OVERRIDE | osg::StateAttribute::PROTECTED | osg::StateAttribute::ON);
|
||||
SceneUtil::ShadowManager::disableShadowsForStateSet(Settings::shadows(), *skyroot->getOrCreateStateSet());
|
||||
SceneUtil::ShadowManager::instance().disableShadowsForStateSet(*skyroot->getOrCreateStateSet());
|
||||
parentNode->addChild(skyroot);
|
||||
|
||||
mEarlyRenderBinRoot = new osg::Group;
|
||||
|
|
|
@ -276,8 +276,7 @@ namespace MWRender
|
|||
camera->setNodeMask(Mask_RenderToTexture);
|
||||
|
||||
if (Settings::water().mRefractionScale != 1) // TODO: to be removed with issue #5709
|
||||
SceneUtil::ShadowManager::disableShadowsForStateSet(
|
||||
Settings::shadows(), *camera->getOrCreateStateSet());
|
||||
SceneUtil::ShadowManager::instance().disableShadowsForStateSet(*camera->getOrCreateStateSet());
|
||||
}
|
||||
|
||||
void apply(osg::Camera* camera) override
|
||||
|
@ -353,7 +352,7 @@ namespace MWRender
|
|||
camera->addChild(mClipCullNode);
|
||||
camera->setNodeMask(Mask_RenderToTexture);
|
||||
|
||||
SceneUtil::ShadowManager::disableShadowsForStateSet(Settings::shadows(), *camera->getOrCreateStateSet());
|
||||
SceneUtil::ShadowManager::instance().disableShadowsForStateSet(*camera->getOrCreateStateSet());
|
||||
}
|
||||
|
||||
void apply(osg::Camera* camera) override
|
||||
|
|
|
@ -1025,7 +1025,6 @@ void MWShadowTechnique::cull(osgUtil::CullVisitor& cv)
|
|||
{
|
||||
dummyState->setTextureAttribute(i, _fallbackShadowMapTexture, osg::StateAttribute::ON);
|
||||
dummyState->addUniform(new osg::Uniform(("shadowTexture" + std::to_string(i - baseUnit)).c_str(), i));
|
||||
dummyState->addUniform(new osg::Uniform(("shadowTextureUnit" + std::to_string(i - baseUnit)).c_str(), i));
|
||||
}
|
||||
|
||||
cv.pushStateSet(dummyState);
|
||||
|
@ -1711,14 +1710,6 @@ void MWShadowTechnique::createShaders()
|
|||
for (auto& perFrameUniformList : _uniforms)
|
||||
perFrameUniformList.emplace_back(shadowTextureSampler.get());
|
||||
}
|
||||
|
||||
{
|
||||
std::stringstream sstr;
|
||||
sstr<<"shadowTextureUnit"<<sm_i;
|
||||
osg::ref_ptr<osg::Uniform> shadowTextureUnit = new osg::Uniform(sstr.str().c_str(),(int)(settings->getBaseShadowTextureUnit()+sm_i));
|
||||
for (auto& perFrameUniformList : _uniforms)
|
||||
perFrameUniformList.emplace_back(shadowTextureUnit.get());
|
||||
}
|
||||
}
|
||||
|
||||
switch(settings->getShaderHint())
|
||||
|
|
|
@ -13,6 +13,16 @@ namespace SceneUtil
|
|||
{
|
||||
using namespace osgShadow;
|
||||
|
||||
ShadowManager* ShadowManager::sInstance = nullptr;
|
||||
|
||||
const ShadowManager& ShadowManager::instance()
|
||||
{
|
||||
if (sInstance)
|
||||
return *sInstance;
|
||||
else
|
||||
throw std::logic_error("No ShadowManager exists yet");
|
||||
}
|
||||
|
||||
void ShadowManager::setupShadowSettings(
|
||||
const Settings::ShadowsCategory& settings, Shader::ShaderManager& shaderManager)
|
||||
{
|
||||
|
@ -75,15 +85,11 @@ namespace SceneUtil
|
|||
mShadowTechnique->disableDebugHUD();
|
||||
}
|
||||
|
||||
void ShadowManager::disableShadowsForStateSet(const Settings::ShadowsCategory& settings, osg::StateSet& stateset)
|
||||
void ShadowManager::disableShadowsForStateSet(osg::StateSet& stateset) const
|
||||
{
|
||||
if (!settings.mEnableShadows)
|
||||
if (!mEnableShadows)
|
||||
return;
|
||||
|
||||
const int numberOfShadowMapsPerLight = settings.mNumberOfShadowMaps;
|
||||
|
||||
int baseShadowTextureUnit = 8 - numberOfShadowMapsPerLight;
|
||||
|
||||
osg::ref_ptr<osg::Image> fakeShadowMapImage = new osg::Image();
|
||||
fakeShadowMapImage->allocateImage(1, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT);
|
||||
*(float*)fakeShadowMapImage->data() = std::numeric_limits<float>::infinity();
|
||||
|
@ -92,14 +98,14 @@ namespace SceneUtil
|
|||
fakeShadowMapTexture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
|
||||
fakeShadowMapTexture->setShadowComparison(true);
|
||||
fakeShadowMapTexture->setShadowCompareFunc(osg::Texture::ShadowCompareFunc::ALWAYS);
|
||||
for (int i = baseShadowTextureUnit; i < baseShadowTextureUnit + numberOfShadowMapsPerLight; ++i)
|
||||
for (unsigned int i = mShadowSettings->getBaseShadowTextureUnit();
|
||||
i < mShadowSettings->getBaseShadowTextureUnit() + mShadowSettings->getNumShadowMapsPerLight(); ++i)
|
||||
{
|
||||
stateset.setTextureAttributeAndModes(i, fakeShadowMapTexture,
|
||||
stateset.setTextureAttribute(i, fakeShadowMapTexture,
|
||||
osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE | osg::StateAttribute::PROTECTED);
|
||||
stateset.addUniform(
|
||||
new osg::Uniform(("shadowTexture" + std::to_string(i - baseShadowTextureUnit)).c_str(), i));
|
||||
stateset.addUniform(
|
||||
new osg::Uniform(("shadowTextureUnit" + std::to_string(i - baseShadowTextureUnit)).c_str(), i));
|
||||
stateset.addUniform(new osg::Uniform(
|
||||
("shadowTexture" + std::to_string(i - mShadowSettings->getBaseShadowTextureUnit())).c_str(),
|
||||
static_cast<int>(i)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -111,6 +117,9 @@ namespace SceneUtil
|
|||
, mOutdoorShadowCastingMask(outdoorShadowCastingMask)
|
||||
, mIndoorShadowCastingMask(indoorShadowCastingMask)
|
||||
{
|
||||
if (sInstance)
|
||||
throw std::logic_error("A ShadowManager already exists");
|
||||
|
||||
mShadowedScene->setShadowTechnique(mShadowTechnique);
|
||||
|
||||
if (Stereo::getStereo())
|
||||
|
@ -127,6 +136,8 @@ namespace SceneUtil
|
|||
mShadowTechnique->setWorldMask(worldMask);
|
||||
|
||||
enableOutdoorMode();
|
||||
|
||||
sInstance = this;
|
||||
}
|
||||
|
||||
ShadowManager::~ShadowManager()
|
||||
|
@ -135,7 +146,7 @@ namespace SceneUtil
|
|||
Stereo::Manager::instance().setShadowTechnique(nullptr);
|
||||
}
|
||||
|
||||
Shader::ShaderManager::DefineMap ShadowManager::getShadowDefines(const Settings::ShadowsCategory& settings)
|
||||
Shader::ShaderManager::DefineMap ShadowManager::getShadowDefines(const Settings::ShadowsCategory& settings) const
|
||||
{
|
||||
if (!mEnableShadows)
|
||||
return getShadowsDisabledDefines();
|
||||
|
|
|
@ -26,10 +26,10 @@ namespace SceneUtil
|
|||
class ShadowManager
|
||||
{
|
||||
public:
|
||||
static void disableShadowsForStateSet(const Settings::ShadowsCategory& settings, osg::StateSet& stateset);
|
||||
|
||||
static Shader::ShaderManager::DefineMap getShadowsDisabledDefines();
|
||||
|
||||
static const ShadowManager& instance();
|
||||
|
||||
explicit ShadowManager(osg::ref_ptr<osg::Group> sceneRoot, osg::ref_ptr<osg::Group> rootNode,
|
||||
unsigned int outdoorShadowCastingMask, unsigned int indoorShadowCastingMask, unsigned int worldMask,
|
||||
const Settings::ShadowsCategory& settings, Shader::ShaderManager& shaderManager);
|
||||
|
@ -37,13 +37,17 @@ namespace SceneUtil
|
|||
|
||||
void setupShadowSettings(const Settings::ShadowsCategory& settings, Shader::ShaderManager& shaderManager);
|
||||
|
||||
Shader::ShaderManager::DefineMap getShadowDefines(const Settings::ShadowsCategory& settings);
|
||||
void disableShadowsForStateSet(osg::StateSet& stateset) const;
|
||||
|
||||
Shader::ShaderManager::DefineMap getShadowDefines(const Settings::ShadowsCategory& settings) const;
|
||||
|
||||
void enableIndoorMode(const Settings::ShadowsCategory& settings);
|
||||
|
||||
void enableOutdoorMode();
|
||||
|
||||
protected:
|
||||
static ShadowManager* sInstance;
|
||||
|
||||
bool mEnableShadows;
|
||||
|
||||
osg::ref_ptr<osgShadow::ShadowedScene> mShadowedScene;
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
#if SHADOWS
|
||||
@foreach shadow_texture_unit_index @shadow_texture_unit_list
|
||||
uniform mat4 shadowSpaceMatrix@shadow_texture_unit_index;
|
||||
uniform int shadowTextureUnit@shadow_texture_unit_index;
|
||||
varying vec4 shadowSpaceCoords@shadow_texture_unit_index;
|
||||
|
||||
#if @perspectiveShadowMaps
|
||||
|
|
Loading…
Reference in a new issue