Preview generation module: explicitly exclude any lib item.
Thanks to campbell for raising that point!
This commit is contained in:
@@ -33,6 +33,10 @@ INTERN_PREVIEW_TYPES = {'MATERIAL', 'LAMP', 'WORLD', 'TEXTURE', 'IMAGE'}
|
|||||||
OBJECT_TYPES_RENDER = {'MESH', 'CURVE', 'SURFACE', 'META', 'FONT'}
|
OBJECT_TYPES_RENDER = {'MESH', 'CURVE', 'SURFACE', 'META', 'FONT'}
|
||||||
|
|
||||||
|
|
||||||
|
def ids_nolib(bids):
|
||||||
|
return (bid for bid in bids if not bid.library)
|
||||||
|
|
||||||
|
|
||||||
def rna_backup_gen(data, include_props=None, exclude_props=None, root=()):
|
def rna_backup_gen(data, include_props=None, exclude_props=None, root=()):
|
||||||
# only writable properties...
|
# only writable properties...
|
||||||
for p in data.bl_rna.properties:
|
for p in data.bl_rna.properties:
|
||||||
@@ -156,15 +160,15 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
|
|||||||
# .blend as clean as possible!
|
# .blend as clean as possible!
|
||||||
success = True
|
success = True
|
||||||
|
|
||||||
scene = bpy.data.scenes[render_context.scene]
|
scene = bpy.data.scenes[render_context.scene, None]
|
||||||
try:
|
try:
|
||||||
if render_context.backup_scene is None:
|
if render_context.backup_scene is None:
|
||||||
scene.world = None
|
scene.world = None
|
||||||
scene.camera = None
|
scene.camera = None
|
||||||
if render_context.camera:
|
if render_context.camera:
|
||||||
scene.objects.unlink(bpy.data.objects[render_context.camera])
|
scene.objects.unlink(bpy.data.objects[render_context.camera, None])
|
||||||
if render_context.lamp:
|
if render_context.lamp:
|
||||||
scene.objects.unlink(bpy.data.objects[render_context.lamp])
|
scene.objects.unlink(bpy.data.objects[render_context.lamp, None])
|
||||||
bpy.data.scenes.remove(scene)
|
bpy.data.scenes.remove(scene)
|
||||||
scene = None
|
scene = None
|
||||||
else:
|
else:
|
||||||
@@ -175,7 +179,7 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
|
|||||||
|
|
||||||
if render_context.world is not None:
|
if render_context.world is not None:
|
||||||
try:
|
try:
|
||||||
world = bpy.data.worlds[render_context.world]
|
world = bpy.data.worlds[render_context.world, None]
|
||||||
if render_context.backup_world is None:
|
if render_context.backup_world is None:
|
||||||
if scene is not None:
|
if scene is not None:
|
||||||
scene.world = None
|
scene.world = None
|
||||||
@@ -189,39 +193,40 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
|
|||||||
|
|
||||||
if render_context.camera:
|
if render_context.camera:
|
||||||
try:
|
try:
|
||||||
camera = bpy.data.objects[render_context.camera]
|
camera = bpy.data.objects[render_context.camera, None]
|
||||||
if render_context.backup_camera is None:
|
if render_context.backup_camera is None:
|
||||||
if scene is not None:
|
if scene is not None:
|
||||||
scene.camera = None
|
scene.camera = None
|
||||||
scene.objects.unlink(camera)
|
scene.objects.unlink(camera)
|
||||||
camera.user_clear()
|
camera.user_clear()
|
||||||
bpy.data.objects.remove(camera)
|
bpy.data.objects.remove(camera)
|
||||||
bpy.data.cameras.remove(bpy.data.cameras[render_context.camera_data])
|
bpy.data.cameras.remove(bpy.data.cameras[render_context.camera_data, None])
|
||||||
else:
|
else:
|
||||||
rna_backup_restore(camera, render_context.backup_camera)
|
rna_backup_restore(camera, render_context.backup_camera)
|
||||||
rna_backup_restore(bpy.data.cameras[render_context.camera_data], render_context.backup_camera_data)
|
rna_backup_restore(bpy.data.cameras[render_context.camera_data, None],
|
||||||
|
render_context.backup_camera_data)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("ERROR:", e)
|
print("ERROR:", e)
|
||||||
success = False
|
success = False
|
||||||
|
|
||||||
if render_context.lamp:
|
if render_context.lamp:
|
||||||
try:
|
try:
|
||||||
lamp = bpy.data.objects[render_context.lamp]
|
lamp = bpy.data.objects[render_context.lamp, None]
|
||||||
if render_context.backup_lamp is None:
|
if render_context.backup_lamp is None:
|
||||||
if scene is not None:
|
if scene is not None:
|
||||||
scene.objects.unlink(lamp)
|
scene.objects.unlink(lamp)
|
||||||
lamp.user_clear()
|
lamp.user_clear()
|
||||||
bpy.data.objects.remove(lamp)
|
bpy.data.objects.remove(lamp)
|
||||||
bpy.data.lamps.remove(bpy.data.lamps[render_context.lamp_data])
|
bpy.data.lamps.remove(bpy.data.lamps[render_context.lamp_data, None])
|
||||||
else:
|
else:
|
||||||
rna_backup_restore(lamp, render_context.backup_lamp)
|
rna_backup_restore(lamp, render_context.backup_lamp)
|
||||||
rna_backup_restore(bpy.data.lamps[render_context.lamp_data], render_context.backup_lamp_data)
|
rna_backup_restore(bpy.data.lamps[render_context.lamp_data, None], render_context.backup_lamp_data)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("ERROR:", e)
|
print("ERROR:", e)
|
||||||
success = False
|
success = False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
image = bpy.data.images[render_context.image]
|
image = bpy.data.images[render_context.image, None]
|
||||||
image.user_clear()
|
image.user_clear()
|
||||||
bpy.data.images.remove(image)
|
bpy.data.images.remove(image)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -232,7 +237,7 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
|
|||||||
|
|
||||||
def objects_render_engine_guess(obs):
|
def objects_render_engine_guess(obs):
|
||||||
for obname in obs:
|
for obname in obs:
|
||||||
ob = bpy.data.objects[obname]
|
ob = bpy.data.objects[obname, None]
|
||||||
for matslot in ob.material_slots:
|
for matslot in ob.material_slots:
|
||||||
mat = matslot.material
|
mat = matslot.material
|
||||||
if mat and mat.use_nodes and mat.node_tree:
|
if mat and mat.use_nodes and mat.node_tree:
|
||||||
@@ -264,7 +269,7 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
|
|||||||
def objects_bbox_calc(camera, objects):
|
def objects_bbox_calc(camera, objects):
|
||||||
bbox = (Vector((1e9, 1e9, 1e9)), Vector((-1e9, -1e9, -1e9)))
|
bbox = (Vector((1e9, 1e9, 1e9)), Vector((-1e9, -1e9, -1e9)))
|
||||||
for obname in objects:
|
for obname in objects:
|
||||||
ob = bpy.data.objects[obname]
|
ob = bpy.data.objects[obname, None]
|
||||||
object_bbox_merge(bbox, ob, camera)
|
object_bbox_merge(bbox, ob, camera)
|
||||||
# Our bbox has been generated in camera local space, bring it back in world one
|
# Our bbox has been generated in camera local space, bring it back in world one
|
||||||
bbox[0][:] = camera.matrix_world * bbox[0]
|
bbox[0][:] = camera.matrix_world * bbox[0]
|
||||||
@@ -282,10 +287,10 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
|
|||||||
return cos
|
return cos
|
||||||
|
|
||||||
def preview_render_do(render_context, item_container, item_name, objects):
|
def preview_render_do(render_context, item_container, item_name, objects):
|
||||||
scene = bpy.data.scenes[render_context.scene]
|
scene = bpy.data.scenes[render_context.scene, None]
|
||||||
if objects is not None:
|
if objects is not None:
|
||||||
camera = bpy.data.objects[render_context.camera]
|
camera = bpy.data.objects[render_context.camera, None]
|
||||||
lamp = bpy.data.objects[render_context.lamp] if render_context.lamp is not None else None
|
lamp = bpy.data.objects[render_context.lamp, None] if render_context.lamp is not None else None
|
||||||
cos = objects_bbox_calc(camera, objects)
|
cos = objects_bbox_calc(camera, objects)
|
||||||
loc, ortho_scale = camera.camera_fit_coords(scene, cos)
|
loc, ortho_scale = camera.camera_fit_coords(scene, cos)
|
||||||
camera.location = loc
|
camera.location = loc
|
||||||
@@ -296,8 +301,8 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
|
|||||||
|
|
||||||
bpy.ops.render.render(write_still=True)
|
bpy.ops.render.render(write_still=True)
|
||||||
|
|
||||||
image = bpy.data.images[render_context.image]
|
image = bpy.data.images[render_context.image, None]
|
||||||
item = getattr(bpy.data, item_container)[item_name]
|
item = getattr(bpy.data, item_container)[item_name, None]
|
||||||
image.reload()
|
image.reload()
|
||||||
# Note: we could use struct module here, but not quite sure it'd give any advantage really...
|
# Note: we could use struct module here, but not quite sure it'd give any advantage really...
|
||||||
pix = tuple((round(r * 255)) + (round(g * 255) << 8) + (round(b * 255) << 16) + (round(a * 255) << 24)
|
pix = tuple((round(r * 255)) + (round(g * 255) << 8) + (round(b * 255) << 16) + (round(a * 255) << 24)
|
||||||
@@ -320,12 +325,12 @@ 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)
|
prev_shown = tuple(ob.hide_render for ob in ids_nolib(bpy.data.objects))
|
||||||
for ob in bpy.data.objects:
|
for ob in ids_nolib(bpy.data.objects):
|
||||||
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 in ids_nolib(bpy.data.objects):
|
||||||
if root.name in objects_ignored:
|
if root.name in objects_ignored:
|
||||||
continue
|
continue
|
||||||
if root.type not in OBJECT_TYPES_RENDER:
|
if root.type not in OBJECT_TYPES_RENDER:
|
||||||
@@ -338,11 +343,11 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
|
|||||||
render_context = render_context_create(render_engine, objects_ignored)
|
render_context = render_context_create(render_engine, objects_ignored)
|
||||||
render_contexts[render_engine] = render_context
|
render_contexts[render_engine] = render_context
|
||||||
|
|
||||||
scene = bpy.data.scenes[render_context.scene]
|
scene = bpy.data.scenes[render_context.scene, None]
|
||||||
bpy.context.screen.scene = scene
|
bpy.context.screen.scene = scene
|
||||||
|
|
||||||
for obname in objects:
|
for obname in objects:
|
||||||
ob = bpy.data.objects[obname]
|
ob = bpy.data.objects[obname, None]
|
||||||
if obname not in scene.objects:
|
if obname not in scene.objects:
|
||||||
scene.objects.link(ob)
|
scene.objects.link(ob)
|
||||||
ob.hide_render = False
|
ob.hide_render = False
|
||||||
@@ -360,17 +365,17 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
|
|||||||
# OverflowError: Python int too large to convert to C long
|
# OverflowError: Python int too large to convert to C long
|
||||||
# ... :(
|
# ... :(
|
||||||
import sys
|
import sys
|
||||||
scene = bpy.data.scenes[render_context.scene]
|
scene = bpy.data.scenes[render_context.scene, None]
|
||||||
for obname in objects:
|
for obname in objects:
|
||||||
ob = bpy.data.objects[obname]
|
ob = bpy.data.objects[obname, None]
|
||||||
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 ob, is_rendered in zip(tuple(ids_nolib(bpy.data.objects)), prev_shown):
|
||||||
ob.hide_render = is_rendered
|
ob.hide_render = is_rendered
|
||||||
|
|
||||||
if do_groups:
|
if do_groups:
|
||||||
for grp in bpy.data.groups:
|
for grp in ids_nolib(bpy.data.groups):
|
||||||
if grp.name in groups_ignored:
|
if grp.name in groups_ignored:
|
||||||
continue
|
continue
|
||||||
objects = tuple(ob.name for ob in grp.objects)
|
objects = tuple(ob.name for ob in grp.objects)
|
||||||
@@ -381,7 +386,7 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
|
|||||||
render_context = render_context_create(render_engine, objects_ignored)
|
render_context = render_context_create(render_engine, objects_ignored)
|
||||||
render_contexts[render_engine] = render_context
|
render_contexts[render_engine] = render_context
|
||||||
|
|
||||||
scene = bpy.data.scenes[render_context.scene]
|
scene = bpy.data.scenes[render_context.scene, None]
|
||||||
bpy.context.screen.scene = scene
|
bpy.context.screen.scene = scene
|
||||||
|
|
||||||
bpy.ops.object.group_instance_add(group=grp.name)
|
bpy.ops.object.group_instance_add(group=grp.name)
|
||||||
@@ -391,16 +396,16 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
|
|||||||
|
|
||||||
preview_render_do(render_context, 'groups', grp.name, objects)
|
preview_render_do(render_context, 'groups', grp.name, objects)
|
||||||
|
|
||||||
scene = bpy.data.scenes[render_context.scene]
|
scene = bpy.data.scenes[render_context.scene, None]
|
||||||
scene.objects.unlink(bpy.data.objects[grp_obname])
|
scene.objects.unlink(bpy.data.objects[grp_obname, None])
|
||||||
|
|
||||||
bpy.context.screen.scene = bpy.data.scenes[prev_scenename]
|
bpy.context.screen.scene = bpy.data.scenes[prev_scenename, None]
|
||||||
for render_context in render_contexts.values():
|
for render_context in render_contexts.values():
|
||||||
if not render_context_delete(render_context):
|
if not render_context_delete(render_context):
|
||||||
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:
|
for scene in ids_nolib(bpy.data.scenes):
|
||||||
has_camera = scene.camera is not None
|
has_camera = scene.camera is not None
|
||||||
bpy.context.screen.scene = scene
|
bpy.context.screen.scene = scene
|
||||||
render_context = render_context_create('__SCENE', objects_ignored)
|
render_context = render_context_create('__SCENE', objects_ignored)
|
||||||
@@ -417,7 +422,7 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
|
|||||||
if not render_context_delete(render_context):
|
if not render_context_delete(render_context):
|
||||||
do_save = False
|
do_save = False
|
||||||
|
|
||||||
bpy.context.screen.scene = bpy.data.scenes[prev_scenename]
|
bpy.context.screen.scene = bpy.data.scenes[prev_scenename, None]
|
||||||
if do_save:
|
if do_save:
|
||||||
print("Saving %s..." % bpy.data.filepath)
|
print("Saving %s..." % bpy.data.filepath)
|
||||||
try:
|
try:
|
||||||
@@ -435,15 +440,15 @@ def do_clear_previews(do_objects, do_groups, do_scenes, do_data_intern):
|
|||||||
bpy.ops.wm.previews_clear(id_type=INTERN_PREVIEW_TYPES)
|
bpy.ops.wm.previews_clear(id_type=INTERN_PREVIEW_TYPES)
|
||||||
|
|
||||||
if do_objects:
|
if do_objects:
|
||||||
for ob in bpy.data.objects:
|
for ob in ids_nolib(bpy.data.objects):
|
||||||
ob.preview.image_size = (0, 0)
|
ob.preview.image_size = (0, 0)
|
||||||
|
|
||||||
if do_groups:
|
if do_groups:
|
||||||
for grp in bpy.data.groups:
|
for grp in ids_nolib(bpy.data.groups):
|
||||||
grp.preview.image_size = (0, 0)
|
grp.preview.image_size = (0, 0)
|
||||||
|
|
||||||
if do_scenes:
|
if do_scenes:
|
||||||
for scene in bpy.data.scenes:
|
for scene in ids_nolib(bpy.data.scenes):
|
||||||
scene.preview.image_size = (0, 0)
|
scene.preview.image_size = (0, 0)
|
||||||
|
|
||||||
print("Saving %s..." % bpy.data.filepath)
|
print("Saving %s..." % bpy.data.filepath)
|
||||||
|
Reference in New Issue
Block a user