+
+def create_scene(scene, *, visible_only=True):
+ obj_filter = None
+
+ if visible_only:
+ visible_names = set()
+ for c in get_all_collections(scene.collection):
+ if not c.hide_viewport:
+ visible_names.update(o.name for o in c.objects)
+ obj_filter = lambda o: o.name in visible_names
+
+ return Scene(scene, obj_filter)
+
+def create_scene_chain(scene, cache, *, visible_only=True):
+ if cache is None:
+ cache = {}
+
+ top = None
+ prev = None
+ while scene:
+ converted = None
+ if scene.name in cache:
+ converted = cache[scene.name]
+ else:
+ converted = create_scene(scene, visible_only=visible_only)
+ cache[scene.name] = converted
+
+ if not top:
+ top = converted
+ if prev:
+ prev.background_set = converted
+
+ prev = converted
+ scene = scene.background_set
+
+ return top