def update_render_status(self): Gdk.threads_enter() if mltxmlheadless.session_render_complete( self.get_container_program_id()) == True: self.remove_as_status_polling_object() job_proxy = self.get_completed_job_proxy() jobs.update_job_queue(job_proxy) GLib.idle_add(self.create_producer_and_do_update_edit, None) else: status = mltxmlheadless.get_session_status( self.get_container_program_id()) if status != None: fraction, elapsed = status if self.container_data.render_data.do_video_render == True: msg = _("Rendering Video") elif step == "2": msg = _("Rendering Image Sequence") job_proxy = self.get_job_proxy() job_proxy.progress = float(fraction) job_proxy.elapsed = float(elapsed) job_proxy.text = msg jobs.update_job_queue(job_proxy) else: pass # This can happen sometimes before gmicheadless.py has written a status message, we just do nothing here. Gdk.threads_leave()
def update_render_status(self): Gdk.threads_enter() if blenderheadless.session_render_complete(self.get_container_program_id()) == True: job_msg = self.get_completed_job_message() jobs.update_job_queue(job_msg) if self.render_type != PREVIEW_RENDER: GLib.idle_add(self.create_producer_and_do_update_edit, None) else: self.program_editor_window.preview_render_complete() else: status = blenderheadless.get_session_status(self.get_container_program_id()) if status != None: step, fraction, elapsed = status msg = _("Rendering Image Sequence") if self.render_type == PREVIEW_RENDER: msg = _("Rendering Preview") if step == "2": msg = _("Rendering Video") job_msg = self.get_job_queue_message() job_msg.progress = float(fraction) job_msg.elapsed = float(elapsed) job_msg.text = msg jobs.update_job_queue(job_msg) else: pass # This can happen sometimes before gmicheadless.py has written a status message, we just do nothing here. Gdk.threads_leave()
def update_render_status(self): Gdk.threads_enter() if gmicheadless.session_render_complete( self.get_container_program_id()) == True: self.remove_as_status_polling_object() job_proxy = self.get_completed_job_proxy() jobs.update_job_queue(job_proxy) GLib.idle_add(self.create_producer_and_do_update_edit, None) else: status = gmicheadless.get_session_status( self.get_container_program_id()) if status != None: step, frame, length, elapsed = status steps_count = 3 if self.container_data.render_data.do_video_render == False: steps_count = 2 msg = _("Step ") + str(step) + " / " + str(steps_count) + " - " if step == "1": msg += _("Writing Clip Frames") elif step == "2": msg += _("Rendering G'Mic Script") else: msg += _("Encoding Video") msg += " - " + self.get_job_name() job_proxy = self.get_job_proxy() if self.render_type == FULL_RENDER: job_proxy.progress = float(frame) / float(length) else: if step == "1": render_length = self.render_range_out - self.render_range_in frame = int(frame) - self.gmic_frame_offset else: render_length = self.render_range_out - self.render_range_in job_proxy.progress = float(frame) / float(render_length) if job_proxy.progress < 0.0: # hack to fix how gmiplayer.FramesRangeWriter works. # We would need to patch to g'mic tool to not need this but this is easier. job_proxy.progress = 1.0 if job_proxy.progress > 1.0: # hack to fix how progress is calculated in gmicheadless because producers can render a bit longer then required. job_proxy.progress = 1.0 job_proxy.elapsed = float(elapsed) job_proxy.text = msg jobs.update_job_queue(job_proxy) else: pass # This can happen sometimes before gmicheadless.py has written a status message, we just do nothing here. Gdk.threads_leave()
def _launch_render(self, clip, range_in, range_out, clip_start_offset): self.create_data_dirs_if_needed() self.render_range_in = range_in self.render_range_out = range_out self.clip_start_offset = clip_start_offset mltxmlheadless.clear_flag_files(self.get_container_program_id()) # We need data to be available for render process, # create video_render_data object with default values if not available. if self.container_data.render_data == None: self.container_data.render_data = toolsencoding.create_container_clip_default_render_data_object(current_sequence().profile) mltxmlheadless.set_render_data(self.get_container_program_id(), self.container_data.render_data) job_msg = self.get_job_queue_message() job_msg.text = _("Render Starting...") job_msg.status = jobs.RENDERING jobs.update_job_queue(job_msg) args = ("session_id:" + self.get_container_program_id(), "clip_path:" + str(self.container_data.unrendered_media), "range_in:" + str(range_in), "range_out:"+ str(range_out), "profile_desc:" + PROJECT().profile.description().replace(" ", "_"), "xml_file_path:" + str(self.container_data.unrendered_media)) # Create command list and launch process. command_list = [sys.executable] command_list.append(respaths.LAUNCH_DIR + "flowblademltxmlheadless") for arg in args: command_list.append(arg) subprocess.Popen(command_list)
def _launch_render(self, clip, range_in, range_out, clip_start_offset): self.create_data_dirs_if_needed() self.render_range_in = range_in self.render_range_out = range_out self.clip_start_offset = clip_start_offset mltxmlheadless.clear_flag_files(self.get_container_program_id()) # We need data to be available for render process, # create video_render_data object with default values if not available. if self.container_data.render_data == None: self.container_data.render_data = toolsencoding.create_container_clip_default_render_data_object( current_sequence().profile) mltxmlheadless.set_render_data(self.get_container_program_id(), self.container_data.render_data) job_msg = self.get_job_queue_message() job_msg.text = _("Render Starting...") job_msg.status = jobs.RENDERING jobs.update_job_queue(job_msg) args = ( "session_id:" + self.get_container_program_id(), "clip_path:" + str(self.container_data.unrendered_media).replace( " ", "\ " ), # This is going through Popen shell=True and needs escaped spaces. "range_in:" + str(range_in), "range_out:" + str(range_out), "profile_desc:" + PROJECT().profile.description().replace(" ", "_"), "xml_file_path:" + str(self.container_data.unrendered_media).replace(" ", "\ ") ) # This is going through Popen shell=True and needs escaped spaces. # Run with nice to lower priority if requested (currently hard coded to lower) nice_command = "nice -n " + str(10) + " " + str( respaths.LAUNCH_DIR + "flowblademltxmlheadless").replace( " ", "\ ") for arg in args: nice_command += " " nice_command += arg subprocess.Popen([nice_command], shell=True)
def _launch_render(self, clip, range_in, range_out, gmic_frame_offset): self.create_data_dirs_if_needed() self.render_range_in = range_in self.render_range_out = range_out self.gmic_frame_offset = gmic_frame_offset gmicheadless.clear_flag_files(self.get_container_program_id()) # We need data to be available for render process, # create video_render_data object with default values if not available. if self.container_data.render_data == None: self.container_data.render_data = toolsencoding.create_container_clip_default_render_data_object( current_sequence().profile) gmicheadless.set_render_data(self.get_container_program_id(), self.container_data.render_data) job_proxy = self.get_job_proxy() job_proxy.text = _("Render Starting..") job_proxy.status = jobs.RENDERING jobs.update_job_queue(job_proxy) args = ("session_id:" + self.get_container_program_id(), "script:" + self.container_data.program, "clip_path:" + self.container_data.unrendered_media, "range_in:" + str(range_in), "range_out:" + str(range_out), "profile_desc:" + PROJECT().profile.description().replace(" ", "_"), "gmic_frame_offset:" + str(gmic_frame_offset)) # Run with nice to lower priority if requested (currently hard coded to lower) nice_command = "nice -n " + str( 10) + " " + respaths.LAUNCH_DIR + "flowbladegmicheadless" for arg in args: nice_command += " " nice_command += arg subprocess.Popen([nice_command], shell=True)
def _launch_render(self, clip, range_in, range_out, clip_start_offset): self.create_data_dirs_if_needed() job_msg = self.get_job_queue_message() job_msg.text = _("Render Starting...") job_msg.status = jobs.RENDERING jobs.update_job_queue(job_msg) self.render_range_in = range_in self.render_range_out = range_out self.clip_start_offset = clip_start_offset blenderheadless.clear_flag_files(self.get_container_program_id()) # We need data to be available for render process, # create video_render_data object with default values if not available. if self.container_data.render_data == None: self.container_data.render_data = toolsencoding.create_container_clip_default_render_data_object( current_sequence().profile) # Make sure preview render does not try to create video clip. render_data = copy.deepcopy(self.container_data.render_data) if self.render_type == PREVIEW_RENDER: render_data.do_video_render = False render_data.is_preview_render = True blenderheadless.set_render_data(self.get_container_program_id(), render_data) # Write current render target container clip for blenderrendersetup.py cont_info_id_path = userfolders.get_cache_dir( ) + "blender_render_container_id" with atomicfile.AtomicFileWriter(cont_info_id_path, "w") as afw: outfile = afw.get_file() outfile.write(str(self.get_container_program_id())) # Write current render set up exec lines for blenderrendersetup.py if self.render_type != PREVIEW_RENDER: file_path_str = 'bpy.context.scene.render.filepath = "' + self.get_rendered_media_dir( ) + '/frame"' + NEWLINE else: file_path_str = 'bpy.context.scene.render.filepath = "' + self.get_preview_media_dir( ) + '/frame"' + NEWLINE if not os.path.exists(self.get_preview_media_dir()): os.mkdir(self.get_preview_media_dir()) render_exec_lines = file_path_str \ + 'bpy.context.scene.render.fps = 24' + NEWLINE \ + 'bpy.context.scene.render.image_settings.file_format = "PNG"' + NEWLINE \ + 'bpy.context.scene.render.image_settings.color_mode = "RGBA"' + NEWLINE \ + 'bpy.context.scene.render.film_transparent = 1' + NEWLINE \ + 'bpy.context.scene.render.resolution_x = '+ str(current_sequence().profile.width()) + NEWLINE \ + 'bpy.context.scene.render.resolution_y = ' + str(current_sequence().profile.height()) + NEWLINE \ + 'bpy.context.scene.render.resolution_percentage = 100' + NEWLINE \ + 'bpy.context.scene.frame_start = ' + str(range_in) + NEWLINE \ + 'bpy.context.scene.frame_end = ' + str(range_out) + NEWLINE render_exec_lines = self._write_exec_lines_for_obj_type( render_exec_lines, "objects") render_exec_lines = self._write_exec_lines_for_obj_type( render_exec_lines, "materials") render_exec_lines = self._write_exec_lines_for_obj_type( render_exec_lines, "curves") exec_lines_file_path = self.get_session_dir( ) + "/blender_render_exec_lines" with atomicfile.AtomicFileWriter(exec_lines_file_path, "w") as afw: outfile = afw.get_file() outfile.write(render_exec_lines) args = ( "session_id:" + self.get_container_program_id(), "project_path:" + utils.escape_shell_path( self.container_data.program ), #.replace(" ", "\ "), # This is going through Popen shell=True and needs escaped spaces. "range_in:" + str(range_in), "range_out:" + str(range_out), "profile_desc:" + PROJECT().profile.description().replace(" ", "_")) # Run with nice to lower priority if requested (currently hard coded to lower) nice_command = "nice -n " + str(10) + " " + str( respaths.LAUNCH_DIR + "flowbladeblenderheadless").replace( " ", "\ ") for arg in args: nice_command += " " nice_command += arg subprocess.Popen([nice_command], shell=True)
def _launch_render(self, clip, range_in, range_out, clip_start_offset): self.create_data_dirs_if_needed() job_proxy = self.get_job_proxy() job_proxy.text = _("Render Starting...") job_proxy.status = jobs.RENDERING jobs.update_job_queue(job_proxy) self.render_range_in = range_in self.render_range_out = range_out self.clip_start_offset = clip_start_offset blenderheadless.clear_flag_files(self.get_container_program_id()) # We need data to be available for render process, # create video_render_data object with default values if not available. if self.container_data.render_data == None: self.container_data.render_data = toolsencoding.create_container_clip_default_render_data_object( current_sequence().profile) blenderheadless.set_render_data(self.get_container_program_id(), self.container_data.render_data) # Write current render target container clip for blenderrendersetup.py cont_info_id_path = userfolders.get_cache_dir( ) + "blender_render_container_id" with atomicfile.AtomicFileWriter(cont_info_id_path, "w") as afw: outfile = afw.get_file() outfile.write(str(self.get_container_program_id())) # Write current render set up exec lines for blenderrendersetup.py render_exec_lines = 'bpy.context.scene.render.filepath = "' + self.get_rendered_media_dir() + '/frame"' + NEWLINE \ + 'bpy.context.scene.render.fps = 24' + NEWLINE \ + 'bpy.context.scene.render.image_settings.file_format = "PNG"' + NEWLINE \ + 'bpy.context.scene.render.image_settings.color_mode = "RGBA"' + NEWLINE \ + 'bpy.context.scene.render.film_transparent = 1' + NEWLINE \ + 'bpy.context.scene.render.resolution_x = '+ str(current_sequence().profile.width()) + NEWLINE \ + 'bpy.context.scene.render.resolution_y = ' + str(current_sequence().profile.height()) + NEWLINE \ + 'bpy.context.scene.render.resolution_percentage = 100' + NEWLINE \ + 'bpy.context.scene.frame_start = ' + str(range_in) + NEWLINE \ + 'bpy.context.scene.frame_end = ' + str(range_out) + NEWLINE objects = self.blender_objects() for obj in objects: # objects are [name, type, editorlist], see blenderprojectinit.py obj_name = obj[0] editor_lines = [] for editor_data in obj[2]: # editor_data is [prop_path, label, tooltip, editor_type, value], see containerprogramedit.EditorManagerWindow.get_current_editor_data() prop_path = editor_data[0] value = editor_data[4] render_exec_lines += 'obj = bpy.data.objects["' + obj_name + '"]' + NEWLINE render_exec_lines += 'obj.' + prop_path + " = " + value + NEWLINE exec_lines_file_path = self.get_session_dir( ) + "/blender_render_exec_lines" with atomicfile.AtomicFileWriter(exec_lines_file_path, "w") as afw: outfile = afw.get_file() outfile.write(render_exec_lines) args = ("session_id:" + self.get_container_program_id(), "project_path:" + self.container_data.program, "range_in:" + str(range_in), "range_out:" + str(range_out), "profile_desc:" + PROJECT().profile.description().replace(" ", "_")) # Run with nice to lower priority if requested (currently hard coded to lower) nice_command = "nice -n " + str( 10) + " " + respaths.LAUNCH_DIR + "flowbladeblenderheadless" for arg in args: nice_command += " " nice_command += arg subprocess.Popen([nice_command], shell=True)