RenderWorker cleanup and add camera methods to BlenderRenderWorker

This commit is contained in:
Brett Williams
2022-10-25 15:28:51 -07:00
parent 3ee3dfd4e2
commit 2da06ab166
5 changed files with 93 additions and 76 deletions

View File

@@ -1,24 +1,10 @@
#! /usr/bin/python
#!/usr/bin/env python3
import re
import time
from utilities.render_worker import *
SUPPORTED_FORMATS = ['TGA', 'RAWTGA', 'JPEG', 'IRIS', 'IRIZ', 'AVIRAW', 'AVIJPEG', 'PNG', 'BMP', 'HDR', 'TIFF',
'OPEN_EXR', 'OPEN_EXR_MULTILAYER', 'MPEG', 'CINEON', 'DPX', 'DDS', 'JP2']
class BlenderRenderWorker(BaseRenderWorker):
def version(self):
version = None
try:
ver_out = subprocess.check_output([self.renderer_path(), '-v']).decode('utf-8')
version = ver_out.splitlines()[0].replace('Blender', '').strip()
except Exception as e:
logger.error("Failed to get Blender version: {}".format(e))
return version
renderer = 'Blender'
render_engine = 'blender'
supported_extensions = ['.blend']
@@ -31,7 +17,8 @@ class BlenderRenderWorker(BaseRenderWorker):
ignore_extensions=False, args=args)
self.engine = self.args.get('engine', 'BLENDER_EEVEE').upper()
self.export_format = self.args.get('export_format', 'JPEG')
self.export_format = self.args.get('export_format', None) or 'JPEG'
self.camera = self.args.get('camera', None)
self.frame = 0
self.render_all_frames = self.args.get('render_all_frames', False)
@@ -43,24 +30,34 @@ class BlenderRenderWorker(BaseRenderWorker):
self.time_remaining = None
self.frame_percent_complete = 0.0
def generate_preview(self, blend_file):
pass
@classmethod
def version(cls):
version = None
try:
render_path = cls.renderer_path()
if render_path:
ver_out = subprocess.check_output([render_path, '-v'])
version = ver_out.decode('utf-8').splitlines()[0].replace('Blender', '').strip()
except Exception as e:
logging.error(f'Failed to get {cls.renderer} version: {e}')
return version
def _generate_subprocess(self):
if self.export_format not in self.supported_export_formats:
raise ValueError("Unsupported format for Blender: {}".format(self.export_format))
cmd = [self.renderer_path(), '-b', self.input]
if self.camera:
cmd.extend(['--python-expr', f"import bpy;bpy.context.scene.camera = bpy.data.objects['{self.camera}'];"])
cmd.extend(['-E', self.engine, '-o', self.output, '-F', self.export_format])
# all frames or single
cmd.extend(['-a'] if self.render_all_frames else ['-f', str(self.frame)])
if self.render_all_frames:
cmd = [self.renderer_path(), '-b', self.input, '-E', self.engine, '-o', self.output,
'-F', self.export_format, '-a']
else:
cmd = [self.renderer_path(), '-b', self.input, '-E', self.engine, '-o', self.output,
'-F', self.export_format, '-f', str(self.frame)]
return cmd
def _parse_stdout(self, line):
import re
pattern = re.compile(
r'Fra:(?P<frame>\d*).*Mem:(?P<memory>\S+).*Time:(?P<time>\S+)(?:.*Remaining:)?(?P<remaining>\S*)')
found = pattern.search(line)
@@ -120,7 +117,8 @@ class BlenderRenderWorker(BaseRenderWorker):
def run_python_expression_in_blend(path, python_expression):
if os.path.exists(path):
try:
return subprocess.run(['blender', '-b', path, '--python-expr', python_expression], capture_output=True)
return subprocess.run([BlenderRenderWorker.renderer_path(), '-b', path, '--python-expr', python_expression],
capture_output=True)
except Exception as e:
logger.warning(f"Error running python expression in blender: {e}")
pass
@@ -155,6 +153,24 @@ def pack_blender_files(path):
return None
def get_cameras_in_scene(path):
cam_script = "import bpy;print('CAM:' + str([x.name + '@' + str(x.lens) for x in bpy.data.cameras]))"
try:
results = run_python_expression_in_blend(path, cam_script)
result_text = results.stdout.decode()
p = re.compile('CAM:\[(.*)\]')
match = p.search(result_text)
if match:
cameras = match.group(1).replace("'", "").split(",")
cameras = [{'name': x.split('@')[0].strip(), 'lens': x.split('@')[-1].strip()} for x in cameras]
return cameras
except Exception as e:
logger.error(f'Error getting file details for .blend file: {e}')
return None
if __name__ == '__main__':
# x = pack_blender_files('/Users/brett/Blender Files/temple_animatic.blend')