def METHOD_NAME(self, file_name: str) -> Union["SceneNode", List["SceneNode"]]:
    """Reads a file using Trimesh.
    :param file_name: The file path. This is assumed to be one of the file
    types that Trimesh can read. It will not be checked again.
    :return: A scene node that contains the file's contents.
    """
    # CURA-6739
    # GLTF files are essentially JSON files. If you directly give a file name to trimesh.load(), it will
    # try to figure out the format, but for GLTF, it loads it as a binary file with flags "rb", and the json.load()
    # doesn't like it. For some reason, this seems to happen with 3.5.7, but not 3.7.1. Below is a workaround to
    # pass a file object that has been opened with "r" instead "rb" to load a GLTF file.
    if file_name.lower().endswith(".gltf"):
        mesh_or_scene = trimesh.load(open(file_name, "r", encoding = "utf-8"), file_type = "gltf")
    else:
        mesh_or_scene = trimesh.load(file_name)
    meshes = []  # type: List[Union[trimesh.Trimesh, trimesh.Scene, Any]]
    if isinstance(mesh_or_scene, trimesh.Trimesh):
        meshes = [mesh_or_scene]
    elif isinstance(mesh_or_scene, trimesh.Scene):
        meshes = [mesh for mesh in mesh_or_scene.geometry.values()]
    active_build_plate = CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate
    nodes = []  # type: List[SceneNode]
    for mesh in meshes:
        if not isinstance(mesh, trimesh.Trimesh):  # Trimesh can also receive point clouds, 2D paths, 3D paths or metadata. Skip those.
            continue
        mesh.merge_vertices()
        mesh.remove_unreferenced_vertices()
        mesh.fix_normals()
        mesh_data = self._toMeshData(mesh, file_name)
        file_base_name = os.path.basename(file_name)
        new_node = CuraSceneNode()
        new_node.setMeshData(mesh_data)
        new_node.setSelectable(True)
        new_node.setName(file_base_name if len(meshes) == 1 else "{file_base_name} {counter}".format(file_base_name = file_base_name, counter = str(len(nodes) + 1)))
        new_node.addDecorator(BuildPlateDecorator(active_build_plate))
        new_node.addDecorator(SliceableObjectDecorator())
        nodes.append(new_node)
    if len(nodes) == 1:
        return nodes[0]
    # Add all nodes to a group so they stay together.
    group_node = CuraSceneNode()
    group_node.addDecorator(GroupDecorator())
    group_node.addDecorator(ConvexHullDecorator())
    group_node.addDecorator(BuildPlateDecorator(active_build_plate))
    for node in nodes:
        node.setParent(group_node)
    return group_node