def test_clone(self): V = 20 tex = Textures( maps=torch.ones((5, 16, 16, 3)), faces_uvs=torch.randint(size=(5, 10, 3), low=0, high=V), verts_uvs=torch.ones((5, V, 2)), ) tex_cloned = tex.clone() self.assertSeparate(tex._faces_uvs_padded, tex_cloned._faces_uvs_padded) self.assertSeparate(tex._verts_uvs_padded, tex_cloned._verts_uvs_padded) self.assertSeparate(tex._maps_padded, tex_cloned._maps_padded)
def test_padded_to_packed(self): N = 2 # Case where each face in the mesh has 3 unique uv vertex indices # - i.e. even if a vertex is shared between multiple faces it will # have a unique uv coordinate for each face. faces_uvs_list = [ torch.tensor([[0, 1, 2], [3, 5, 4], [7, 6, 8]]), torch.tensor([[0, 1, 2], [3, 4, 5]]), ] # (N, 3, 3) verts_uvs_list = [torch.ones(9, 2), torch.ones(6, 2)] faces_uvs_padded = list_to_padded(faces_uvs_list, pad_value=-1) verts_uvs_padded = list_to_padded(verts_uvs_list) tex = Textures( maps=torch.ones((N, 16, 16, 3)), faces_uvs=faces_uvs_padded, verts_uvs=verts_uvs_padded, ) # This is set inside Meshes when textures is passed as an input. # Here we set _num_faces_per_mesh and _num_verts_per_mesh explicity. tex1 = tex.clone() tex1._num_faces_per_mesh = ( faces_uvs_padded.gt(-1).all(-1).sum(-1).tolist()) tex1._num_verts_per_mesh = torch.tensor([5, 4]) faces_packed = tex1.faces_uvs_packed() verts_packed = tex1.verts_uvs_packed() faces_list = tex1.faces_uvs_list() verts_list = tex1.verts_uvs_list() for f1, f2 in zip(faces_uvs_list, faces_list): self.assertTrue((f1 == f2).all().item()) for f, v1, v2 in zip(faces_list, verts_list, verts_uvs_list): idx = f.unique() self.assertTrue((v1[idx] == v2).all().item()) self.assertTrue(faces_packed.shape == (3 + 2, 3)) # verts_packed is just flattened verts_padded. # split sizes are not used for verts_uvs. self.assertTrue(verts_packed.shape == (9 * 2, 2)) # Case where num_faces_per_mesh is not set tex2 = tex.clone() faces_packed = tex2.faces_uvs_packed() verts_packed = tex2.verts_uvs_packed() faces_list = tex2.faces_uvs_list() verts_list = tex2.verts_uvs_list() # Packed is just flattened padded as num_faces_per_mesh # has not been provided. self.assertTrue(verts_packed.shape == (9 * 2, 2)) self.assertTrue(faces_packed.shape == (3 * 2, 3)) for i in range(N): self.assertTrue(( faces_list[i] == faces_uvs_padded[i, ...].squeeze()).all().item()) for i in range(N): self.assertTrue(( verts_list[i] == verts_uvs_padded[i, ...].squeeze()).all().item())