diff --git a/CHANGELOG.md b/CHANGELOG.md index ad4a1e1f4d..dc3722f394 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -96,6 +96,7 @@ Bug #7307: Alchemy "Magic Effect" search string does not match on tool tip for effects related to attributes Bug #7309: Sunlight scattering is visible in inappropriate situations Bug #7322: Shadows don't cover groundcover depending on the view angle and perspective with compute scene bounds = primitives + Bug #7353: Normal Map Crashes with Starwind Assets in TES3MP and OpenMW Bug #7354: Disabling post processing in-game causes a crash Bug #7364: Post processing is not reflected in savegame previews Bug #7380: NiZBufferProperty issue diff --git a/components/shader/shadervisitor.cpp b/components/shader/shadervisitor.cpp index 63ee6cb41f..d97276576f 100644 --- a/components/shader/shadervisitor.cpp +++ b/components/shader/shadervisitor.cpp @@ -889,12 +889,29 @@ namespace Shader if (mAllowedToModifyStateSets && (useShader || generateTangents)) { // make sure that all UV sets are there - for (std::map::const_iterator it = reqs.mTextures.begin(); it != reqs.mTextures.end(); - ++it) + // it's not safe to assume there's one for slot zero, so try and use one from another slot if possible + // if there are none at all, bail. + // the TangentSpaceGenerator would bail, but getTangentArray would give an empty array, which is enough to + // bypass null checks, but feeds the driver a bad pointer + if (sourceGeometry.getTexCoordArray(0) == nullptr) { - if (sourceGeometry.getTexCoordArray(it->first) == nullptr) + for (const auto& array : sourceGeometry.getTexCoordArrayList()) { - sourceGeometry.setTexCoordArray(it->first, sourceGeometry.getTexCoordArray(0)); + if (array) + { + sourceGeometry.setTexCoordArray(0, array); + break; + } + } + if (sourceGeometry.getTexCoordArray(0) == nullptr) + return changed; + } + + for (const auto& [unit, name] : reqs.mTextures) + { + if (sourceGeometry.getTexCoordArray(unit) == nullptr) + { + sourceGeometry.setTexCoordArray(unit, sourceGeometry.getTexCoordArray(0)); changed = true; } }