Fermat
lbvh_builder.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2010-2018, NVIDIA Corporation
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of NVIDIA Corporation nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
32 #pragma once
33 
34 #include <cugar/bvh/bvh.h>
35 #include <cugar/basic/vector.h>
36 #include <cugar/linalg/vector.h>
37 #include <cugar/linalg/bbox.h>
41 #include <cugar/basic/cuda/timer.h>
42 #include <thrust/device_vector.h>
43 
44 namespace cugar {
45 namespace cuda {
46 
52 {
53  cuda::Timer morton_time;
54  cuda::Timer sorting_time;
55  cuda::Timer build_time;
56 };
57 
92 template <
93  typename integer,
94  typename bvh_node_type = Bvh_node,
95  typename node_vector = vector<device_tag,bvh_node_type>,
96  typename range_vector = vector<device_tag,uint2>,
97  typename index_vector = vector<device_tag,uint32> >
99 {
100  typedef LBVH_builder_stats Stats;
101 
108  node_vector* nodes = NULL,
109  index_vector* index = NULL,
110  range_vector* leaf_ranges = NULL,
111  index_vector* leaf_pointers = NULL,
112  index_vector* parents = NULL,
113  index_vector* skip_nodes = NULL,
114  range_vector* node_ranges = NULL) :
115  m_nodes( nodes ),
116  m_leaf_ranges( leaf_ranges ),
117  m_leaf_pointers( leaf_pointers ),
118  m_parents( parents ),
119  m_skip_nodes( skip_nodes ),
120  m_node_ranges( node_ranges ),
121  m_index( index ) {}
122 
123  void set_nodes(node_vector* nodes) { m_nodes = nodes; }
124  void set_index(index_vector* index) { m_index = index; }
125  void set_parents(index_vector* parents) { m_parents = parents; }
126  void set_skip_nodes(index_vector* skip_nodes) { m_skip_nodes = skip_nodes; }
127  void set_leaf_pointers(index_vector* leaf_pointers) { m_leaf_pointers = leaf_pointers; }
128  void set_leaf_ranges(range_vector* leaf_ranges) { m_leaf_ranges = leaf_ranges; }
129  void set_node_ranges(range_vector* node_ranges) { m_node_ranges = node_ranges; }
130 
137  template <typename Iterator>
138  void build(
139  const Bbox3f bbox,
140  const Iterator points_begin,
141  const Iterator points_end,
142  const uint32 max_leaf_size,
143  Stats* stats = NULL);
144 
145  node_vector* m_nodes;
146  range_vector* m_node_ranges;
147  range_vector* m_leaf_ranges;
148  index_vector* m_leaf_pointers;
149  index_vector* m_parents;
150  index_vector* m_skip_nodes;
151  index_vector* m_index;
153  caching_device_vector<integer> m_temp_codes;
154  caching_device_vector<uint32> m_temp_index;
155  Bbox3f m_bbox;
156  uint32 m_node_count;
157  uint32 m_leaf_count;
158  cuda::Radixtree_context m_kd_context;
159 };
160 
164 } // namespace cuda
165 } // namespace cugar
166 
167 #include <cugar/bvh/cuda/lbvh_builder_inline.h>
Definition: timer.h:46
Entry point to the generic Bounding Volume Hierarchy library.
Defines the context class for the binary tree generate() function.
Definition: bvh_node.h:45
Define CUDA based scan primitives.
Defines an axis-aligned bounding box class.
Definition: vector.h:117
Define a vector_view POD type and plain_view() for std::vector.
Definition: diff.h:38
Definition: lbvh_builder.h:51
Definition: lbvh_builder.h:98
Definition: radixtree_context.h:49
LBVH_builder(node_vector *nodes=NULL, index_vector *index=NULL, range_vector *leaf_ranges=NULL, index_vector *leaf_pointers=NULL, index_vector *parents=NULL, index_vector *skip_nodes=NULL, range_vector *node_ranges=NULL)
Definition: lbvh_builder.h:107
Defines a simple binary tree context implementation to be used with the generate_radix_tree() functio...