Пример #1
0
 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);
 }
Пример #2
0
 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);
 }