void Splitter<Heuristic>::split(const TaskScheduler::ThreadInfo& thread, PrimRefAlloc* alloc, const BuildTriangle* triangles, const Vec3fa* vertices, atomic_set<PrimRefBlock>& prims, const PrimInfo& pinfo, const Split& split) { Heuristic lheuristic(split.linfo,triangles,vertices); Heuristic rheuristic(split.rinfo,triangles,vertices); atomic_set<PrimRefBlock>::item* lblock = lprims.insert(alloc->malloc(thread)); atomic_set<PrimRefBlock>::item* rblock = rprims.insert(alloc->malloc(thread)); while (atomic_set<PrimRefBlock>::item* block = prims.take()) { for (size_t i=0; i<block->size(); i++) { const PrimRef& prim = block->at(i); if (split.left(prim)) { if (likely(lblock->insert(prim))) continue; lheuristic.bin(lblock->base(),lblock->size()); lblock = lprims.insert(alloc->malloc(thread)); lblock->insert(prim); } else { if (likely(rblock->insert(prim))) continue; rheuristic.bin(rblock->base(),rblock->size()); rblock = rprims.insert(alloc->malloc(thread)); rblock->insert(prim); } } alloc->free(thread,block); } lheuristic.bin(lblock->base(),lblock->size()); linfo = split.linfo; lheuristic.best(lsplit); rheuristic.bin(rblock->base(),rblock->size()); rinfo = split.rinfo; rheuristic.best(rsplit); }
void Splitter<Heuristic>::split(size_t thread, PrimRefAlloc* alloc, const RTCGeometry* geom, atomic_set<PrimRefBlock>& prims, const PrimInfo& pinfo, const Split& split) { Heuristic lheuristic(split.linfo,geom); Heuristic rheuristic(split.rinfo,geom); atomic_set<PrimRefBlock>::item* lblock = lprims.insert(alloc->malloc(thread)); atomic_set<PrimRefBlock>::item* rblock = rprims.insert(alloc->malloc(thread)); while (atomic_set<PrimRefBlock>::item* block = prims.take()) { for (size_t i=0; i<block->size(); i++) { const PrimRef& prim = block->at(i); if (split.left(prim)) { if (likely(lblock->insert(prim))) continue; lheuristic.bin(lblock->base(),lblock->size()); lblock = lprims.insert(alloc->malloc(thread)); lblock->insert(prim); } else { if (likely(rblock->insert(prim))) continue; rheuristic.bin(rblock->base(),rblock->size()); rblock = rprims.insert(alloc->malloc(thread)); rblock->insert(prim); } } alloc->free(thread,block); } lheuristic.bin(lblock->base(),lblock->size()); linfo = split.linfo; lheuristic.best(lsplit); rheuristic.bin(rblock->base(),rblock->size()); rinfo = split.rinfo; rheuristic.best(rsplit); }