| 235 | |
| 236 | #if defined(EMBREE_GEOMETRY_GRID) |
| 237 | PrimInfo createPrimRefArrayGrids(Scene* scene, mvector<PrimRef>& prims, mvector<SubGridBuildData>& sgrids) |
| 238 | { |
| 239 | PrimInfo pinfo(empty); |
| 240 | size_t numPrimitives = 0; |
| 241 | |
| 242 | /* first run to get #primitives */ |
| 243 | |
| 244 | ParallelForForPrefixSumState<PrimInfo> pstate; |
| 245 | Scene::Iterator<GridMesh,false> iter(scene); |
| 246 | |
| 247 | pstate.init(iter,size_t(1024)); |
| 248 | |
| 249 | /* iterate over all meshes in the scene */ |
| 250 | pinfo = parallel_for_for_prefix_sum0( pstate, iter, PrimInfo(empty), [&](GridMesh* mesh, const range<size_t>& r, size_t k, size_t geomID) -> PrimInfo { |
| 251 | PrimInfo pinfo(empty); |
| 252 | for (size_t j=r.begin(); j<r.end(); j++) |
| 253 | { |
| 254 | if (!mesh->valid(j)) continue; |
| 255 | BBox3fa bounds = empty; |
| 256 | const PrimRef prim(bounds,(unsigned)geomID,(unsigned)j); |
| 257 | if (!mesh->valid(j)) continue; |
| 258 | pinfo.add_center2(prim,mesh->getNumSubGrids(j)); |
| 259 | } |
| 260 | return pinfo; |
| 261 | }, [](const PrimInfo& a, const PrimInfo& b) -> PrimInfo { return PrimInfo::merge(a,b); }); |
| 262 | numPrimitives = pinfo.size(); |
| 263 | |
| 264 | /* resize arrays */ |
| 265 | sgrids.resize(numPrimitives); |
| 266 | prims.resize(numPrimitives); |
| 267 | |
| 268 | /* second run to fill primrefs and SubGridBuildData arrays */ |
| 269 | pinfo = parallel_for_for_prefix_sum1( pstate, iter, PrimInfo(empty), [&](GridMesh* mesh, const range<size_t>& r, size_t k, size_t geomID, const PrimInfo& base) -> PrimInfo { |
| 270 | return mesh->createPrimRefArray(prims,sgrids,r,base.size(),geomID); |
| 271 | }, [](const PrimInfo& a, const PrimInfo& b) -> PrimInfo { return PrimInfo::merge(a,b); }); |
| 272 | assert(pinfo.size() == numPrimitives); |
| 273 | return pinfo; |
| 274 | } |
| 275 | |
| 276 | PrimInfo createPrimRefArrayGrids(GridMesh* mesh, mvector<PrimRef>& prims, mvector<SubGridBuildData>& sgrids) |
| 277 | { |
no test coverage detected