| 308 | } |
| 309 | |
| 310 | PrimInfoMB createPrimRefArrayMSMBlurGrid(Scene* scene, mvector<PrimRefMB>& prims, mvector<SubGridBuildData>& sgrids, BuildProgressMonitor& progressMonitor, BBox1f t0t1) |
| 311 | { |
| 312 | /* first run to get #primitives */ |
| 313 | ParallelForForPrefixSumState<PrimInfoMB> pstate; |
| 314 | Scene::Iterator<GridMesh,true> iter(scene); |
| 315 | |
| 316 | pstate.init(iter,size_t(1024)); |
| 317 | /* iterate over all meshes in the scene */ |
| 318 | PrimInfoMB pinfoMB = parallel_for_for_prefix_sum0( pstate, iter, PrimInfoMB(empty), [&](GridMesh* mesh, const range<size_t>& r, size_t k, size_t /*geomID*/) -> PrimInfoMB { |
| 319 | |
| 320 | PrimInfoMB pinfoMB(empty); |
| 321 | for (size_t j=r.begin(); j<r.end(); j++) |
| 322 | { |
| 323 | if (!mesh->valid(j, mesh->timeSegmentRange(t0t1))) continue; |
| 324 | LBBox3fa bounds(empty); |
| 325 | PrimInfoMB gridMB(0,mesh->getNumSubGrids(j)); |
| 326 | pinfoMB.merge(gridMB); |
| 327 | } |
| 328 | return pinfoMB; |
| 329 | }, [](const PrimInfoMB& a, const PrimInfoMB& b) -> PrimInfoMB { return PrimInfoMB::merge2(a,b); }); |
| 330 | |
| 331 | size_t numPrimitives = pinfoMB.size(); |
| 332 | if (numPrimitives == 0) return pinfoMB; |
| 333 | |
| 334 | /* resize arrays */ |
| 335 | sgrids.resize(numPrimitives); |
| 336 | prims.resize(numPrimitives); |
| 337 | /* second run to fill primrefs and SubGridBuildData arrays */ |
| 338 | pinfoMB = parallel_for_for_prefix_sum1( pstate, iter, PrimInfoMB(empty), [&](GridMesh* mesh, const range<size_t>& r, size_t k, size_t geomID, const PrimInfoMB& base) -> PrimInfoMB { |
| 339 | return mesh->createPrimRefMBArray(prims,sgrids,t0t1,r,base.size(),(unsigned)geomID); |
| 340 | }, [](const PrimInfoMB& a, const PrimInfoMB& b) -> PrimInfoMB { return PrimInfoMB::merge2(a,b); }); |
| 341 | |
| 342 | assert(pinfoMB.size() == numPrimitives); |
| 343 | pinfoMB.time_range = t0t1; |
| 344 | return pinfoMB; |
| 345 | } |
| 346 | |
| 347 | #endif |
| 348 |
no test coverage detected