Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey@blender.org>2021-11-02 13:05:29 +0300
committerSergey Sharybin <sergey@blender.org>2021-11-02 17:41:54 +0300
commit89c9fa8b737e07c84c1ff35919d211699592e6b5 (patch)
treebcdc296e03d2548b4a4ef5a26bf080b128dfac2c /intern/cycles/scene/geometry.cpp
parent698b05fc58f65ffe997fd18958c7d075277021d7 (diff)
Fix T92462: Cycles crash calculating hair transparency
Need to make sure images needed for hair shaders are loaded before running the shader. The naming is a bit misleading, but this is an internal API and we can change it easily. Submitting minimal patch needed to fix logic in the code to make it safer to review for 3.0. Differential Revision: https://developer.blender.org/D13067
Diffstat (limited to 'intern/cycles/scene/geometry.cpp')
-rw-r--r--intern/cycles/scene/geometry.cpp13
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) {