[Bf-extensions-cvs] [ea0f8ae7] master: object_animrenderbake: moved to contrib: T63750
meta-androcto
noreply at git.blender.org
Fri May 24 10:20:52 CEST 2019
Commit: ea0f8ae7b3840896a4bbe33c9e5380a929df0923
Author: meta-androcto
Date: Fri May 24 18:20:12 2019 +1000
Branches: master
https://developer.blender.org/rBACea0f8ae7b3840896a4bbe33c9e5380a929df0923
object_animrenderbake: moved to contrib: T63750
===================================================================
A object_animrenderbake.py
===================================================================
diff --git a/object_animrenderbake.py b/object_animrenderbake.py
new file mode 100644
index 00000000..ea9713bb
--- /dev/null
+++ b/object_animrenderbake.py
@@ -0,0 +1,214 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+bl_info = {
+ "name": "Animated Render Baker",
+ "author": "Janne Karhu (jahka)",
+ "version": (2, 0),
+ "blender": (2, 75, 0),
+ "location": "Properties > Render > Bake Panel",
+ "description": "Renderbakes a series of frames",
+ "category": "Render",
+ "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"
+ "Scripts/Object/Animated_Render_Baker",
+}
+
+
+import bpy
+from bpy.props import IntProperty
+
+class OBJECT_OT_animrenderbake(bpy.types.Operator):
+ bl_label = "Animated Render Bake"
+ bl_description= "Bake animated image textures of selected objects"
+ bl_idname = "object.anim_bake_image"
+ bl_register = True
+
+ def framefile(self, filepath, frame):
+ """
+ Set frame number to file name image.png -> image0013.png
+ """
+ import os
+ fn, ext = os.path.splitext(filepath)
+ return "%s%04d%s" % (fn, frame, ext)
+
+ 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
+
+ # Check for errors before starting
+ if start >= end:
+ self.report({'ERROR'}, "Start frame must be smaller than end frame")
+ return {'CANCELLED'}
+
+ selected = context.selected_objects
+
+ # Only single object baking for now
+ if scene.render.use_bake_selected_to_active:
+ if len(selected) > 2:
+ self.report({'ERROR'}, "Select only two objects for animated baking")
+ return {'CANCELLED'}
+ elif len(selected) > 1:
+ self.report({'ERROR'}, "Select only one object for animated baking")
+ return {'CANCELLED'}
+
+ if context.active_object.type != 'MESH':
+ self.report({'ERROR'}, "The baked object must be a mesh object")
+ return {'CANCELLED'}
+
+ if context.active_object.mode == 'EDIT':
+ self.report({'ERROR'}, "Can't bake in edit-mode")
+ return {'CANCELLED'}
+
+ img = None
+
+ # find the image that's used for rendering
+ # TODO: support multiple images per bake
+ 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")
+ return {'CANCELLED'}
+
+ if img.is_dirty:
+ self.report({'ERROR'}, "Save the image that's used for baking before use")
+ return {'CANCELLED'}
+
+ if img.packed_file is not None:
+ self.report({'ERROR'}, "Can't animation-bake packed file")
+ return {'CANCELLED'}
+
+ # make sure we have an absolute path so that copying works for sure
+ img_filepath_abs = bpy.path.abspath(img.filepath, library=img.library)
+
+ print("Animated baking for frames (%d - %d)" % (start, end))
+
+ for cfra in range(start, end + 1):
+ print("Baking frame %d" % cfra)
+
+ # update scene to new frame and bake to template image
+ scene.frame_set(cfra)
+ if is_cycles:
+ ret = bpy.ops.object.bake()
+ else:
+ ret = bpy.ops.object.bake_image()
+ if 'CANCELLED' in ret:
+ return {'CANCELLED'}
+
+ # Currently the api doesn't allow img.save_as()
+ # so just save the template image as usual for
+ # every frame and copy to a file with frame specific filename
+ img.save()
+ img_filepath_new = self.framefile(img_filepath_abs, cfra)
+ shutil.copyfile(img_filepath_abs, img_filepath_new)
+ print("Saved %r" % img_filepath_new)
+
+ print("Baking done!")
+
+ return{'FINISHED'}
+
+
+def draw(self, context):
+ layout = self.layout
+
+ scene = context.scene
+
+ row = layout.row()
+ row.operator("object.anim_bake_image", text="Animated Bake", icon="RENDER_ANIMATION")
+ rowsub = row.row(align=True)
+ rowsub.prop(scene, "animrenderbake_start")
+ rowsub.prop(scene, "animrenderbake_end")
+
+
+def register():
+ bpy.utils.register_module(__name__)
+
+ bpy.types.Scene.animrenderbake_start = IntProperty(
+ name="Start",
+ description="Start frame of the animated bake",
+ default=1)
+
+ bpy.types.Scene.animrenderbake_end = IntProperty(
+ name="End",
+ description="End frame of the animated bake",
+ default=250)
+
+ bpy.types.RENDER_PT_bake.prepend(draw)
+ cycles_panel = getattr(bpy.types, "CYCLES_RENDER_PT_bake", None)
+ if cycles_panel:
+ cycles_panel.prepend(draw)
+
+
+def unregister():
+ bpy.utils.unregister_module(__name__)
+
+ # restore original panel draw function
+ del bpy.types.Scene.animrenderbake_start
+ del bpy.types.Scene.animrenderbake_end
+
+ bpy.types.RENDER_PT_bake.remove(draw)
+ cycles_panel = getattr(bpy.types, "CYCLES_RENDER_PT_bake", None)
+ if cycles_panel:
+ cycles_panel.remove(draw)
+
+
+if __name__ == "__main__":
+ register()
More information about the Bf-extensions-cvs
mailing list