Blind attempt to fix T45931: Blender Fails to generate previews.

Cannot reproduce the issue here on linux, but have the feeling windows builds are much
more easily broken with referencing bad data from bpy. So here guessing direct loop
over bpy.data.xxx when you do add and remove stuff from said xxx inside the loop
is not a good idea - which seems logical in the end. :P
This commit is contained in:
Bastien Montagne
2015-08-28 13:22:03 +02:00
parent a560122c4b
commit c4ab521e26

View File

@@ -320,14 +320,17 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
prev_scenename = bpy.context.screen.scene.name prev_scenename = bpy.context.screen.scene.name
if do_objects: if do_objects:
prev_shown = tuple(ob.hide_render for ob in bpy.data.objects) data_objects_names = tuple(ob.name for ob in bpy.data.objects)
for ob in bpy.data.objects: prev_shown = tuple(bpy.data.objects[obname].hide_render for obname in data_objects_names)
for obname in data_objects_names:
ob = bpy.data.objects[obname]
if ob in objects_ignored: if ob in objects_ignored:
continue continue
ob.hide_render = True ob.hide_render = True
for root in bpy.data.objects: for root_name in data_objects_names:
if root.name in objects_ignored: if root_name in objects_ignored:
continue continue
root = bpy.data.objects[root_name]
if root.type not in OBJECT_TYPES_RENDER: if root.type not in OBJECT_TYPES_RENDER:
continue continue
objects = (root.name,) objects = (root.name,)
@@ -366,13 +369,15 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
scene.objects.unlink(ob) scene.objects.unlink(ob)
ob.hide_render = True ob.hide_render = True
for ob, is_rendered in zip(bpy.data.objects, prev_shown): for obname, is_rendered in zip(data_objects_names, prev_shown):
ob.hide_render = is_rendered bpy.data.objects[obname].hide_render = is_rendered
if do_groups: if do_groups:
for grp in bpy.data.groups: data_groups_names = tuple(grp.name for grp in bpy.data.groups)
if grp.name in groups_ignored: for grpname in data_groups_names:
if grpname in groups_ignored:
continue continue
grp = bpy.data.groups[grpname]
objects = tuple(ob.name for ob in grp.objects) objects = tuple(ob.name for ob in grp.objects)
render_engine = objects_render_engine_guess(objects) render_engine = objects_render_engine_guess(objects)
@@ -400,19 +405,21 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
do_save = False # Do not save file if something went wrong here, we could 'pollute' it with temp data... do_save = False # Do not save file if something went wrong here, we could 'pollute' it with temp data...
if do_scenes: if do_scenes:
for scene in bpy.data.scenes: data_scenes_names = tuple(sce.name for sce in bpy.data.scenes)
has_camera = scene.camera is not None for scename in data_scenes_names:
bpy.context.screen.scene = scene sce = bpy.data.scenes[scename]
has_camera = sce.camera is not None
bpy.context.screen.scene = sce
render_context = render_context_create('__SCENE', objects_ignored) render_context = render_context_create('__SCENE', objects_ignored)
scene.update() sce.update()
objects = None objects = None
if not has_camera: if not has_camera:
# We had to add a temp camera, now we need to place it to see interesting objects! # We had to add a temp camera, now we need to place it to see interesting objects!
objects = tuple(ob.name for ob in scene.objects objects = tuple(ob.name for ob in sce.objects
if (not ob.hide_render) and (ob.type in OBJECT_TYPES_RENDER)) if (not ob.hide_render) and (ob.type in OBJECT_TYPES_RENDER))
preview_render_do(render_context, 'scenes', scene.name, objects) preview_render_do(render_context, 'scenes', sce.name, objects)
if not render_context_delete(render_context): if not render_context_delete(render_context):
do_save = False do_save = False