void BVH::create(std::vector<AABBox>& boxes, const float sceneSize, const Point3& sceneCenter) { m_leafNodes = new Node[boxes.size()]; m_branchNodes = new Node[boxes.size() - 1]; //TODO: give bounds for morton so all trans are not unit cube //first, assign morten codes #if !_DEBUG #pragma omp parallel for #endif for (int i = 0; i < boxes.size(); i++) { boxes[i].setMortonCentroid(morton3D(boxes[i].centroid(), sceneSize, sceneCenter)); m_leafNodes[i].isLeaf = true; m_leafNodes[i].box = new AABBox(boxes[i]); } //TODO: parallel sort? //then sort std::sort(boxes.begin(), boxes.end(), myobject); int i = 0; ProgressBar progressBar; //create heirarchy // generateHierarchyFullParallel(boxes); generateHierarchyStackLinear(boxes); // generateHierarchyRecursive(boxes, &m_branchNodes[0], 0, boxes.size() - 1, i, progressBar); // progressBar.end(); buildBoundingBox(); }
static Kokkos::View<size_t *, DeviceType> sortQueriesAlongZOrderCurve( Box const &scene_bounding_box, Kokkos::View<Query *, DeviceType> queries ) { auto const n_queries = queries.extent( 0 ); Kokkos::View<unsigned int *, DeviceType> morton_codes( Kokkos::ViewAllocateWithoutInitializing( "morton" ), n_queries ); Kokkos::parallel_for( ARBORX_MARK_REGION( "assign_morton_codes_to_queries" ), Kokkos::RangePolicy<ExecutionSpace>( 0, n_queries ), KOKKOS_LAMBDA( int i ) { Point xyz = Details::returnCentroid( queries( i )._geometry ); translateAndScale( xyz, xyz, scene_bounding_box ); morton_codes( i ) = morton3D( xyz[0], xyz[1], xyz[2] ); } );