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()
Exemple #2
0
    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()
Exemple #4
0
    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)
Exemple #5
0
    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)
Exemple #7
0
    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)
Exemple #8
0
    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)