Refactor: flatten light tree in recursive function #107560

Merged
Brecht Van Lommel merged 6 commits from brecht/blender:recursive-light-tree-flatten into main 2023-05-05 16:33:06 +02:00
2 changed files with 7 additions and 15 deletions
Showing only changes of commit 0ab03682d4 - Show all commits

View File

@ -735,7 +735,7 @@ ccl_device float light_tree_pdf(
ccl_global const KernelLightTreeEmitter *kemitter = &kernel_data_fetch(light_tree_emitters,
target);
int root_index, target_leaf;
int root_index;
uint bit_trail, target_emitter;
if (is_triangle(kemitter)) {
@ -744,7 +744,6 @@ ccl_device float light_tree_pdf(
target_emitter = kernel_data_fetch(object_to_tree, object);
ccl_global const KernelLightTreeEmitter *kmesh = &kernel_data_fetch(light_tree_emitters,
target_emitter);
target_leaf = kmesh->parent_index;
root_index = kmesh->mesh.node_id;
ccl_global const KernelLightTreeNode *kroot = &kernel_data_fetch(light_tree_nodes, root_index);
bit_trail = kroot->bit_trail;
@ -755,8 +754,7 @@ ccl_device float light_tree_pdf(
}
else {
root_index = 0;
target_leaf = kemitter->parent_index;
bit_trail = kernel_data_fetch(light_tree_nodes, target_leaf).bit_trail;
bit_trail = kemitter->bit_trail;
target_emitter = target;
}
@ -768,18 +766,14 @@ ccl_device float light_tree_pdf(
const ccl_global KernelLightTreeNode *knode = &kernel_data_fetch(light_tree_nodes, node_index);
if (is_leaf(knode)) {
kernel_assert(node_index == target_leaf);
ccl_global const KernelLightTreeNode *kleaf = &kernel_data_fetch(light_tree_nodes,
target_leaf);
/* Iterate through leaf node to find the probability of sampling the target emitter. */
float target_max_importance = 0.0f;
float target_min_importance = 0.0f;
float total_max_importance = 0.0f;
float total_min_importance = 0.0f;
int num_has_importance = 0;
for (int i = 0; i < kleaf->num_emitters; i++) {
const int emitter = kleaf->leaf.first_emitter + i;
for (int i = 0; i < knode->num_emitters; i++) {
const int emitter = knode->leaf.first_emitter + i;
float max_importance, min_importance;
light_tree_emitter_importance<false>(
kg, P, N, 0, has_transmission, emitter, max_importance, min_importance);
@ -809,12 +803,10 @@ ccl_device float light_tree_pdf(
node_index = root_index;
root_index = 0;
target_emitter = target;
target_leaf = kemitter->parent_index;
bit_trail = kernel_data_fetch(light_tree_nodes, target_leaf).bit_trail;
bit_trail = kemitter->bit_trail;
continue;
}
else {
kernel_assert(node_index == target_leaf);
return pdf;
}
}

View File

@ -1441,8 +1441,8 @@ typedef struct KernelLightTreeEmitter {
MeshLight mesh_light;
/* Parent. */
int parent_index;
/* Bit trail from root node to leaf node containing emitter. */
int bit_trail;
} KernelLightTreeEmitter;
static_assert_align(KernelLightTreeEmitter, 16);