def test_extend(self): B = 5 mesh = init_mesh(B, 30, 50) V = mesh._V num_faces = mesh.num_faces_per_mesh() num_verts = mesh.num_verts_per_mesh() faces_uvs_list = [ torch.randint(size=(f, 3), low=0, high=V) for f in num_faces ] verts_uvs_list = [torch.rand(v, 2) for v in num_verts] tex_uv = TexturesUV( maps=torch.ones((B, 16, 16, 3)), faces_uvs=faces_uvs_list, verts_uvs=verts_uvs_list, ) tex_mesh = Meshes(verts=mesh.verts_list(), faces=mesh.faces_list(), textures=tex_uv) N = 2 new_mesh = tex_mesh.extend(N) self.assertEqual(len(tex_mesh) * N, len(new_mesh)) tex_init = tex_mesh.textures new_tex = new_mesh.textures new_tex_num_verts = new_mesh.num_verts_per_mesh() for i in range(len(tex_mesh)): for n in range(N): tex_nv = new_tex_num_verts[i * N + n] self.assertClose( # The original textures were initialized using # verts uvs list tex_init.verts_uvs_list()[i], # In the new textures, the verts_uvs are initialized # from padded. The verts per mesh are not used to # convert from padded to list. See TexturesUV for an # explanation. new_tex.verts_uvs_list()[i * N + n][:tex_nv, ...], ) self.assertClose(tex_init.faces_uvs_list()[i], new_tex.faces_uvs_list()[i * N + n]) self.assertClose(tex_init.maps_padded()[i, ...], new_tex.maps_padded()[i * N + n]) self.assertClose( tex_init._num_faces_per_mesh[i], new_tex._num_faces_per_mesh[i * N + n], ) self.assertAllSeparate([ tex_init.faces_uvs_padded(), new_tex.faces_uvs_padded(), tex_init.verts_uvs_padded(), new_tex.verts_uvs_padded(), tex_init.maps_padded(), new_tex.maps_padded(), ]) with self.assertRaises(ValueError): tex_mesh.extend(N=-1)
def test_extend(self): B = 10 mesh = init_mesh(B, 30, 50) F = mesh._F tex_uv = TexturesAtlas(atlas=torch.randn((B, F, 2, 2, 3))) tex_mesh = Meshes(verts=mesh.verts_padded(), faces=mesh.faces_padded(), textures=tex_uv) N = 20 new_mesh = tex_mesh.extend(N) self.assertEqual(len(tex_mesh) * N, len(new_mesh)) tex_init = tex_mesh.textures new_tex = new_mesh.textures for i in range(len(tex_mesh)): for n in range(N): self.assertClose(tex_init.atlas_list()[i], new_tex.atlas_list()[i * N + n]) self.assertClose( tex_init._num_faces_per_mesh[i], new_tex._num_faces_per_mesh[i * N + n], ) self.assertAllSeparate( [tex_init.atlas_padded(), new_tex.atlas_padded()]) with self.assertRaises(ValueError): tex_mesh.extend(N=-1)