34 :
BVH(params_, geometry_, objects_)
53 if (bvh2_root !=
NULL) {
62 if (root != bvh2_root) {
105 return const_cast<BVHNode *
>(root);
163 assert(c0 < 0 || c0 <
pack.nodes.size());
164 assert(c1 < 0 || c1 <
pack.nodes.size());
212 assert(c0 < 0 || c0 <
pack.nodes.size());
213 assert(c1 < 0 || c1 <
pack.nodes.size());
237 assert(num_leaf_nodes <= num_nodes);
238 const size_t num_inner_nodes = num_nodes - num_leaf_nodes;
240 if (
params.use_unaligned_nodes) {
250 pack.leaf_nodes.clear();
256 pack.nodes.resize(node_size);
260 int nextNodeIdx = 0, nextLeafNodeIdx = 0;
272 while (stack.size()) {
276 if (
e.node->is_leaf()) {
284 for (
int i = 0; i < 2; ++i) {
285 if (
e.node->get_child(i)->is_leaf()) {
286 idx[i] = nextLeafNodeIdx++;
289 idx[i] = nextNodeIdx;
298 pack_inner(
e, stack[stack.size() - 2], stack[stack.size() - 1]);
301 assert(node_size == nextNodeIdx);
308 assert(!
params.top_level);
312 refit_node(0, (
pack.root_index == -1) ?
true :
false, bbox, visibility);
321 const int c0 =
data[0].x;
322 const int c1 =
data[0].y;
339 const int c0 =
data[0].z;
340 const int c1 =
data[0].w;
343 uint visibility0 = 0, visibility1 = 0;
345 refit_node((c0 < 0) ? -c0 - 1 : c0, (c0 < 0), bbox0, visibility0);
346 refit_node((c1 < 0) ? -c1 - 1 : c1, (c1 < 0), bbox1, visibility1);
351 idx, aligned_space, aligned_space, bbox0, bbox1, c0, c1, visibility0, visibility1);
359 visibility = visibility0 | visibility1;
368 for (
int prim = start; prim < end; prim++) {
369 int pidx =
pack.prim_index[prim];
370 int tob =
pack.prim_object[prim];
381 const Hair *hair =
static_cast<const Hair *
>(ob->get_geometry());
386 curve.
bounds_grow(k, &hair->get_curve_keys()[0], &hair->get_curve_radius()[0], bbox);
389 if (hair->get_use_motion_blur()) {
393 size_t hair_size = hair->get_curve_keys().size();
394 size_t steps = hair->get_motion_steps() - 1;
397 for (
size_t i = 0; i <
steps; i++) {
398 curve.
bounds_grow(k, key_steps + i * hair_size, &hair->get_curve_radius()[0], bbox);
407 const float3 *points = &pointcloud->points[0];
408 const float *radius = &pointcloud->radius[0];
411 point.bounds_grow(points, radius, bbox);
414 if (pointcloud->get_use_motion_blur()) {
418 size_t pointcloud_size = pointcloud->points.size();
419 size_t steps = pointcloud->get_motion_steps() - 1;
422 for (
size_t i = 0; i <
steps; i++) {
423 point.bounds_grow(point_steps + i * pointcloud_size, radius, bbox);
430 const Mesh *mesh =
static_cast<const Mesh *
>(ob->get_geometry());
433 const float3 *vpos = &mesh->verts[0];
438 if (mesh->use_motion_blur) {
442 size_t mesh_size = mesh->verts.size();
443 size_t steps = mesh->motion_steps - 1;
446 for (
size_t i = 0; i <
steps; i++) {
447 triangle.
bounds_grow(vert_steps + i * mesh_size, bbox);
461 const size_t tidx_size =
pack.prim_index.size();
463 pack.prim_visibility.clear();
464 pack.prim_visibility.resize(tidx_size);
466 for (
unsigned int i = 0; i < tidx_size; i++) {
467 if (
pack.prim_index[i] != -1) {
468 int tob =
pack.prim_object[i];
473 pack.prim_visibility[i] = 0;
485 for (
size_t i = 0; i <
pack.prim_index.size(); i++) {
486 if (
pack.prim_index[i] != -1) {
487 pack.prim_index[i] +=
objects[
pack.prim_object[i]]->get_geometry()->prim_offset;
492 size_t prim_offset =
pack.prim_index.size();
493 size_t nodes_offset = nodes_size;
494 size_t nodes_leaf_offset = leaf_nodes_size;
497 pack.object_node.clear();
500 size_t prim_index_size =
pack.prim_index.size();
502 size_t pack_prim_index_offset = prim_index_size;
503 size_t pack_nodes_offset = nodes_size;
504 size_t pack_leaf_nodes_offset = leaf_nodes_size;
505 size_t object_offset = 0;
517 pack.prim_index.resize(prim_index_size);
518 pack.prim_type.resize(prim_index_size);
519 pack.prim_object.resize(prim_index_size);
520 pack.prim_visibility.resize(prim_index_size);
521 pack.nodes.resize(nodes_size);
522 pack.leaf_nodes.resize(leaf_nodes_size);
525 if (
params.num_motion_curve_steps > 0 ||
params.num_motion_triangle_steps > 0 ||
526 params.num_motion_point_steps > 0)
528 pack.prim_time.resize(prim_index_size);
531 int *pack_prim_index = (
pack.prim_index.size()) ? &
pack.prim_index[0] :
NULL;
532 int *pack_prim_type = (
pack.prim_type.size()) ? &
pack.prim_type[0] :
NULL;
533 int *pack_prim_object = (
pack.prim_object.size()) ? &
pack.prim_object[0] :
NULL;
534 uint *pack_prim_visibility = (
pack.prim_visibility.size()) ? &
pack.prim_visibility[0] :
NULL;
536 int4 *pack_leaf_nodes = (
pack.leaf_nodes.size()) ? &
pack.leaf_nodes[0] :
NULL;
539 unordered_map<Geometry *, int> geometry_map;
543 Geometry *geom = ob->get_geometry();
549 pack.object_node[object_offset++] = 0;
555 unordered_map<Geometry *, int>::iterator it = geometry_map.find(geom);
557 if (geometry_map.find(geom) != geometry_map.end()) {
558 int noffset = it->second;
559 pack.object_node[object_offset++] = noffset;
565 int noffset = nodes_offset;
566 int noffset_leaf = nodes_leaf_offset;
571 pack.object_node[object_offset++] = -noffset_leaf - 1;
574 pack.object_node[object_offset++] = noffset;
577 geometry_map[geom] =
pack.object_node[object_offset - 1];
587 for (
size_t i = 0; i < bvh_prim_index_size; i++) {
588 pack_prim_index[pack_prim_index_offset] = bvh_prim_index[i] + geom_prim_offset;
589 pack_prim_type[pack_prim_index_offset] = bvh_prim_type[i];
590 pack_prim_visibility[pack_prim_index_offset] = bvh_prim_visibility[i];
591 pack_prim_object[pack_prim_index_offset] = 0;
592 if (bvh_prim_time !=
NULL) {
593 pack_prim_time[pack_prim_index_offset] = bvh_prim_time[i];
595 pack_prim_index_offset++;
605 data.x += prim_offset;
606 data.y += prim_offset;
607 pack_leaf_nodes[pack_leaf_nodes_offset] =
data;
609 pack_leaf_nodes[pack_leaf_nodes_offset + j] = leaf_nodes_offset[i + j];
619 for (
size_t i = 0; i < bvh_nodes_size;) {
620 size_t nsize, nsize_bbox;
630 memcpy(
pack_nodes + pack_nodes_offset, bvh_nodes + i, nsize_bbox *
sizeof(
int4));
633 int4 data = bvh_nodes[i + nsize_bbox];
634 data.z += (
data.z < 0) ? -noffset_leaf : noffset;
635 data.w += (
data.w < 0) ? -noffset_leaf : noffset;
641 memcpy(&
pack_nodes[pack_nodes_offset + nsize_bbox + 1],
642 &bvh_nodes[i + nsize_bbox + 1],
643 sizeof(
int4) * (nsize - (nsize_bbox + 1)));
645 pack_nodes_offset += nsize;
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a point
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
#define BVH_NODE_LEAF_SIZE
#define BVH_UNALIGNED_NODE_SIZE
@ BVH_STAT_UNALIGNED_INNER_COUNT
Attribute * find(ustring name) const
void pack_instances(size_t nodes_size, size_t leaf_nodes_size)
void pack_aligned_inner(const BVHStackEntry &e, const BVHStackEntry &e0, const BVHStackEntry &e1)
void refit_node(int idx, bool leaf, BoundBox &bbox, uint &visibility)
void pack_leaf(const BVHStackEntry &e, const LeafNode *leaf)
void refit_primitives(int start, int end, BoundBox &bbox, uint &visibility)
void pack_aligned_node(int idx, const BoundBox &b0, const BoundBox &b1, int c0, int c1, uint visibility0, uint visibility1)
void pack_inner(const BVHStackEntry &e, const BVHStackEntry &e0, const BVHStackEntry &e1)
virtual BVHNode * widen_children_nodes(const BVHNode *root)
void pack_unaligned_inner(const BVHStackEntry &e, const BVHStackEntry &e0, const BVHStackEntry &e1)
void pack_nodes(const BVHNode *root)
void refit(Progress &progress)
void pack_unaligned_node(int idx, const Transform &aligned_space0, const Transform &aligned_space1, const BoundBox &b0, const BoundBox &b1, int c0, int c1, uint visibility0, uint visibility1)
BVH2(const BVHParams ¶ms, const vector< Geometry * > &geometry, const vector< Object * > &objects)
void build(Progress &progress, Stats *stats)
static Transform compute_node_transform(const BoundBox &bounds, const Transform &aligned_space)
vector< Geometry * > geometry
vector< Object * > objects
bool need_build_bvh(BVHLayout layout) const
Curve get_curve(size_t i) const
int num_triangles() const
void set_substatus(const string &substatus_)
#define CCL_NAMESPACE_END
@ ATTR_STD_MOTION_VERTEX_POSITION
@ PATH_RAY_NODE_UNALIGNED
#define PRIMITIVE_UNPACK_SEGMENT(type)
int getSubtreeSize(BVH_STAT stat=BVH_STAT_NODE_COUNT) const
virtual bool is_leaf() const =0
bool has_unaligned() const
Transform get_aligned_space() const
BVHStackEntry(const BVHNode *n=0, int i=0)
__forceinline void grow(const float3 &pt)
void bounds_grow(const int k, const float3 *curve_keys, const float *curve_radius, BoundBox &bounds) const
void bounds_grow(const float3 *verts, BoundBox &bounds) const
Triangle get_triangle(size_t i) const
NODE_DECLARE BoundBox bounds
uint visibility_for_tracing() const
array< uint > prim_visibility
array< float2 > prim_time
Point get_point(int i) const
VecBase< float, 4 > float4