28 return (node->is_leaf()) ? ~idx :
idx;
34 :
BVH(params_, geometry_, objects_)
53 if (bvh2_root !=
NULL) {
62 if (root != bvh2_root) {
105 return const_cast<BVHNode *
>(root);
112 memset(data, 0,
sizeof(data));
237 assert(num_leaf_nodes <= num_nodes);
238 const size_t num_inner_nodes = num_nodes - num_leaf_nodes;
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);
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++) {
371 Object *ob = objects[tob];
381 const Hair *hair =
static_cast<const Hair *
>(ob->get_geometry());
383 Hair::Curve curve = hair->get_curve(pidx - prim_offset);
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];
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);
466 for (
unsigned int i = 0; i < tidx_size; i++) {
469 Object *ob = objects[tob];
493 size_t nodes_offset = nodes_size;
494 size_t nodes_leaf_offset = leaf_nodes_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;
507 foreach (
Geometry *geom, geometry) {
539 unordered_map<Geometry *, int> geometry_map;
542 foreach (
Object *ob, objects) {
543 Geometry *geom = ob->get_geometry();
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;
565 int noffset = nodes_offset;
566 int noffset_leaf = nodes_leaf_offset;
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++;
604 int4 data = leaf_nodes_offset[i];
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;
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)
int num_motion_triangle_steps
int num_motion_point_steps
int num_motion_curve_steps
static Transform compute_node_transform(const BoundBox &bounds, const Transform &aligned_space)
bool need_build_bvh(BVHLayout layout) const
int num_triangles() const
void set_substatus(const string &substatus_)
T * resize(size_t newsize)
#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 float3 *verts, BoundBox &bounds) const
NODE_DECLARE BoundBox bounds
uint visibility_for_tracing() const
array< uint > prim_visibility
array< float2 > prim_time
void bounds_grow(const float3 *points, const float *radius, BoundBox &bounds) const
Point get_point(int i) const