Commit: 9ca7fb885e7f090fd29fa1c166ba089a9150ba6b Author: Jeffrey Liu Date: Thu Jun 16 05:53:22 2022 -0400 Branches: soc-2022-many-lights-sampling https://developer.blender.org/rB9ca7fb885e7f090fd29fa1c166ba089a9150ba6b
Cycles: fix logic to support multiple point lights in tree =================================================================== M intern/cycles/kernel/light/light_tree.h M intern/cycles/scene/light_tree.cpp M release/scripts/addons =================================================================== diff --git a/intern/cycles/kernel/light/light_tree.h b/intern/cycles/kernel/light/light_tree.h index cf3ffa18497..839653faa44 100644 --- a/intern/cycles/kernel/light/light_tree.h +++ b/intern/cycles/kernel/light/light_tree.h @@ -156,6 +156,9 @@ ccl_device bool light_tree_sample(KernelGlobals kg, /* Special case where there's only a single light. */ if (knode->num_prims == 1) { + if (UNLIKELY(light_select_reached_max_bounces(kg, -knode->child_index, bounce))) { + return false; + } return light_sample<in_volume_segment>( kg, -knode->child_index, randu, randv, P, path_flag, ls); } @@ -187,6 +190,9 @@ ccl_device bool light_tree_sample(KernelGlobals kg, if (tree_u < emitter_cdf) { *pdf_factor *= emitter_pdf; assert(*pdf_factor != 0.0f); + if (UNLIKELY(light_select_reached_max_bounces(kg, prim_index, bounce))) { + return false; + } return light_sample<in_volume_segment>(kg, prim_index, randu, randv, P, path_flag, ls); } } diff --git a/intern/cycles/scene/light_tree.cpp b/intern/cycles/scene/light_tree.cpp index ef5317f2bd1..35c3d11104e 100644 --- a/intern/cycles/scene/light_tree.cpp +++ b/intern/cycles/scene/light_tree.cpp @@ -177,14 +177,15 @@ LightTreeBuildNode *LightTree::recursive_build(vector<LightTreePrimitiveInfo> &p /* Var(X) = E[X^2] - E[X]^2 */ float energy_variance = (energy_squared_total / num_prims) - (energy_total / num_prims) * (energy_total / num_prims); - if (num_prims == 1) { + /* to-do: find a better way to handle when all centroids overlap. */ + if (num_prims == 1 || centroid_bounds.area() == 0.0f) { int first_prim_offset = ordered_prims.size(); /* to-do: reduce this? */ for (int i = start; i < end; i++) { int prim_num = primitive_info[i].prim_num; ordered_prims.push_back(prims_[prim_num]); } - node->init_leaf(start, num_prims, node_bbox, node_bcone, energy_total, energy_variance); + node->init_leaf(first_prim_offset, num_prims, node_bbox, node_bcone, energy_total, energy_variance); } else { /* Find the best place to split the primitives into 2 nodes. @@ -239,7 +240,7 @@ LightTreeBuildNode *LightTree::recursive_build(vector<LightTreePrimitiveInfo> &p int prim_num = primitive_info[i].prim_num; ordered_prims.push_back(prims_[prim_num]); } - node->init_leaf(start, num_prims, node_bbox, node_bcone, energy_total, energy_variance); + node->init_leaf(first_prim_offset, num_prims, node_bbox, node_bcone, energy_total, energy_variance); } } @@ -263,6 +264,11 @@ void LightTree::split_saoh(const BoundBox ¢roid_bbox, /* Check each dimension to find the minimum splitting cost. */ min_cost = FLT_MAX; for (int dim = 0; dim < 3; dim++) { + /* If the centroid bounding box is 0 along a given dimension, skip it. */ + if (centroid_bbox.size()[dim] == 0.0f) { + continue; + } + const float inv_extent = 1 / (centroid_bbox.size()[dim]); /* Fill in buckets with primitives. */ diff --git a/release/scripts/addons b/release/scripts/addons index c51e0bb1793..ebe0bd5677a 160000 --- a/release/scripts/addons +++ b/release/scripts/addons @@ -1 +1 @@ -Subproject commit c51e0bb1793c44c7a1b7435593dd5022cf7c8eec +Subproject commit ebe0bd5677af5810972feb212a027b2a30f1ee6a _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs