__forceinline BVH2Builder<Heuristic>::ParallelSplitTask::ParallelSplitTask(const TaskScheduler::ThreadInfo& thread, BVH2Builder* parent, BVH2::Base*& node, size_t depth, atomic_set<PrimRefBlock>& prims, const PrimInfo& pinfo, const Split& split) : parent(parent), dst(node), depth(depth), split(split) { /*! compute leaf and split cost */ const float leafSAH = parent->trity.intCost*pinfo.sah(); const float splitSAH = BVH2::travCost*halfArea(pinfo.geomBounds)+parent->trity.intCost*split.sah(); assert(atomic_set<PrimRefBlock>::block_iterator_unsafe(prims).size() == pinfo.size()); assert(leafSAH >= 0 && splitSAH >= 0); /*! create a leaf node when threshold reached or SAH tells us to stop */ if (pinfo.size() <= 1 || depth > BVH2::maxDepth || (pinfo.size() <= parent->bvh->maxLeafTris && leafSAH <= splitSAH)) { dst = parent->createLeaf(thread,prims,pinfo); delete this; return; } /*! start parallel splitting */ new (&splitter) MultiThreadedSplitterNormal(thread, &parent->alloc,parent->triangles,parent->vertices,prims,pinfo,split, (TaskScheduler::completeFunction)_createNode,this); }