39 if (int_cell_count == 0) {
44 auto traverser = tree.get_structure_traverser();
53 Tvec *__restrict cell_min,
54 Tvec *__restrict cell_max) {
55 u32 left_child = tree_traverser.get_left_child(gid);
56 u32 right_child = tree_traverser.get_right_child(gid);
58 Tvec bminl = cell_min[left_child];
59 Tvec bminr = cell_min[right_child];
60 Tvec bmaxl = cell_max[left_child];
61 Tvec bmaxr = cell_max[right_child];
63 Tvec bmin = sham::min(bminl, bminr);
64 Tvec bmax = sham::max(bmaxl, bmaxr);
71 for (
u32 i = 0; i < tree.tree_depth; i++) {
109 u32 i,
const Tvec *pos,
auto cell_iter, Tvec *comp_min, Tvec *comp_max) {
126 cell_iter.for_each_in_leaf_cell(i, [&](
u32 obj_id) {
127 Tvec r = pos[obj_id];
129 min = sham::min(min, r);
130 max = sham::max(max, r);
133 comp_min[leaf_offset + i] = min;
134 comp_max[leaf_offset + i] = max;
138 return compute_tree_aabb<Tvec>(
168 cell_iter.for_each_in_leaf_cell(i, [&](
u32 obj_id) {
169 Tvec r_min = min_pos[obj_id];
170 Tvec r_max = max_pos[obj_id];
172 min = sham::min(min, r_min);
173 max = sham::max(max, r_max);
176 comp_min[leaf_offset + i] = min;
177 comp_max[leaf_offset + i] = max;
181 return compute_tree_aabb<Tvec>(
191template void shamtree::propagate_aabb_up<f64_3>(
195 const KarrasRadixTree &tree,
200 const KarrasRadixTree &tree,
201 const LeafCellIterator &cell_it,
207 const KarrasRadixTree &tree,
208 const LeafCellIterator &cell_it,
void propagate_aabb_up(KarrasRadixTreeAABB< Tvec > &tree_aabb, const KarrasRadixTree &tree)
Propagates the axis-aligned bounding boxes (AABBs) upwards in the tree.
KarrasRadixTreeAABB< Tvec > compute_tree_aabb(const KarrasRadixTree &tree, KarrasRadixTreeAABB< Tvec > &&recycled_tree_aabb, const std::function< void(KarrasRadixTreeAABB< Tvec > &, u32)> &fct_fill_leaf)
Compute the AABB of all cells in the tree.
KarrasRadixTreeAABB< Tvec > compute_tree_aabb_from_position_ranges(const KarrasRadixTree &tree, const LeafCellIterator &cell_it, KarrasRadixTreeAABB< Tvec > &&recycled_tree_aabb, sham::DeviceBuffer< Tvec > &min, sham::DeviceBuffer< Tvec > &max)
same but for position ranges
KarrasRadixTreeAABB< Tvec > compute_tree_aabb_from_positions(const KarrasRadixTree &tree, const LeafCellIterator &cell_it, KarrasRadixTreeAABB< Tvec > &&recycled_tree_aabb, sham::DeviceBuffer< Tvec > &positions)
Compute the AABB of all cells in the tree from positions.
KarrasRadixTreeAABB< Tvec > prepare_karras_radix_tree_aabb(const KarrasRadixTree &tree, KarrasRadixTreeAABB< Tvec > &&recycled_tree_aabb)
Prepare a KarrasRadixTreeAABB from a KarrasRadixTree.
std::uint32_t u32
32 bit unsigned integer
A buffer allocated in USM (Unified Shared Memory)
void resize(size_t new_size, bool keep_data=true)
Resizes the buffer to a given size.
A SYCL queue associated with a device and a context.
DeviceQueue & get_queue(u32 id=0)
Get a reference to a DeviceQueue.
sham::DeviceBuffer< Tvec > buf_aabb_max
right child id (size = internal_count)
sham::DeviceBuffer< Tvec > buf_aabb_min
left child id (size = internal_count)
A data structure representing a Karras Radix Tree.
u32 get_leaf_count() const
Get leaf count.
u32 get_internal_cell_count() const
Get internal cell count.
void kernel_call(sham::DeviceQueue &q, RefIn in, RefOut in_out, u32 n, Functor &&func, SourceLocation &&callsite=SourceLocation{})
Submit a kernel to a SYCL queue.
This file contains the definition for the stacktrace related functionality.
#define __shamrock_stack_entry()
Macro to create a stack entry.
A class that references multiple buffers or similar objects.