MCPcopy Create free account
hub / github.com/blender/cycles / build_node

Method build_node

src/bvh/build.cpp:712–799  ·  view source on GitHub ↗

multithreaded binning builder */

Source from the content-addressed store, hash-verified

710
711/* multithreaded binning builder */
712unique_ptr<BVHNode> BVHBuild::build_node(const BVHObjectBinning &range, const int level)
713{
714 const size_t size = range.size();
715 const float leafSAH = params.sah_primitive_cost * range.leafSAH;
716 const float splitSAH = params.sah_node_cost * range.bounds().half_area() +
717 params.sah_primitive_cost * range.splitSAH;
718
719 /* Have at least one inner node on top level, for performance and correct
720 * visibility tests, since object instances do not check visibility flag.
721 */
722 if (!(range.size() > 0 && params.top_level && level == 0)) {
723 /* Make leaf node when threshold reached or SAH tells us. */
724 if ((params.small_enough_for_leaf(size, level)) ||
725 (range_within_max_leaf_size(range, references) && leafSAH < splitSAH))
726 {
727 return create_leaf_node(range, references);
728 }
729 }
730
731 BVHObjectBinning unaligned_range;
732 float unalignedSplitSAH = FLT_MAX;
733 float unalignedLeafSAH = FLT_MAX;
734 Transform aligned_space;
735 bool do_unalinged_split = false;
736 if (params.use_unaligned_nodes && splitSAH > params.unaligned_split_threshold * leafSAH) {
737 aligned_space = unaligned_heuristic.compute_aligned_space(range, references.data());
738 unaligned_range = BVHObjectBinning(
739 range, references.data(), &unaligned_heuristic, &aligned_space);
740 unalignedSplitSAH = params.sah_node_cost * unaligned_range.unaligned_bounds().half_area() +
741 params.sah_primitive_cost * unaligned_range.splitSAH;
742 unalignedLeafSAH = params.sah_primitive_cost * unaligned_range.leafSAH;
743 if (!(range.size() > 0 && params.top_level && level == 0)) {
744 if (unalignedLeafSAH < unalignedSplitSAH && unalignedSplitSAH < splitSAH &&
745 range_within_max_leaf_size(range, references))
746 {
747 return create_leaf_node(range, references);
748 }
749 }
750 /* Check whether unaligned split is better than the regular one. */
751 if (unalignedSplitSAH < splitSAH) {
752 do_unalinged_split = true;
753 }
754 }
755
756 /* Perform split. */
757 BVHObjectBinning left;
758 BVHObjectBinning right;
759 if (do_unalinged_split) {
760 unaligned_range.split(references.data(), left, right);
761 }
762 else {
763 range.split(references.data(), left, right);
764 }
765
766 BoundBox bounds;
767 if (do_unalinged_split) {
768 bounds = unaligned_heuristic.compute_aligned_boundbox(range, references.data(), aligned_space);
769 }

Callers

nothing calls this directly

Calls 13

BVHMixedSplitClass · 0.85
small_enough_for_leafMethod · 0.80
compute_aligned_spaceMethod · 0.80
pushMethod · 0.80
set_aligned_spaceMethod · 0.80
endMethod · 0.80
set_startMethod · 0.80
BVHObjectBinningClass · 0.70
sizeMethod · 0.45
dataMethod · 0.45
splitMethod · 0.45

Tested by

no test coverage detected