In https://docs.blender.org/api/current/bpy.types.RenderEngine.html the example shown loops over depsgraph.ids
followed by looping over depsgraph.object_instances
to get the initial scene.
def view_update(self, context, depsgraph):
if not self.scene_data:
# First time initialization
self.scene_data = []
first_time = True
# Loop over all datablocks used in the scene.
for datablock in depsgraph.ids:
pass
else:
first_time = False
# Test which datablocks changed
for update in depsgraph.updates:
print("Datablock updated: ", update.id.name)
# Test if any material was added, removed or changed.
if depsgraph.id_type_updated('MATERIAL'):
print("Materials updated")
# Loop over all object instances in the scene.
if first_time or depsgraph.id_type_updated('OBJECT'):
for instance in depsgraph.object_instances:
pass
However, what I’m seeing in my tests is that all scene objects are included in depsgraph.object_instances
independent of the .hide_render
value set on the object. How to make sure that the initial scene only contains the objects that actually need to be rendered? object_instance.show_self
doesn’t help as it’s always True it seems.
When handling a final render the depsgraph passed to RenderEngine.render()
will only have objects in object_instances
that actually need to be rendered. Is there an easy equivalent for interactive renders?