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) + { + for (const auto& array : sourceGeometry.getTexCoordArrayList()) + { + if (array) + { + sourceGeometry.setTexCoordArray(0, array); + break; + } + } + if (sourceGeometry.getTexCoordArray(0) == nullptr) + return changed; + } + + for (const auto& [unit, name] : reqs.mTextures) { - if (sourceGeometry.getTexCoordArray(it->first) == nullptr) + if (sourceGeometry.getTexCoordArray(unit) == nullptr) { - sourceGeometry.setTexCoordArray(it->first, sourceGeometry.getTexCoordArray(0)); + sourceGeometry.setTexCoordArray(unit, sourceGeometry.getTexCoordArray(0)); changed = true; } }