From 4f32b49ad34443a28f9c09c67746b17c3df73f87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Thu, 6 Dec 2018 15:46:54 +0100 Subject: [PATCH] Flamenco: Allow BAT-packing of only relative-path assets --- CHANGELOG.md | 5 ++++- blender_cloud/blender.py | 10 +++++++++ blender_cloud/flamenco/__init__.py | 11 +++++----- blender_cloud/flamenco/bat_interface.py | 8 +++++--- blender_cloud/project_specific.py | 27 ++++++++++++++++++++++--- requirements.txt | 2 +- 6 files changed, 50 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b98b93..2ffb713 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,13 +3,16 @@ ## Version 1.9.5 (in development) +- Requires Blender-Asset-Tracer 0.7 or newer. - Fix crashing Blender when running in background mode (e.g. without GUI). - Flamenco: Include extra job parameters to allow for encoding a video at the end of a render job that produced an image sequence. - Flamenco: Compress all blend files, and not just the one we save from Blender. - Requires BAT 0.5 or newer. - Flamenco: Store more info in the `jobinfo.json` file. This is mostly useful for debugging issues on the render farm, as now things like the exclusion filter and Manager settings are logged too. +- Flamenco: Allow BAT-packing of only those assets that are referred to by relative path (e.g. + a path starting with `//`). Assets with an absolute path are ignored, and assumed to be reachable + at the same path by the Workers. ## Version 1.9.4 (2018-11-01) diff --git a/blender_cloud/blender.py b/blender_cloud/blender.py index 4d3701c..04ebe4f 100644 --- a/blender_cloud/blender.py +++ b/blender_cloud/blender.py @@ -248,6 +248,15 @@ class BlenderCloudPreferences(AddonPreferences): soft_max=4, update=project_specific.store, ) + flamenco_relative_only = BoolProperty( + name='Relative Paths Only', + description='When enabled, only assets that are referred to with a relative path are ' + 'packed, and assets referred to by an absolute path are excluded from the ' + 'BAT pack. When disabled, all assets are packed.', + default=False, + update=project_specific.store, + ) + flamenco_open_browser_after_submit = BoolProperty( name='Open Browser after Submitting Job', description='When enabled, Blender will open a webbrowser', @@ -473,6 +482,7 @@ class BlenderCloudPreferences(AddonPreferences): path_box.label(text='Blend file is not in your project path, ' 'unable to give output path example.') + flamenco_box.prop(self, 'flamenco_relative_only') flamenco_box.prop(self, 'flamenco_open_browser_after_submit') diff --git a/blender_cloud/flamenco/__init__.py b/blender_cloud/flamenco/__init__.py index 9f7f7a2..773dd9b 100644 --- a/blender_cloud/flamenco/__init__.py +++ b/blender_cloud/flamenco/__init__.py @@ -87,10 +87,9 @@ def manager_updated(self: 'FlamencoManagerGroup', context): return with project_specific.mark_as_loading(): - for name in project_specific.FLAMENCO_PER_PROJECT_PER_MANAGER: - if name not in pppm: - continue - setattr(prefs, name, pppm[name]) + project_specific.update_preferences(prefs, + project_specific.FLAMENCO_PER_PROJECT_PER_MANAGER, + pppm) class FlamencoManagerGroup(PropertyGroup): @@ -422,6 +421,7 @@ class FLAMENCO_OT_render(async_loop.AsyncModalOperatorMixin, proj_abspath = bpy.path.abspath(prefs.cloud_project_local_path) projdir = Path(proj_abspath).resolve() exclusion_filter = (prefs.flamenco_exclude_filter or '').strip() + relative_only = prefs.flamenco_relative_only self.log.debug('outdir : %s', outdir) self.log.debug('projdir: %s', projdir) @@ -436,7 +436,8 @@ class FLAMENCO_OT_render(async_loop.AsyncModalOperatorMixin, try: outfile, missing_sources = await bat_interface.copy( - bpy.context, filepath, projdir, outdir, exclusion_filter) + bpy.context, filepath, projdir, outdir, exclusion_filter, + relative_only=relative_only) except bat_interface.FileTransferError as ex: self.log.error('Could not transfer %d files, starting with %s', len(ex.files_remaining), ex.files_remaining[0]) diff --git a/blender_cloud/flamenco/bat_interface.py b/blender_cloud/flamenco/bat_interface.py index e022a0e..0157ffd 100644 --- a/blender_cloud/flamenco/bat_interface.py +++ b/blender_cloud/flamenco/bat_interface.py @@ -10,7 +10,6 @@ import bpy from blender_asset_tracer import pack from blender_asset_tracer.pack import progress, transfer - log = logging.getLogger(__name__) _running_packer = None # type: pack.Packer @@ -97,7 +96,9 @@ async def copy(context, base_blendfile: pathlib.Path, project: pathlib.Path, target: pathlib.Path, - exclusion_filter: str) -> typing.Tuple[pathlib.Path, typing.Set[pathlib.Path]]: + exclusion_filter: str, + *, + relative_only: bool) -> typing.Tuple[pathlib.Path, typing.Set[pathlib.Path]]: """Use BAT🦇 to copy the given file and dependencies to the target location. :raises: FileTransferError if a file couldn't be transferred. @@ -109,7 +110,8 @@ async def copy(context, wm = bpy.context.window_manager - with pack.Packer(base_blendfile, project, target, compress=True) as packer: + with pack.Packer(base_blendfile, project, target, compress=True, relative_only=relative_only) \ + as packer: with _packer_lock: if exclusion_filter: packer.exclude(*exclusion_filter.split()) diff --git a/blender_cloud/project_specific.py b/blender_cloud/project_specific.py index 271b8ad..04be7cd 100644 --- a/blender_cloud/project_specific.py +++ b/blender_cloud/project_specific.py @@ -2,6 +2,7 @@ import contextlib import logging +import typing # Names of BlenderCloudPreferences properties that are both project-specific # and simple enough to store directly in a dict. @@ -16,6 +17,7 @@ FLAMENCO_PER_PROJECT_PER_MANAGER = ( 'flamenco_job_file_path', 'flamenco_job_output_path', 'flamenco_job_output_strip_components', + 'flamenco_relative_only', ) log = logging.getLogger(__name__) @@ -36,6 +38,27 @@ def mark_as_loading(): project_settings_loading -= 1 +def update_preferences(prefs, names_to_update: typing.Iterable[str], + new_values: typing.Mapping[str, typing.Any]): + for name in names_to_update: + if not hasattr(prefs, name): + log.debug('not setting %r, property cannot be found', name) + continue + + if name in new_values: + log.debug('setting %r = %r', name, new_values[name]) + setattr(prefs, name, new_values[name]) + else: + # The property wasn't stored, so set the default value instead. + bl_type, args = getattr(prefs.bl_rna, name) + log.debug('finding default value for %r', name) + if 'default' not in args: + log.debug('no default value for %r, not touching', name) + continue + log.debug('found default value for %r = %r', name, args['default']) + setattr(prefs, name, args['default']) + + def handle_project_update(_=None, _2=None): """Handles changing projects, which may cause extensions to be disabled/enabled. @@ -78,9 +101,7 @@ def handle_project_update(_=None, _2=None): log.debug('loading project-specific settings:\n%s', pformat(ps.to_dict())) # Restore simple properties. - for name in PROJECT_SPECIFIC_SIMPLE_PROPS: - if name in ps and hasattr(prefs, name): - setattr(prefs, name, ps[name]) + update_preferences(prefs, PROJECT_SPECIFIC_SIMPLE_PROPS, ps) # Restore Flamenco settings. prefs.flamenco_manager.available_managers = ps.get('flamenco_available_managers', []) diff --git a/requirements.txt b/requirements.txt index 7368d25..56daef7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ lockfile==0.12.2 pillarsdk==1.7.0 wheel==0.29.0 -blender-asset-tracer>=0.5 +blender-asset-tracer>=0.7 # Secondary requirements: asn1crypto==0.24.0