diff options
author | Sergey Sharybin <sergey@blender.org> | 2021-11-02 17:42:09 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey@blender.org> | 2021-11-02 17:42:09 +0300 |
commit | c01b3c534be3024185f0f611d13db01e487e9c16 (patch) | |
tree | 1a4ac7c4f80188c92b709688b0c2dec868c30978 /intern | |
parent | 1b2342b4d3641a5b438cba86a9378be944cec103 (diff) | |
parent | 89c9fa8b737e07c84c1ff35919d211699592e6b5 (diff) |
Merge branch 'blender-v3.0-release'
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/scene/geometry.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/intern/cycles/scene/geometry.cpp b/intern/cycles/scene/geometry.cpp index 5141e1f8358..8a3fc522d22 100644 --- a/intern/cycles/scene/geometry.cpp +++ b/intern/cycles/scene/geometry.cpp @@ -1588,9 +1588,20 @@ void GeometryManager::device_update_displacement_images(Device *device, set<int> bump_images; foreach (Geometry *geom, scene->geometry) { if (geom->is_modified()) { + /* Geometry-level check for hair shadow transparency. + * This matches the logic in the `Hair::update_shadow_transparency()`, avoiding access to + * possible non-loaded images. */ + bool need_shadow_transparency = false; + if (geom->geometry_type == Geometry::HAIR) { + Hair *hair = static_cast<Hair *>(geom); + need_shadow_transparency = hair->need_shadow_transparency(); + } + foreach (Node *node, geom->get_used_shaders()) { Shader *shader = static_cast<Shader *>(node); - if (!shader->has_displacement || shader->get_displacement_method() == DISPLACE_BUMP) { + const bool is_true_displacement = (shader->has_displacement && + shader->get_displacement_method() != DISPLACE_BUMP); + if (!is_true_displacement && !need_shadow_transparency) { continue; } foreach (ShaderNode *node, shader->graph->nodes) { |