Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/scene/light_tree.cpp
| Show First 20 Lines • Show All 291 Lines • ▼ Show 20 Lines | LightTree::LightTree(const vector<LightTreePrimitive> &prims, | ||||
| int total_nodes = 0; | int total_nodes = 0; | ||||
| vector<LightTreePrimitive> ordered_prims; | vector<LightTreePrimitive> ordered_prims; | ||||
| LightTreeBuildNode *root = recursive_build(0, prims.size(), total_nodes, ordered_prims, 0, 0); | LightTreeBuildNode *root = recursive_build(0, prims.size(), total_nodes, ordered_prims, 0, 0); | ||||
| prims_ = ordered_prims; | prims_ = ordered_prims; | ||||
| int offset = 0; | int offset = 0; | ||||
| nodes_.resize(total_nodes); | nodes_.resize(total_nodes); | ||||
| flatten_tree(root, offset, -1); | flatten_tree(root, offset); | ||||
| } | } | ||||
| const vector<LightTreePrimitive> &LightTree::get_prims() const | const vector<LightTreePrimitive> &LightTree::get_prims() const | ||||
| { | { | ||||
| return prims_; | return prims_; | ||||
| } | } | ||||
| const vector<PackedLightTreeNode> &LightTree::get_nodes() const | const vector<PackedLightTreeNode> &LightTree::get_nodes() const | ||||
| ▲ Show 20 Lines • Show All 181 Lines • ▼ Show 20 Lines | for (int split = 0; split < LightTreeBucketInfo::num_buckets - 1; split++) { | ||||
| min_dim = dim; | min_dim = dim; | ||||
| min_bucket = split; | min_bucket = split; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| return min_cost; | return min_cost; | ||||
| } | } | ||||
| int LightTree::flatten_tree(const LightTreeBuildNode *node, int &offset, int parent) | int LightTree::flatten_tree(const LightTreeBuildNode *node, int &offset) | ||||
| { | { | ||||
| PackedLightTreeNode *current_node = &nodes_[offset]; | PackedLightTreeNode *current_node = &nodes_[offset]; | ||||
| current_node->bbox = node->bbox; | current_node->bbox = node->bbox; | ||||
| current_node->bcone = node->bcone; | current_node->bcone = node->bcone; | ||||
| current_node->energy = node->energy; | current_node->energy = node->energy; | ||||
| current_node->bit_trail = node->bit_trail; | current_node->bit_trail = node->bit_trail; | ||||
| int current_index = offset; | int current_index = offset; | ||||
| offset++; | offset++; | ||||
| /* If current node contains lights, then it is a leaf node. | /* If current node contains lights, then it is a leaf node. | ||||
| * Otherwise, create interior node and children recursively. */ | * Otherwise, create interior node and children recursively. */ | ||||
| if (node->num_lights > 0) { | if (node->num_lights > 0) { | ||||
| current_node->first_prim_index = node->first_prim_index; | current_node->first_prim_index = node->first_prim_index; | ||||
| current_node->num_lights = node->num_lights; | current_node->num_lights = node->num_lights; | ||||
| current_node->is_leaf_node = true; | current_node->is_leaf_node = true; | ||||
| } | } | ||||
| else { | else { | ||||
| current_node->num_lights = 0; | current_node->num_lights = 0; | ||||
| current_node->is_leaf_node = false; | current_node->is_leaf_node = false; | ||||
| /* The first child is located directly to the right of the parent. */ | /* The first child is located directly to the right of the parent. */ | ||||
| flatten_tree(node->children[0], offset, current_index); | flatten_tree(node->children[0], offset); | ||||
| current_node->second_child_index = flatten_tree(node->children[1], offset, current_index); | current_node->second_child_index = flatten_tree(node->children[1], offset); | ||||
| } | } | ||||
| return current_index; | return current_index; | ||||
| } | } | ||||
| CCL_NAMESPACE_END | CCL_NAMESPACE_END | ||||