Blender  V3.3
build.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0
2  * Adapted from code copyright 2009-2010 NVIDIA Corporation
3  * Modifications Copyright 2011-2022 Blender Foundation. */
4 
5 #ifndef __BVH_BUILD_H__
6 #define __BVH_BUILD_H__
7 
8 #include <float.h>
9 
10 #include "bvh/params.h"
11 #include "bvh/unaligned.h"
12 
13 #include "util/array.h"
14 #include "util/task.h"
15 #include "util/vector.h"
16 
18 
19 class Boundbox;
20 class BVHBuildTask;
21 class BVHNode;
22 class BVHSpatialSplitBuildTask;
23 class BVHParams;
24 class InnerNode;
25 class Geometry;
26 class Hair;
27 class Mesh;
28 class Object;
29 class PointCloud;
30 class Progress;
31 
32 /* BVH Builder */
33 
34 class BVHBuild {
35  public:
36  /* Constructor/Destructor */
42  const BVHParams &params,
44  ~BVHBuild();
45 
46  BVHNode *run();
47 
48  protected:
49  friend class BVHMixedSplit;
50  friend class BVHObjectSplit;
51  friend class BVHSpatialSplit;
52  friend class BVHBuildTask;
54  friend class BVHObjectBinning;
55 
56  /* Adding references. */
58  void add_reference_curves(BoundBox &root, BoundBox &center, Hair *hair, int i);
59  void add_reference_points(BoundBox &root, BoundBox &center, PointCloud *pointcloud, int i);
60  void add_reference_geometry(BoundBox &root, BoundBox &center, Geometry *geom, int i);
61  void add_reference_object(BoundBox &root, BoundBox &center, Object *ob, int i);
62  void add_references(BVHRange &root);
63 
64  /* Building. */
65  BVHNode *build_node(const BVHRange &range,
67  int level,
68  BVHSpatialStorage *storage);
69  BVHNode *build_node(const BVHObjectBinning &range, int level);
71  BVHNode *create_object_leaf_nodes(const BVHReference *ref, int start, int num);
72 
73  bool range_within_max_leaf_size(const BVHRange &range,
74  const vector<BVHReference> &references) const;
75 
76  /* Threads. */
77  enum { THREAD_TASK_SIZE = 4096 };
78  void thread_build_node(InnerNode *node, int child, const BVHObjectBinning &range, int level);
80  int child,
81  const BVHRange &range,
83  int level);
85 
86  /* Progress. */
87  void progress_update();
88 
89  /* Tree rotations. */
90  void rotate(BVHNode *node, int max_depth);
91  void rotate(BVHNode *node, int max_depth, int iterations);
92 
93  /* Objects and primitive references. */
97 
98  /* Output primitive indexes and objects. */
103 
105 
106  /* Build parameters. */
108 
109  /* Progress reporting. */
115 
116  /* Spatial splitting. */
118  enumerable_thread_specific<BVHSpatialStorage> spatial_storage;
121 
122  /* Threads. */
124 
125  /* Unaligned building. */
127 };
128 
130 
131 #endif /* __BVH_BUILD_H__ */
NSNotificationCenter * center
Definition: build.h:34
BVHNode * create_object_leaf_nodes(const BVHReference *ref, int start, int num)
Definition: build.cpp:886
BVHNode * create_leaf_node(const BVHRange &range, const vector< BVHReference > &references)
Definition: build.cpp:923
void thread_build_spatial_split_node(InnerNode *node, int child, const BVHRange &range, vector< BVHReference > &references, int level)
Definition: build.cpp:606
size_t progress_count
Definition: build.h:112
BVHBuild(const vector< Object * > &objects, array< int > &prim_type, array< int > &prim_index, array< int > &prim_object, array< float2 > &prim_time, const BVHParams &params, Progress &progress)
Definition: build.cpp:32
bool range_within_max_leaf_size(const BVHRange &range, const vector< BVHReference > &references) const
Definition: build.cpp:626
thread_spin_lock spatial_spin_lock
Definition: build.h:120
thread_mutex build_mutex
Definition: build.h:84
void add_references(BVHRange &root)
Definition: build.cpp:409
void add_reference_object(BoundBox &root, BoundBox &center, Object *ob, int i)
Definition: build.cpp:374
BVHNode * build_node(const BVHRange &range, vector< BVHReference > &references, int level, BVHSpatialStorage *storage)
Definition: build.cpp:765
void add_reference_curves(BoundBox &root, BoundBox &center, Hair *hair, int i)
Definition: build.cpp:148
friend class BVHBuildTask
Definition: build.h:52
bool need_prim_time
Definition: build.h:104
size_t spatial_free_index
Definition: build.h:119
BVHUnaligned unaligned_heuristic
Definition: build.h:126
BVHNode * run()
Definition: build.cpp:466
TaskPool task_pool
Definition: build.h:123
void add_reference_geometry(BoundBox &root, BoundBox &center, Geometry *geom, int i)
Definition: build.cpp:355
Progress & progress
Definition: build.h:110
array< float2 > & prim_time
Definition: build.h:102
vector< Object * > objects
Definition: build.h:94
array< int > & prim_index
Definition: build.h:100
void rotate(BVHNode *node, int max_depth)
Definition: build.cpp:1179
enumerable_thread_specific< BVHSpatialStorage > spatial_storage
Definition: build.h:118
size_t progress_total
Definition: build.h:113
friend class BVHSpatialSplitBuildTask
Definition: build.h:53
size_t progress_original_total
Definition: build.h:114
BVHParams params
Definition: build.h:107
void thread_build_node(InnerNode *node, int child, const BVHObjectBinning &range, int level)
Definition: build.cpp:581
@ THREAD_TASK_SIZE
Definition: build.h:77
float spatial_min_overlap
Definition: build.h:117
int num_original_references
Definition: build.h:96
array< int > & prim_type
Definition: build.h:99
double progress_start_time
Definition: build.h:111
array< int > & prim_object
Definition: build.h:101
void add_reference_points(BoundBox &root, BoundBox &center, PointCloud *pointcloud, int i)
Definition: build.cpp:260
void progress_update()
Definition: build.cpp:566
~BVHBuild()
Definition: build.cpp:52
vector< BVHReference > references
Definition: build.h:95
void add_reference_triangles(BoundBox &root, BoundBox &center, Mesh *mesh, int i)
Definition: build.cpp:58
__forceinline int start() const
Definition: params.h:285
Definition: hair.h:13
#define CCL_NAMESPACE_END
Definition: cuda/compat.h:9
OperationNode * node
CCL_NAMESPACE_BEGIN typedef std::mutex thread_mutex
Definition: thread.h:27
tbb::spin_mutex thread_spin_lock
Definition: thread.h:52