diff options
Diffstat (limited to 'intern/cycles/bvh/bvh2.cpp')
-rw-r--r-- | intern/cycles/bvh/bvh2.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/intern/cycles/bvh/bvh2.cpp b/intern/cycles/bvh/bvh2.cpp index 04290602145..744e7fa9898 100644 --- a/intern/cycles/bvh/bvh2.cpp +++ b/intern/cycles/bvh/bvh2.cpp @@ -20,6 +20,7 @@ #include "scene/hair.h" #include "scene/mesh.h" #include "scene/object.h" +#include "scene/pointcloud.h" #include "bvh/build.h" #include "bvh/node.h" @@ -409,6 +410,30 @@ void BVH2::refit_primitives(int start, int end, BoundBox &bbox, uint &visibility } } } + else if (pack.prim_type[prim] & PRIMITIVE_ALL_POINT) { + /* Points. */ + const PointCloud *pointcloud = static_cast<const PointCloud *>(ob->get_geometry()); + int prim_offset = (params.top_level) ? pointcloud->prim_offset : 0; + const float3 *points = &pointcloud->points[0]; + const float *radius = &pointcloud->radius[0]; + PointCloud::Point point = pointcloud->get_point(pidx - prim_offset); + + point.bounds_grow(points, radius, bbox); + + /* Motion points. */ + if (pointcloud->get_use_motion_blur()) { + Attribute *attr = pointcloud->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION); + + if (attr) { + size_t pointcloud_size = pointcloud->points.size(); + size_t steps = pointcloud->get_motion_steps() - 1; + float3 *point_steps = attr->data_float3(); + + for (size_t i = 0; i < steps; i++) + point.bounds_grow(point_steps + i * pointcloud_size, radius, bbox); + } + } + } else { /* Triangles. */ const Mesh *mesh = static_cast<const Mesh *>(ob->get_geometry()); @@ -505,7 +530,8 @@ void BVH2::pack_instances(size_t nodes_size, size_t leaf_nodes_size) pack.leaf_nodes.resize(leaf_nodes_size); pack.object_node.resize(objects.size()); - if (params.num_motion_curve_steps > 0 || params.num_motion_triangle_steps > 0) { + if (params.num_motion_curve_steps > 0 || params.num_motion_triangle_steps > 0 || + params.num_motion_point_steps > 0) { pack.prim_time.resize(prim_index_size); } |