diff options
Diffstat (limited to 'intern/cycles/render/mesh.cpp')
-rw-r--r-- | intern/cycles/render/mesh.cpp | 56 |
1 files changed, 47 insertions, 9 deletions
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index 11c8e240afd..a0afdd3b841 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -277,6 +277,20 @@ void Mesh::reserve_subd_creases(size_t num_creases) subd_creases_weight.reserve(num_creases); } +void Mesh::clear_non_sockets() +{ + Geometry::clear(true); + + num_subd_verts = 0; + num_subd_faces = 0; + + vert_to_stitching_key_map.clear(); + vert_stitching_map.clear(); + + delete patch_table; + patch_table = NULL; +} + void Mesh::clear(bool preserve_shaders, bool preserve_voxel_data) { Geometry::clear(preserve_shaders); @@ -297,22 +311,15 @@ void Mesh::clear(bool preserve_shaders, bool preserve_voxel_data) subd_ptex_offset.clear(); subd_face_corners.clear(); - num_subd_verts = 0; - num_subd_faces = 0; - subd_creases_edge.clear(); subd_creases_weight.clear(); subd_attributes.clear(); attributes.clear(preserve_voxel_data); - vert_to_stitching_key_map.clear(); - vert_stitching_map.clear(); - subdivision_type = SubdivisionType::SUBDIVISION_NONE; - delete patch_table; - patch_table = NULL; + clear_non_sockets(); } void Mesh::clear(bool preserve_shaders) @@ -662,7 +669,7 @@ void Mesh::add_undisplaced() float3 *data = attr->data_float3(); /* copy verts */ - size_t size = attr->buffer_size(this, attrs.prim); + size_t size = attr->buffer_size(this, ATTR_PRIM_GEOMETRY); /* Center points for ngons aren't stored in Mesh::verts but are included in size since they will * be calculated later, we subtract them from size here so we don't have an overflow while @@ -798,4 +805,35 @@ void Mesh::pack_patches(uint *patch_data, uint vert_offset, uint face_offset, ui } } +void Mesh::pack_primitives(PackedBVH &pack, int object, uint visibility) +{ + if (triangles.empty()) + return; + + const size_t num_prims = num_triangles(); + pack.prim_tri_index.reserve(pack.prim_tri_index.size() + num_prims); + pack.prim_tri_verts.reserve(pack.prim_tri_verts.size() + num_prims * 3); + pack.prim_type.reserve(pack.prim_type.size() + num_prims); + pack.prim_visibility.reserve(pack.prim_visibility.size() + num_prims); + pack.prim_index.reserve(pack.prim_index.size() + num_prims); + pack.prim_object.reserve(pack.prim_object.size() + num_prims); + // 'pack.prim_time' is unused by Embree and OptiX + + uint type = has_motion_blur() ? PRIMITIVE_MOTION_TRIANGLE : PRIMITIVE_TRIANGLE; + + for (size_t k = 0; k < num_prims; ++k) { + pack.prim_tri_index.push_back_reserved(pack.prim_tri_verts.size()); + + const Mesh::Triangle t = get_triangle(k); + pack.prim_tri_verts.push_back_reserved(float3_to_float4(verts[t.v[0]])); + pack.prim_tri_verts.push_back_reserved(float3_to_float4(verts[t.v[1]])); + pack.prim_tri_verts.push_back_reserved(float3_to_float4(verts[t.v[2]])); + + pack.prim_type.push_back_reserved(type); + pack.prim_visibility.push_back_reserved(visibility); + pack.prim_index.push_back_reserved(k + prim_offset); + pack.prim_object.push_back_reserved(object); + } +} + CCL_NAMESPACE_END |