bool BVH4BuilderFast::splitParallel(BuildRecord ¤t, BuildRecord &leftChild, BuildRecord &rightChild, const size_t threadID, const size_t numThreads) { const unsigned int items = current.end - current.begin; assert(items >= BUILD_RECORD_SPLIT_THRESHOLD); /* mark as leaf if leaf threshold reached */ if (items <= QBVH_BUILDER_LEAF_ITEM_THRESHOLD) { current.createLeaf(); return false; } /* use primitive array temporarily for parallel splits */ PrimRef* tmp = (PrimRef*) primAllocator.base(); /* parallel binning of centroids */ g_state->parallelBinner.bin(current,prims,tmp,threadID,numThreads); /* find best split */ Split split; g_state->parallelBinner.best(split); /* if we cannot find a valid split, enforce an arbitrary split */ if (unlikely(split.pos == -1)) split_fallback(prims,current,leftChild,rightChild); /* parallel partitioning of items */ else g_state->parallelBinner.partition(tmp,prims,split,leftChild,rightChild,threadID,numThreads); if (leftChild.items() <= QBVH_BUILDER_LEAF_ITEM_THRESHOLD) leftChild.createLeaf(); if (rightChild.items() <= QBVH_BUILDER_LEAF_ITEM_THRESHOLD) rightChild.createLeaf(); return true; }
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; }