in pytorch3d/structures/meshes.py [0:0]
def update_padded(self, new_verts_padded):
"""
This function allows for an update of verts_padded without having to
explicitly convert it to the list representation for heterogeneous batches.
Returns a Meshes structure with updated padded tensors and copies of the
auxiliary tensors at construction time.
It updates self._verts_padded with new_verts_padded, and does a
shallow copy of (faces_padded, faces_list, num_verts_per_mesh, num_faces_per_mesh).
If packed representations are computed in self, they are updated as well.
Args:
new_points_padded: FloatTensor of shape (N, V, 3)
Returns:
Meshes with updated padded representations
"""
def check_shapes(x, size):
if x.shape[0] != size[0]:
raise ValueError("new values must have the same batch dimension.")
if x.shape[1] != size[1]:
raise ValueError("new values must have the same number of points.")
if x.shape[2] != size[2]:
raise ValueError("new values must have the same dimension.")
check_shapes(new_verts_padded, [self._N, self._V, 3])
new = self.__class__(verts=new_verts_padded, faces=self.faces_padded())
if new._N != self._N or new._V != self._V or new._F != self._F:
raise ValueError("Inconsistent sizes after construction.")
# overwrite the equisized flag
new.equisized = self.equisized
# overwrite textures if any
new.textures = self.textures
# copy auxiliary tensors
copy_tensors = ["_num_verts_per_mesh", "_num_faces_per_mesh", "valid"]
for k in copy_tensors:
v = getattr(self, k)
if torch.is_tensor(v):
setattr(new, k, v) # shallow copy
# shallow copy of faces_list if any, st new.faces_list()
# does not re-compute from _faces_padded
new._faces_list = self._faces_list
# update verts/faces packed if they are computed in self
if self._verts_packed is not None:
copy_tensors = [
"_faces_packed",
"_verts_packed_to_mesh_idx",
"_faces_packed_to_mesh_idx",
"_mesh_to_verts_packed_first_idx",
"_mesh_to_faces_packed_first_idx",
]
for k in copy_tensors:
v = getattr(self, k)
assert torch.is_tensor(v)
setattr(new, k, v) # shallow copy
# update verts_packed
pad_to_packed = self.verts_padded_to_packed_idx()
new_verts_packed = new_verts_padded.reshape(-1, 3)[pad_to_packed, :]
new._verts_packed = new_verts_packed
new._verts_padded_to_packed_idx = pad_to_packed
# update edges packed if they are computed in self
if self._edges_packed is not None:
copy_tensors = [
"_edges_packed",
"_edges_packed_to_mesh_idx",
"_mesh_to_edges_packed_first_idx",
"_faces_packed_to_edges_packed",
"_num_edges_per_mesh",
]
for k in copy_tensors:
v = getattr(self, k)
assert torch.is_tensor(v)
setattr(new, k, v) # shallow copy
# update laplacian if it is compute in self
if self._laplacian_packed is not None:
new._laplacian_packed = self._laplacian_packed
assert new._verts_list is None
assert new._verts_normals_packed is None
assert new._faces_normals_packed is None
assert new._faces_areas_packed is None
return new