[Bf-blender-cvs] [9ca7fb885e7] soc-2022-many-lights-sampling: Cycles: fix logic to support multiple point lights in tree

Jeffrey Liu noreply at git.blender.org
Thu Jun 16 11:53:29 CEST 2022


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 &centroid_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



More information about the Bf-blender-cvs mailing list