bool BVH4BuilderFast::splitSequential(BuildRecord& current, BuildRecord& leftChild, BuildRecord& rightChild) { /* mark as leaf if leaf threshold reached */ if (current.items() <= QBVH_BUILDER_LEAF_ITEM_THRESHOLD) { current.createLeaf(); return false; } /* calculate binning function */ Mapping<16> mapping(current.bounds); /* binning of centroids */ Binner<16> binner; binner.bin(prims,current.begin,current.end,mapping); /* find best split */ Split split; binner.best(split,mapping); /* if we cannot find a valid split, enforce an arbitrary split */ if (unlikely(split.pos == -1)) split_fallback(prims,current,leftChild,rightChild); /* partitioning of items */ else binner.partition(prims, current.begin, current.end, split, mapping, leftChild, rightChild); if (leftChild.items() <= QBVH_BUILDER_LEAF_ITEM_THRESHOLD) leftChild.createLeaf(); if (rightChild.items() <= QBVH_BUILDER_LEAF_ITEM_THRESHOLD) rightChild.createLeaf(); return true; }
std::vector<int> count(Binner binner) { std::vector<int> out; int n = binner.size(); for(int i = 0; i < n; ++i) { int bin = binner.bin(i); if (bin < 0) continue; // Make sure there's enough space if (bin >= out.size()) { out.resize(bin + 1); } ++out[bin]; } return out; }