Render sequences

This commit is contained in:
ChristopheSeux
2024-03-14 17:44:05 +01:00
parent 688a06dffd
commit ac14fe5ba9
9 changed files with 237 additions and 91 deletions
+99 -47
View File
@@ -31,54 +31,83 @@ class VSETB_OT_render(Operator):
scn = context.scene
settings = get_scene_settings()
return context.window_manager.invoke_props_dialog(self, width=350)
return context.window_manager.invoke_props_dialog(self, width=500)
def draw_export_row(self, layout, text, data, enable_prop, template_prop):
row = layout.split(factor=0.1)
heading = row.row(align=True)
heading.alignment = 'RIGHT'
heading.label(text=text)
heading.prop(data, enable_prop, text='')
row = row.row(align=True)
row.enabled = getattr(data, enable_prop)
row.prop(data, template_prop, text='')
def draw(self, context):
scn = context.scene
settings = get_scene_settings()
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
#layout.use_property_split = True
#layout.use_property_decorate = False
box = layout.box()
col = box.column()
col.label(text='Single File')
#col.use_property_split = True
#col.use_property_decorate = False
row = col.row(align=True)
row.prop(settings.active_project, "render_single_file", text='')
row.label(icon='FILE_MOVIE')
row.label(text='Single File')
#col.prop(settings.active_project, "render_single_file")
row = col.row()
row.prop(settings.active_project, "render_video")
row = col.row()
row.enabled = settings.active_project.render_video
row.prop(settings.active_project, "render_video_template", text='Video Path')
if settings.active_project.render_single_file:
self.draw_export_row(col ,'Video', settings.active_project,
'render_video',
'render_video_template'
)
self.draw_export_row(col, 'Audio', settings.active_project,
'render_audio',
'render_audio_template'
)
#layout.separator()
box = layout.box()
col = box.column()
row = col.row(align=True)
row.prop(settings.active_project, "render_sequence", text='')
row.label(icon='SEQUENCE')
row.label(text='One file per sequence')
row = col.row()
row.prop(settings.active_project, "render_audio")
row = col.row()
row.enabled = settings.active_project.render_audio
row.prop(settings.active_project, "render_audio_template", text='Audio Path')
if settings.active_project.render_sequence:
self.draw_export_row(col ,'Video', settings.active_project,
'render_video_per_sequence',
'render_video_sequence_template'
)
self.draw_export_row(col, 'Audio', settings.active_project,
'render_audio_per_sequence',
'render_audio_sequence_template'
)
#col.prop(settings, 'channel', text='Channel')
#col.prop(self, 'selected_only')
#layout.separator()
box = layout.box()
col = box.column()
col.label(text='File per strip')
col.prop(settings.active_project, "render_video_per_strip", text='Render Video')
row = col.row()
row.enabled = settings.active_project.render_video_per_strip
row.prop(settings.active_project, "render_video_strip_template", text='Video Path')
col.prop(settings.active_project, "render_audio_per_strip", text='Render Audio')
row = col.row()
row.enabled = settings.active_project.render_audio_per_strip
row.prop(settings.active_project, "render_audio_strip_template", text='Audio Path')
#row.prop(settings.active_project, "render_sound_format", expand=True)
row = col.row(align=True)
row.prop(settings.active_project, "render_shot", text='')
row.label(icon='SEQ_SEQUENCER')
row.label(text='One file per shot')
if settings.active_project.render_shot:
self.draw_export_row(col ,'Video', settings.active_project,
'render_video_per_strip',
'render_video_strip_template'
)
self.draw_export_row(col, 'Audio', settings.active_project,
'render_audio_per_strip',
'render_audio_strip_template'
)
row = layout.row()
row.prop(settings.active_project, "render_selected_only", text='Selected Only')
#col.prop(settings, 'channel', text='Channel')
#col.prop(self, 'selected_only')
@@ -90,26 +119,49 @@ class VSETB_OT_render(Operator):
format_data = {**settings.format_data, **project.format_data}
start_time = time.perf_counter()
if project.render_video:
video_path = project.render_video_template.format(**format_data)
render_scene(video_path)
#background_render(output=video_path)
if project.render_single_file:
if project.render_video:
video_template = os.path.expandvars(project.render_video_template)
video_path = video_template.format(**format_data)
render_scene(video_path)
#background_render(output=video_path)
if project.render_audio:
audio_path = project.render_audio_template.format(**format_data)
bpy.ops.sound.mixdown(filepath=audio_path)
if project.render_audio:
audio_template = os.path.expandvars(project.render_audio_template)
audio_path = audio_template.format(**format_data)
bpy.ops.sound.mixdown(filepath=audio_path)
for strip in get_strips(channel='Shots', selected_only=True):
strip_settings = strip.vsetb_strip_settings
strip_data = {**format_data, **strip_settings.format_data}
if project.render_sequence:
print('Render Sequences...')
for strip in get_strips(channel='Sequences', selected_only=project.render_selected_only):
print(strip.name)
strip_settings = strip.vsetb_strip_settings
strip_data = {**format_data, **strip_settings.format_data}
if project.render_video_per_strip:
strip_render_path = project.render_video_strip_template.format(**strip_data)
render_strip(strip, strip_render_path)
if project.render_sequence and project.render_video_per_sequence:
video_sequence_template = os.path.expandvars(project.render_video_sequence_template)
sequence_render_path = video_sequence_template.format(**strip_data)
render_strip(strip, sequence_render_path)
if project.render_audio_per_strip:
audio_render_path = project.render_audio_strip_template.format(**strip_data)
render_sound(strip, audio_render_path)
if project.render_shot and project.render_audio_per_sequence:
audio_sequence_template = os.path.expandvars(project.render_audio_sequence_template)
audio_render_path = audio_sequence_template.format(**strip_data)
render_sound(strip, audio_render_path)
if project.render_shot:
for strip in get_strips(channel='Shots', selected_only=project.render_selected_only):
strip_settings = strip.vsetb_strip_settings
strip_data = {**format_data, **strip_settings.format_data}
if project.render_video_per_strip:
video_strip_template = os.path.expandvars(project.render_video_strip_template)
strip_render_path = video_strip_template.format(**strip_data)
render_strip(strip, strip_render_path)
if project.render_audio_per_strip:
audio_strip_template = os.path.expandvars(project.render_audio_strip_template)
audio_render_path = audio_strip_template.format(**strip_data)
render_sound(strip, audio_render_path)
self.report({"INFO"}, f'Strips rendered in {time.perf_counter()-start_time} seconds')
+13 -5
View File
@@ -147,6 +147,7 @@ class VSETB_OT_spreadsheet_from_file(Operator):
sheet = workbook.active
rows = [[(c.value or '') for c in r] for r in sheet.rows]
workbook.close()
else:
self.report({'ERROR'}, f'File extension {filepath.suffix} should be in [.csv, .xlsx]')
@@ -162,11 +163,15 @@ class VSETB_OT_spreadsheet_from_file(Operator):
cell = import_cells.add()
cell.name = cell_name
if cell_types.get(cell_name):
cell.import_name = cell_name
continue
matches = [(k, fuzzy_match(cell_name, k)) for k in cell_types.keys()]
best_name, best_match = max(matches, key=lambda x: x[1])
cell.import_name = best_name
cell.enabled = best_match > 0.75
cell.enabled = best_match > 0.85
project.spreadsheet_import.use_custom_cells = True
@@ -338,7 +343,7 @@ class VSETB_OT_import_spreadsheet(Operator):
spreadsheet = project.spreadsheet_import
sequencer = scn.sequence_editor.sequences
assets_missing = []
assets_missing = set()
# Import Edit
nb_frames_cell = next((c for c in spreadsheet.cells if c.import_name=='Nb Frames'), None)
@@ -371,7 +376,7 @@ class VSETB_OT_import_spreadsheet(Operator):
if spreadsheet.update_edit and (nb_frames_cell and nb_frames_cell.enabled):
nb_frames = int(cell_data['Nb Frames'])
print('Import Edit')
#print('Import Edit')
#print(frame_start, nb_frames, type(nb_frames))
frame_end = frame_start + nb_frames
@@ -464,12 +469,15 @@ class VSETB_OT_import_spreadsheet(Operator):
strip_settings.casting.update()
else:
assets_missing.append(asset_name)
assets_missing.add(f'{cell_name} / {asset_name}')
#print(f'Asset {asset_name} not found in Project for strip {strip.name}')
#self.report({'WARNING'}, f'Asset {asset_name} not found in Project for strip {strip.name}')
if assets_missing:
self.report({'WARNING'}, f'Some assets were missing {assets_missing[:5]}...')
print('Some assets were missing')
for asset in sorted(assets_missing):
print(asset)
self.report({'WARNING'}, f'Some assets were missing {list(assets_missing)[:5]}...')
return {"FINISHED"}
+9 -6
View File
@@ -1,6 +1,8 @@
import os
from os.path import expandvars
from pathlib import Path
from pprint import pprint
import bpy
from bpy.types import (Operator, )
@@ -159,6 +161,7 @@ class VSETB_OT_load_projects(Operator):
metadata_type = project.metadata_types.add()
metadata_type.name = metadata_data['name']
metadata_type.field_name = metadata_data['field_name']
metadata_type.data_type = metadata_data['data_type']
#metadata_type['choices'] = metadata_data['choices']
if prefs.sort_metadata_items:
@@ -345,7 +348,7 @@ class VSETB_OT_upload_to_tracker(Operator):
sequence_name = get_strip_sequence_name(strip)
shot_name = strip.name
sequence = tracker.get_sequence(sequence_name, episode=episode)
metadata = strip_settings.metadata.to_dict()
metadata = strip_settings.metadata.to_dict(use_name=False)
#print(metadata)
if not sequence:
@@ -365,7 +368,8 @@ class VSETB_OT_upload_to_tracker(Operator):
if self.add_preview:
strip_data = {**format_data, **strip_settings.format_data}
preview = project.render_video_strip_template.format(**strip_data)
preview_template = expandvars(project.render_video_strip_template)
preview = preview_template.format(**strip_data)
preview = Path(os.path.abspath(bpy.path.abspath(preview)))
#print(preview)
if not preview.exists():
@@ -382,7 +386,6 @@ class VSETB_OT_upload_to_tracker(Operator):
tracker.new_comment(task, comment=self.comment, status=status, preview=preview, set_main_preview=self.set_main_preview)
if self.custom_data:
metadata = strip_settings.metadata.to_dict()
description = strip_settings.description
tracker.update_data(shot, metadata, frames=strip.frame_final_duration, description=description)
@@ -391,13 +394,13 @@ class VSETB_OT_upload_to_tracker(Operator):
tracker.update_casting(shot, casting)
if self.tasks_comment:
for task_type in project.task_type:
for task_type in project.task_types:
task = getattr(strip_settings.tasks, task_type.name)
task = getattr(strip_settings.tasks, norm_name(task_type.name))
tracker_task = tracker.get_task(task_type.name, entity=shot)
if task.comment and tracker_task.get('last_comment') != task.comment:
tracker.new_comment(task, comment=task.comment)
tracker.new_comment(tracker_task, comment=task.comment)
return {"FINISHED"}