[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 ¢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
More information about the Bf-blender-cvs
mailing list