Blender V5.0
build.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2009-2010 NVIDIA Corporation
2 * SPDX-FileCopyrightText: 2011-2022 Blender Foundation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Adapted code from NVIDIA Corporation. */
7
8#pragma once
9
10#include <cfloat>
11
12#include "bvh/params.h"
13#include "bvh/unaligned.h"
14
15#include "util/array.h"
16#include "util/task.h"
17#include "util/unique_ptr.h"
18#include "util/vector.h"
19
21
22class Boundbox;
23class BVHBuildTask;
24class BVHNode;
25class BVHSpatialSplitBuildTask;
26class BVHParams;
27class InnerNode;
28class Geometry;
29class Hair;
30class Mesh;
31class Object;
32class PointCloud;
33class Progress;
34
35/* BVH Builder */
36
37class BVHBuild {
38 public:
39 /* Constructor/Destructor */
45 const BVHParams &params,
48
50
51 protected:
52 friend class BVHMixedSplit;
53 friend class BVHObjectSplit;
54 friend class BVHSpatialSplit;
55 friend class BVHBuildTask;
57 friend class BVHObjectBinning;
58
59 /* Adding references. */
61 BoundBox &center,
62 Mesh *mesh,
63 const int object_index);
64 void add_reference_curves(BoundBox &root, BoundBox &center, Hair *hair, const int object_index);
65 void add_reference_points(BoundBox &root, BoundBox &center, PointCloud *pointcloud, const int i);
67 BoundBox &center,
68 Geometry *geom,
69 const int object_index);
70 void add_reference_object(BoundBox &root, BoundBox &center, Object *ob, const int i);
71 void add_references(BVHRange &root);
72
73 /* Building. */
76 const int level,
77 BVHSpatialStorage *storage);
78 unique_ptr<BVHNode> build_node(const BVHObjectBinning &range, const int level);
82 const int start,
83 const int num);
84
85 bool range_within_max_leaf_size(const BVHRange &range,
86 const vector<BVHReference> &references) const;
87
88 /* Threads. */
89 enum { THREAD_TASK_SIZE = 4096 };
90 void thread_build_node(InnerNode *inner,
91 const int child,
92 const BVHObjectBinning &range,
93 const int level);
95 const int child,
96 const BVHRange &range,
98 int level);
100
101 /* Progress. */
102 void progress_update();
103
104 /* Tree rotations. */
105 void rotate(BVHNode *node, const int max_depth);
106 void rotate(BVHNode *node, const int max_depth, const int iterations);
107
108 /* Objects and primitive references. */
112
113 /* Output primitive indexes and objects. */
118
120
121 /* Build parameters. */
123
124 /* Progress reporting. */
130
131 /* Spatial splitting. */
133 enumerable_thread_specific<BVHSpatialStorage> spatial_storage;
136
137 /* Threads. */
139
140 /* Unaligned building. */
142};
143
ATTR_WARN_UNUSED_RESULT const size_t num
void add_reference_triangles(BoundBox &root, BoundBox &center, Mesh *mesh, const int object_index)
Definition build.cpp:57
size_t progress_count
Definition build.h:127
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:33
void thread_build_spatial_split_node(InnerNode *inner, const int child, const BVHRange &range, vector< BVHReference > &references, int level)
Definition build.cpp:636
unique_ptr< BVHNode > run()
Definition build.cpp:476
void rotate(BVHNode *node, const int max_depth)
Definition build.cpp:1237
bool range_within_max_leaf_size(const BVHRange &range, const vector< BVHReference > &references) const
Definition build.cpp:656
thread_spin_lock spatial_spin_lock
Definition build.h:135
thread_mutex build_mutex
Definition build.h:99
void add_references(BVHRange &root)
Definition build.cpp:413
void add_reference_object(BoundBox &root, BoundBox &center, Object *ob, const int i)
Definition build.cpp:376
friend class BVHSpatialSplit
Definition build.h:54
unique_ptr< BVHNode > create_leaf_node(const BVHRange &range, const vector< BVHReference > &references)
Definition build.cpp:969
friend class BVHBuildTask
Definition build.h:55
bool need_prim_time
Definition build.h:119
size_t spatial_free_index
Definition build.h:134
void add_reference_curves(BoundBox &root, BoundBox &center, Hair *hair, const int object_index)
Definition build.cpp:147
@ THREAD_TASK_SIZE
Definition build.h:89
BVHUnaligned unaligned_heuristic
Definition build.h:141
TaskPool task_pool
Definition build.h:138
friend class BVHObjectBinning
Definition build.h:57
unique_ptr< BVHNode > create_object_leaf_nodes(const BVHReference *ref, const int start, const int num)
Definition build.cpp:926
Progress & progress
Definition build.h:125
array< float2 > & prim_time
Definition build.h:117
vector< Object * > objects
Definition build.h:109
unique_ptr< BVHNode > build_node(const BVHRange &range, vector< BVHReference > &references, const int level, BVHSpatialStorage *storage)
Definition build.cpp:802
array< int > & prim_index
Definition build.h:115
enumerable_thread_specific< BVHSpatialStorage > spatial_storage
Definition build.h:133
size_t progress_total
Definition build.h:128
friend class BVHSpatialSplitBuildTask
Definition build.h:56
size_t progress_original_total
Definition build.h:129
BVHParams params
Definition build.h:122
float spatial_min_overlap
Definition build.h:132
int num_original_references
Definition build.h:111
void thread_build_node(InnerNode *inner, const int child, const BVHObjectBinning &range, const int level)
Definition build.cpp:610
array< int > & prim_type
Definition build.h:114
double progress_start_time
Definition build.h:126
array< int > & prim_object
Definition build.h:116
void progress_update()
Definition build.cpp:593
friend class BVHMixedSplit
Definition build.h:52
vector< BVHReference > references
Definition build.h:110
void add_reference_points(BoundBox &root, BoundBox &center, PointCloud *pointcloud, const int i)
Definition build.cpp:262
void add_reference_geometry(BoundBox &root, BoundBox &center, Geometry *geom, const int object_index)
Definition build.cpp:357
friend class BVHObjectSplit
Definition build.h:53
Definition hair.h:13
#define CCL_NAMESPACE_END
i
Definition text_draw.cc:230
std::mutex thread_mutex
Definition thread.h:27
tbb::spin_mutex thread_spin_lock
Definition thread.h:53