Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/bvh/bvh2.cpp
| Show First 20 Lines • Show All 376 Lines • ▼ Show 20 Lines | void BVH2::refit_primitives(int start, int end, BoundBox &bbox, uint &visibility) | ||||
| /* Refit range of primitives. */ | /* Refit range of primitives. */ | ||||
| for (int prim = start; prim < end; prim++) { | for (int prim = start; prim < end; prim++) { | ||||
| int pidx = pack.prim_index[prim]; | int pidx = pack.prim_index[prim]; | ||||
| int tob = pack.prim_object[prim]; | int tob = pack.prim_object[prim]; | ||||
| Object *ob = objects[tob]; | Object *ob = objects[tob]; | ||||
| if (pidx == -1) { | if (pidx == -1) { | ||||
| /* Object instance. */ | /* Object instance. */ | ||||
| bbox.grow(ob->bounds); | bbox.grow(ob->get_bounds()); | ||||
| } | } | ||||
| else { | else { | ||||
| /* Primitives. */ | /* Primitives. */ | ||||
| if (pack.prim_type[prim] & PRIMITIVE_ALL_CURVE) { | if (pack.prim_type[prim] & PRIMITIVE_ALL_CURVE) { | ||||
| /* Curves. */ | /* Curves. */ | ||||
| const Hair *hair = static_cast<const Hair *>(ob->get_geometry()); | const Hair *hair = static_cast<const Hair *>(ob->get_geometry()); | ||||
| int prim_offset = (params.top_level) ? hair->prim_offset : 0; | int prim_offset = (params.top_level) ? hair->get_prim_offset() : 0; | ||||
| Hair::Curve curve = hair->get_curve(pidx - prim_offset); | Hair::Curve curve = hair->get_curve(pidx - prim_offset); | ||||
| int k = PRIMITIVE_UNPACK_SEGMENT(pack.prim_type[prim]); | int k = PRIMITIVE_UNPACK_SEGMENT(pack.prim_type[prim]); | ||||
| curve.bounds_grow(k, &hair->get_curve_keys()[0], &hair->get_curve_radius()[0], bbox); | curve.bounds_grow(k, &hair->get_curve_keys()[0], &hair->get_curve_radius()[0], bbox); | ||||
| /* Motion curves. */ | /* Motion curves. */ | ||||
| if (hair->get_use_motion_blur()) { | if (hair->get_use_motion_blur()) { | ||||
| Attribute *attr = hair->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION); | Attribute *attr = hair->get_attributes().find(ATTR_STD_MOTION_VERTEX_POSITION); | ||||
| if (attr) { | if (attr) { | ||||
| size_t hair_size = hair->get_curve_keys().size(); | size_t hair_size = hair->get_curve_keys().size(); | ||||
| size_t steps = hair->get_motion_steps() - 1; | size_t steps = hair->get_motion_steps() - 1; | ||||
| float3 *key_steps = attr->data_float3(); | float3 *key_steps = attr->data_float3(); | ||||
| for (size_t i = 0; i < steps; i++) | for (size_t i = 0; i < steps; i++) | ||||
| curve.bounds_grow(k, key_steps + i * hair_size, &hair->get_curve_radius()[0], bbox); | curve.bounds_grow(k, key_steps + i * hair_size, &hair->get_curve_radius()[0], bbox); | ||||
| ▲ Show 20 Lines • Show All 94 Lines • ▼ Show 20 Lines | |||||
| void BVH2::pack_instances(size_t nodes_size, size_t leaf_nodes_size) | void BVH2::pack_instances(size_t nodes_size, size_t leaf_nodes_size) | ||||
| { | { | ||||
| /* Adjust primitive index to point to the triangle in the global array, for | /* Adjust primitive index to point to the triangle in the global array, for | ||||
| * geometry with transform applied and already in the top level BVH. | * geometry with transform applied and already in the top level BVH. | ||||
| */ | */ | ||||
| for (size_t i = 0; i < pack.prim_index.size(); i++) { | for (size_t i = 0; i < pack.prim_index.size(); i++) { | ||||
| if (pack.prim_index[i] != -1) { | if (pack.prim_index[i] != -1) { | ||||
| pack.prim_index[i] += objects[pack.prim_object[i]]->get_geometry()->prim_offset; | pack.prim_index[i] += objects[pack.prim_object[i]]->get_geometry()->get_prim_offset(); | ||||
| } | } | ||||
| } | } | ||||
| /* track offsets of instanced BVH data in global array */ | /* track offsets of instanced BVH data in global array */ | ||||
| size_t prim_offset = pack.prim_index.size(); | size_t prim_offset = pack.prim_index.size(); | ||||
| size_t nodes_offset = nodes_size; | size_t nodes_offset = nodes_size; | ||||
| size_t nodes_leaf_offset = leaf_nodes_size; | size_t nodes_leaf_offset = leaf_nodes_size; | ||||
| /* clear array that gives the node indexes for instanced objects */ | /* clear array that gives the node indexes for instanced objects */ | ||||
| pack.object_node.clear(); | pack.object_node.clear(); | ||||
| /* reserve */ | /* reserve */ | ||||
| size_t prim_index_size = pack.prim_index.size(); | size_t prim_index_size = pack.prim_index.size(); | ||||
| size_t prim_tri_verts_size = pack.prim_tri_verts.size(); | size_t prim_tri_verts_size = pack.prim_tri_verts.size(); | ||||
| size_t pack_prim_index_offset = prim_index_size; | size_t pack_prim_index_offset = prim_index_size; | ||||
| size_t pack_prim_tri_verts_offset = prim_tri_verts_size; | size_t pack_prim_tri_verts_offset = prim_tri_verts_size; | ||||
| size_t pack_nodes_offset = nodes_size; | size_t pack_nodes_offset = nodes_size; | ||||
| size_t pack_leaf_nodes_offset = leaf_nodes_size; | size_t pack_leaf_nodes_offset = leaf_nodes_size; | ||||
| size_t object_offset = 0; | size_t object_offset = 0; | ||||
| foreach (Geometry *geom, geometry) { | foreach (Geometry *geom, geometry) { | ||||
| BVH2 *bvh = static_cast<BVH2 *>(geom->bvh); | BVH2 *bvh = static_cast<BVH2 *>(geom->get_bvh()); | ||||
| if (geom->need_build_bvh(params.bvh_layout)) { | if (geom->need_build_bvh(params.bvh_layout)) { | ||||
| prim_index_size += bvh->pack.prim_index.size(); | prim_index_size += bvh->pack.prim_index.size(); | ||||
| prim_tri_verts_size += bvh->pack.prim_tri_verts.size(); | prim_tri_verts_size += bvh->pack.prim_tri_verts.size(); | ||||
| nodes_size += bvh->pack.nodes.size(); | nodes_size += bvh->pack.nodes.size(); | ||||
| leaf_nodes_size += bvh->pack.leaf_nodes.size(); | leaf_nodes_size += bvh->pack.leaf_nodes.size(); | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | foreach (Object *ob, objects) { | ||||
| unordered_map<Geometry *, int>::iterator it = geometry_map.find(geom); | unordered_map<Geometry *, int>::iterator it = geometry_map.find(geom); | ||||
| if (geometry_map.find(geom) != geometry_map.end()) { | if (geometry_map.find(geom) != geometry_map.end()) { | ||||
| int noffset = it->second; | int noffset = it->second; | ||||
| pack.object_node[object_offset++] = noffset; | pack.object_node[object_offset++] = noffset; | ||||
| continue; | continue; | ||||
| } | } | ||||
| BVH2 *bvh = static_cast<BVH2 *>(geom->bvh); | BVH2 *bvh = static_cast<BVH2 *>(geom->get_bvh()); | ||||
| int noffset = nodes_offset; | int noffset = nodes_offset; | ||||
| int noffset_leaf = nodes_leaf_offset; | int noffset_leaf = nodes_leaf_offset; | ||||
| int geom_prim_offset = geom->prim_offset; | int geom_prim_offset = geom->get_prim_offset(); | ||||
| /* fill in node indexes for instances */ | /* fill in node indexes for instances */ | ||||
| if (bvh->pack.root_index == -1) | if (bvh->pack.root_index == -1) | ||||
| pack.object_node[object_offset++] = -noffset_leaf - 1; | pack.object_node[object_offset++] = -noffset_leaf - 1; | ||||
| else | else | ||||
| pack.object_node[object_offset++] = noffset; | pack.object_node[object_offset++] = noffset; | ||||
| geometry_map[geom] = pack.object_node[object_offset - 1]; | geometry_map[geom] = pack.object_node[object_offset - 1]; | ||||
| ▲ Show 20 Lines • Show All 98 Lines • Show Last 20 Lines | |||||