diff options
Diffstat (limited to 'object_animrenderbake.py')
-rw-r--r-- | object_animrenderbake.py | 64 |
1 files changed, 54 insertions, 10 deletions
diff --git a/object_animrenderbake.py b/object_animrenderbake.py index 695af7b1..552ac80c 100644 --- a/object_animrenderbake.py +++ b/object_animrenderbake.py @@ -19,8 +19,8 @@ bl_info = { "name": "Animated Render Baker", "author": "Janne Karhu (jahka)", - "version": (1, 0), - "blender": (2, 65, 0), + "version": (2, 0), + "blender": (2, 75, 0), "location": "Properties > Render > Bake Panel", "description": "Renderbakes a series of frames", "category": "Object", @@ -48,9 +48,10 @@ class OBJECT_OT_animrenderbake(bpy.types.Operator): def invoke(self, context, event): import shutil - + is_cycles = (context.scene.render.engine == 'CYCLES') + scene = context.scene - + start = scene.animrenderbake_start end = scene.animrenderbake_end @@ -82,12 +83,46 @@ class OBJECT_OT_animrenderbake(bpy.types.Operator): # find the image that's used for rendering # TODO: support multiple images per bake - for uvtex in context.active_object.data.uv_textures: - if uvtex.active_render == True: - for uvdata in uvtex.data: - if uvdata.image is not None: - img = uvdata.image + if is_cycles: + # XXX This tries to mimic nodeGetActiveTexture(), but we have no access to 'texture_active' state from RNA... + # IMHO, this should be a func in RNA nodetree struct anyway? + inactive = None + selected = None + for mat_slot in context.active_object.material_slots: + mat = mat_slot.material + if not mat or not mat.node_tree: + continue + trees = [mat.node_tree] + while trees and not img: + tree = trees.pop() + node = tree.nodes.active + if node.type in {'TEX_IMAGE', 'TEX_ENVIRONMENT'}: + img = node.image break + for node in tree.nodes: + if node.type in {'TEX_IMAGE', 'TEX_ENVIRONMENT'} and node.image: + if node.select: + if not selected: + selected = node + else: + if not inactive: + inactive = node + elif node.type == 'GROUP': + trees.add(node.node_tree) + if img: + break + if not img: + if selected: + img = selected.image + elif inactive: + img = inactive.image + else: + for uvtex in context.active_object.data.uv_textures: + if uvtex.active_render == True: + for uvdata in uvtex.data: + if uvdata.image is not None: + img = uvdata.image + break if img is None: self.report({'ERROR'}, "No valid image found to bake to") @@ -111,7 +146,10 @@ class OBJECT_OT_animrenderbake(bpy.types.Operator): # update scene to new frame and bake to template image scene.frame_set(cfra) - ret = bpy.ops.object.bake_image() + if is_cycles: + ret = bpy.ops.object.bake() + else: + ret = bpy.ops.object.bake_image() if 'CANCELLED' in ret: return {'CANCELLED'} @@ -154,6 +192,9 @@ def register(): default=250) bpy.types.RENDER_PT_bake.prepend(draw) + cycles_panel = getattr(bpy.types, "CyclesRender_PT_bake", None) + if cycles_panel: + cycles_panel.prepend(draw) def unregister(): @@ -164,6 +205,9 @@ def unregister(): del bpy.types.Scene.animrenderbake_end bpy.types.RENDER_PT_bake.remove(draw) + cycles_panel = getattr(bpy.types, "CyclesRender_PT_bake", None) + if cycles_panel: + cycles_panel.remove(draw) if __name__ == "__main__": |