multithreaded binning builder */
| 710 | |
| 711 | /* multithreaded binning builder */ |
| 712 | unique_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 | } |
nothing calls this directly
no test coverage detected