'Return a MeshData instance with vertexes and faces computed
for a spherical surface.'

@staticmethod
def sphere(rows, cols, radius=1.0, offset=True):

    verts = np.empty(((rows + 1), cols, 3), dtype=float)
    phi = ((np.arange((rows + 1)) * np.pi) / rows).reshape((rows + 1), 1)
    s = (radius * np.sin(phi))
    verts[..., 2] = (radius * np.cos(phi))
    th = (((np.arange(cols) * 2) * np.pi) / cols).reshape(1, cols)
    if offset:
        th = (th + ((np.pi / cols) * np.arange((rows + 1)).reshape((rows + 1), 1)))
    verts[..., 0] = (s * np.cos(th))
    verts[..., 1] = (s * np.sin(th))
    verts = verts.reshape(((rows + 1) * cols), 3)[(cols - 1):(- (cols - 1))]
    faces = np.empty((((rows * cols) * 2), 3), dtype=np.uint)
    rowtemplate1 = (((np.arange(cols).reshape(cols, 1) + np.array([[0, 1, 0]])) % cols) + np.array([[0, 0, cols]]))
    rowtemplate2 = (((np.arange(cols).reshape(cols, 1) + np.array([[0, 1, 1]])) % cols) + np.array([[cols, 0, cols]]))
    for row in range(rows):
        start = ((row * cols) * 2)
        faces[start:(start + cols)] = (rowtemplate1 + (row * cols))
        faces[(start + cols):(start + (cols * 2))] = (rowtemplate2 + (row * cols))
    faces = faces[cols:(- cols)]
    vmin = (cols - 1)
    faces[(faces < vmin)] = vmin
    faces -= vmin
    vmax = (verts.shape[0] - 1)
    faces[(faces > vmax)] = vmax
    return MeshData(vertexes=verts, faces=faces)
