From 87a3736b9dcc0da5c08d5ba21eaa2bdf05944c81 Mon Sep 17 00:00:00 2001 From: haiyimei Date: Wed, 14 Aug 2024 18:30:59 +0800 Subject: [PATCH] feat: Enable transparent background rendering in `sequence` --- src/XRFeitoriaUnreal/Content/Python/constants.py | 1 + .../Content/Python/custom_movie_pipeline.py | 7 +++++-- tests/unreal/sequence.py | 1 + xrfeitoria/data_structure/models.py | 4 ++++ xrfeitoria/renderer/renderer_unreal.py | 3 +++ xrfeitoria/sequence/sequence_unreal.py | 3 +++ xrfeitoria/sequence/sequence_unreal.pyi | 1 + 7 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/XRFeitoriaUnreal/Content/Python/constants.py b/src/XRFeitoriaUnreal/Content/Python/constants.py index 7499fa03..92a882a9 100644 --- a/src/XRFeitoriaUnreal/Content/Python/constants.py +++ b/src/XRFeitoriaUnreal/Content/Python/constants.py @@ -192,6 +192,7 @@ class AntiAliasSetting: console_variables: Dict[str, float] = field(default_factory=dict) anti_aliasing: AntiAliasSetting = AntiAliasSetting() export_audio: bool = False + export_transparent: bool = False def __post_init__(self): self.render_passes = [RenderPass(**rp) for rp in self.render_passes] diff --git a/src/XRFeitoriaUnreal/Content/Python/custom_movie_pipeline.py b/src/XRFeitoriaUnreal/Content/Python/custom_movie_pipeline.py index 30de1185..ca823e11 100644 --- a/src/XRFeitoriaUnreal/Content/Python/custom_movie_pipeline.py +++ b/src/XRFeitoriaUnreal/Content/Python/custom_movie_pipeline.py @@ -109,7 +109,7 @@ def set_export_audio(movie_preset: unreal.MoviePipelineMasterConfig) -> None: def add_render_passes( movie_preset: unreal.MoviePipelineMasterConfig, render_passes: List[RenderPass], - accumulator_includes_alpha: bool = True, + accumulator_includes_alpha: bool = False, ) -> None: """Add render passes to a movie preset. @@ -271,6 +271,7 @@ def create_movie_preset( anti_alias: RenderJobUnreal.AntiAliasSetting = RenderJobUnreal.AntiAliasSetting(), console_variables: Dict[str, float] = {'r.MotionBlurQuality': 0.0}, export_audio: bool = False, + export_transparent: bool = False, ) -> unreal.MoviePipelineMasterConfig: """ Create a movie preset from args. @@ -288,6 +289,7 @@ def create_movie_preset( anti_alias (dict): Anti-alias settings. console_variables (bool): Console variables. export_audio (bool): Whether to export audio. + export_transparent (bool): Whether to render with transparent background. Returns: unreal.MoviePipelineMasterConfig: The created movie preset. @@ -295,7 +297,7 @@ def create_movie_preset( movie_preset = unreal.MoviePipelineMasterConfig() - cls.add_render_passes(movie_preset, render_passes) + cls.add_render_passes(movie_preset, render_passes, accumulator_includes_alpha=export_transparent) cls.add_output_config(movie_preset, resolution, file_name_format, output_path) cls.add_anti_alias(movie_preset, anti_alias) cls.add_console_command(movie_preset, console_variables) @@ -387,6 +389,7 @@ def add_job_to_queue(cls, job: RenderJobUnreal) -> bool: anti_alias=job.anti_aliasing, console_variables=job.console_variables, export_audio=job.export_audio, + export_transparent=job.export_transparent, ) new_job.set_configuration(movie_preset) unreal.log(f'Added new job ({new_job.job_name}) to queue') diff --git a/tests/unreal/sequence.py b/tests/unreal/sequence.py index 37cb2a06..a3398ca6 100644 --- a/tests/unreal/sequence.py +++ b/tests/unreal/sequence.py @@ -85,6 +85,7 @@ def new_seq(xf_runner: XRFeitoriaUnreal, level_path: str, seq_name: str): render_passes=[RenderPass('img', 'png'), RenderPass('flow', 'exr'), RenderPass('lineart', 'png')], export_vertices=True, export_skeleton=True, + export_transparent=True, ) xf_runner.utils.save_current_level() diff --git a/xrfeitoria/data_structure/models.py b/xrfeitoria/data_structure/models.py index f2d337cb..4c5f071b 100644 --- a/xrfeitoria/data_structure/models.py +++ b/xrfeitoria/data_structure/models.py @@ -249,6 +249,10 @@ class AntiAliasSetting(BaseModel): default=AntiAliasSetting(), description='Anti aliasing setting of the render job.' ) export_audio: bool = Field(default=False, description='Whether to export audio of the render job.') + export_transparent: bool = Field( + default=False, + description='Whether to export transparent images of the render job. When enabled, it will reduce the performance.', + ) class Config: use_enum_values = True diff --git a/xrfeitoria/renderer/renderer_unreal.py b/xrfeitoria/renderer/renderer_unreal.py index 3b46e6e9..31302b74 100644 --- a/xrfeitoria/renderer/renderer_unreal.py +++ b/xrfeitoria/renderer/renderer_unreal.py @@ -42,6 +42,7 @@ def add_job( console_variables: Dict[str, float] = {'r.MotionBlurQuality': 0}, anti_aliasing: 'Optional[RenderJob.AntiAliasSetting]' = None, export_audio: bool = False, + export_transparent: bool = False, ) -> None: """Add a rendering job to the renderer queue. @@ -56,6 +57,7 @@ def add_job( Ref to :ref:`FAQ-console-variables` for details. anti_aliasing (Optional[RenderJobUnreal.AntiAliasSetting], optional): Anti aliasing setting. Defaults to None. export_audio (bool, optional): Whether to export audio. Defaults to False. + export_transparent (bool, optional): Whether to export transparent images. Defaults to False. When enabled, it will reduce the performance. Note: The motion blur is turned off by default. If you want to turn it on, please set ``r.MotionBlurQuality`` to a non-zero value in ``console_variables``. @@ -81,6 +83,7 @@ def add_job( console_variables=console_variables, anti_aliasing=anti_aliasing, export_audio=export_audio, + export_transparent=export_transparent, ) cls._add_job_in_engine(job.model_dump(mode='json')) cls.render_queue.append(job) diff --git a/xrfeitoria/sequence/sequence_unreal.py b/xrfeitoria/sequence/sequence_unreal.py index 5fba1654..fba25ee9 100644 --- a/xrfeitoria/sequence/sequence_unreal.py +++ b/xrfeitoria/sequence/sequence_unreal.py @@ -71,6 +71,7 @@ def add_to_renderer( export_vertices: bool = False, export_skeleton: bool = False, export_audio: bool = False, + export_transparent: bool = False, ) -> None: """Add the sequence to the renderer's job queue. Can only be called after the sequence is instantiated using @@ -90,6 +91,7 @@ def add_to_renderer( export_vertices (bool, optional): Whether to export vertices. Defaults to False. export_skeleton (bool, optional): Whether to export the skeleton. Defaults to False. export_audio (bool, optional): Whether to export audio. Defaults to False. + export_transparent (bool, optional): Whether to export transparent images. Defaults to False. When enabled, it will reduce the performance. Examples: >>> import xrfeitoria as xf @@ -125,6 +127,7 @@ def add_to_renderer( console_variables=console_variables, anti_aliasing=anti_aliasing, export_audio=export_audio, + export_transparent=export_transparent, ) logger.info( diff --git a/xrfeitoria/sequence/sequence_unreal.pyi b/xrfeitoria/sequence/sequence_unreal.pyi index c0b1381f..acd01597 100644 --- a/xrfeitoria/sequence/sequence_unreal.pyi +++ b/xrfeitoria/sequence/sequence_unreal.pyi @@ -37,6 +37,7 @@ class SequenceUnreal(SequenceBase): export_vertices: bool = False, export_skeleton: bool = False, export_audio: bool = False, + export_transparent: bool = False, ) -> None: ... @classmethod def spawn_actor(