#!/usr/bin/env python3 import json import re try: from .base_worker import * except ImportError: from base_worker import * from ..render_engines.blender_engine import Blender class BlenderRenderWorker(BaseRenderWorker): engine = Blender def __init__(self, input_path, output_path, priority=2, args=None, owner=None, client=None, name=None): super(BlenderRenderWorker, self).__init__(input_path=input_path, output_path=output_path, args=args, client=client, priority=priority, owner=owner, name=name) # Args self.blender_engine = self.args.get('engine', 'BLENDER_EEVEE').upper() self.export_format = self.args.get('export_format', None) or 'JPEG' self.camera = self.args.get('camera', None) self.render_all_frames = self.args.get('render_all_frames', False) or \ '-a' in (self.args.get('raw', None) or "").split(' ') # Stats self.__frame_percent_complete = 0.0 # Scene Info self.scene_info = Blender.get_scene_info(input_path) self.total_frames = (int(self.scene_info.get('frame_end', 0)) - int(self.scene_info.get('frame_start', 0)) + 1) \ if self.render_all_frames else 1 self.current_frame = int(self.scene_info.get('frame_start', 0)) def generate_worker_subprocess(self): cmd = [self.engine.renderer_path()] if self.args.get('background', True): # optionally run render not in background cmd.append('-b') cmd.append(self.input_path) if self.camera: cmd.extend(['--python-expr', f"import bpy;bpy.context.scene.camera = bpy.data.objects['{self.camera}'];"]) cmd.extend(['-E', self.blender_engine, '-o', self.output_path, '-F', self.export_format]) # all frames or single cmd.extend(['-a'] if self.render_all_frames else ['-f', str(self.current_frame)]) # Convert raw args from string if available raw_args = self.get_raw_args() if raw_args: cmd.extend(raw_args) return cmd def _parse_stdout(self, line): pattern = re.compile( r'Fra:(?P\d*).*Mem:(?P\S+).*Time:(?P