void Splitter<Heuristic>::split_spatial(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); PrimRef lprim, rprim; split.split(prim,lprim,rprim); if (lprim.id() != size_t(-1) && !lblock->insert(lprim)) { lheuristic.bin(lblock->base(),lblock->size()); lblock = lprims.insert(alloc->malloc(thread)); lblock->insert(lprim); } if (rprim.id() != size_t(-1) && !rblock->insert(rprim)) { rheuristic.bin(rblock->base(),rblock->size()); rblock = rprims.insert(alloc->malloc(thread)); rblock->insert(rprim); } } 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); }
void FallBackSplitter<Heuristic,PrimRefBlockList>::split(size_t threadIndex, PrimRefAlloc* alloc, const RTCGeometry* geom, PrimRefBlockList& prims, const PrimInfo& pinfo, PrimRefBlockList& lprims, PrimInfo& linfo, Split& lsplit, PrimRefBlockList& rprims, PrimInfo& rinfo, Split& rsplit) { /* enforce split */ size_t lnum = 0; BBox3f lgeomBounds = empty; BBox3f lcentBounds = empty; size_t rnum = 0; BBox3f rgeomBounds = empty; BBox3f rcentBounds = empty; atomic_set<PrimRefBlock>::item* lblock = lprims.insert(alloc->malloc(threadIndex)); atomic_set<PrimRefBlock>::item* rblock = rprims.insert(alloc->malloc(threadIndex)); while (atomic_set<PrimRefBlock>::item* block = prims.take()) { for (size_t i=0; i<block->size(); i++) { const PrimRef& prim = block->at(i); const BBox3f bounds = prim.bounds(); if ((lnum+rnum)&1) { lnum++; lgeomBounds.grow(bounds); lcentBounds.grow(center2(bounds)); if (likely(lblock->insert(prim))) continue; lblock = lprims.insert(alloc->malloc(threadIndex)); lblock->insert(prim); } else { rnum++; rgeomBounds.grow(bounds); rcentBounds.grow(center2(bounds)); if (likely(rblock->insert(prim))) continue; rblock = rprims.insert(alloc->malloc(threadIndex)); rblock->insert(prim); } } } new (&linfo) PrimInfo(lnum,lgeomBounds,lcentBounds); new (&rinfo) PrimInfo(rnum,rgeomBounds,rcentBounds); /* perform binning of left side */ Heuristic lheuristic(linfo,geom); typename PrimRefBlockList::iterator liter(lprims); while (typename PrimRefBlockList::item* block = liter.next()) { lheuristic.bin(block->base(),block->size()); } lheuristic.best(lsplit); /* perform binning of right side */ Heuristic rheuristic(rinfo,geom); typename PrimRefBlockList::iterator riter(rprims); while (typename PrimRefBlockList::item* block = riter.next()) { rheuristic.bin(block->base(),block->size()); } rheuristic.best(rsplit); }