import bpy
import os
def file_last_frame(scn):
if scn.render.image_settings.file_format == 'H264':
return "%s%04d-%04d.avi"%(scn.render.filepath, scn.frame_start, scn.frame_end)
return "%s%04d.png"%(scn.render.filepath, scn.frame_end)
def string_for_blend_dependency():
return bpy.data.filepath
def clause_for_scene(scn, tgt, tag = None):
cmd = "blender -b %s -S '%s' -a\n\n"%(bpy.data.filepath, scn.name)
if tag is None:
rval = "%s: %s\n\t%s\n\n"%( tgt, string_for_blend_dependency(), cmd)
else:
l1 = ".INTERMEDIATE: %s.intermediate\n" % tag
l2 = "%s: %s.intermediate\n" % (tgt, tag)
l3 = "%s.intermediate: %s\n\t%s\n\n"%( tag, string_for_blend_dependency(), cmd)
rval = l1+l2+l3
return rval
def relativize(fname):
if "/" == fname[0:1]:
return fname
else:
return os.path.join(os.path.dirname(bpy.data.filepath), fname)
def single_output(scn):
if scn.frame_start == scn.frame_end:
return True
if scn.render.image_settings.file_format == 'H264':
return True
return False
serial=0
def variables_for(scn):
global serial
if single_output(scn):
serial = serial+1
key="MOV%d"%serial
fname = file_last_frame(scn)
rval = key+" = "+fname+"\n"
return ["$(%s)"%key , rval+"\n%s:$(%s)\n\n"%(key,key), key]
else:
serial=serial+1
key = "PNGs%d"%serial
rval = key+" ="
for i in range(scn.frame_start, scn.frame_end+1):
rval = rval + ( " %s%04d.png\\\n\t"%(scn.render.filepath, i))
return [ "$(%s)"%key, rval+"\n%s: $(%s)\n\n" % (key, key), key ]
def write_makefile(ofname, all_target="all", scenes = None):
if scenes is None:
scenes = default_makefile_scenes()
ofname = relativize(ofname)
scene_rules = ""
all_depends = ""
variables = ""
for scn in scenes:
(target, v1, tag) = variables_for(scn)
variables = variables + v1
scene_rules = scene_rules + clause_for_scene(scn, target, tag)
all_depends = all_depends + " " + target
f = open(ofname, 'w')
f.write(variables+"\n\n")
f.write("#\n\n")
f.write(scene_rules)
f.write("#\n\n")
f.write(all_target + ":" + all_depends+"\n\n")
def default_makefile_scenes():
return [ scn for scn in bpy.data.scenes if scn.library is None]
def default_makefile_deps(basename = "blender.d"):
import os
return os.path.join(os.path.dirname(bpy.data.filepath), basename)
def cliche_makefile():
ofname = default_makefile_deps()
write_makefile(ofname, "pngs")
if __name__ == "__main__":
overrides = bpy.data.texts.get('makefile overrides')
if overrides is not None:
# create a text buffer in your .blend file that replaces cliche_makefile() or default_makefile_scenes() or serial
exec( overrides.as_string() )
cliche_makefile()
|
Blender python API quick-start
Syntax highlighting by Pygments.