diff --git a/multi_user/bl_types/bl_file.py b/multi_user/bl_types/bl_file.py index 406247e..2682077 100644 --- a/multi_user/bl_types/bl_file.py +++ b/multi_user/bl_types/bl_file.py @@ -34,10 +34,20 @@ def get_filepath(filename): """ Construct the local filepath """ - return os.path.join( + return str(Path( utils.get_preferences().cache_directory, filename - ) + )) + + +def ensure_unpacked(datablock): + if datablock.packed_file: + logging.info(f"Unpacking {datablock.name}") + + filename = Path(bpy.path.abspath(datablock.filepath)).name + datablock.filepath = get_filepath(filename) + + datablock.unpack(method="WRITE_ORIGINAL") class BlFile(ReplicatedDatablock): @@ -53,7 +63,6 @@ class BlFile(ReplicatedDatablock): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.instance = kwargs.get('instance', None) - # TODO: handle packed_file # TODO: ensure absolute path # TODO: ensure file exist @@ -62,12 +71,17 @@ class BlFile(ReplicatedDatablock): def resolve(self): # TODO: generic check - # Ensure local cache directory os.makedirs(self.preferences.cache_directory, exist_ok=True) if self.data: self.instance = Path(get_filepath(self.data['name'])) + def push(self, socket, identity=None): + super().push(socket, identity=None) + + if self.preferences.clear_memory_filecache: + del self.data['file'] + def _dump(self, instance=None): """ Read the file and return a dict as: @@ -102,16 +116,17 @@ class BlFile(ReplicatedDatablock): """ Writing the file """ - logging.info(f"Writing {data['name']} to {target}") - # TODO: check for empty data if target.exists() and not self.diff(): - logging.info("File already loaded, skipping.") + logging.info(f"{data['name']} already on the disk, skipping.") return try: file = open(target, "wb") - file.write() + file.write(data['file']) + + if self.preferences.clear_memory_filecache: + del self.data['file'] except IOError: logging.warning(f"{target} doesn't exist, skipping") else: diff --git a/multi_user/bl_types/bl_font.py b/multi_user/bl_types/bl_font.py index 7e81dce..157f9f2 100644 --- a/multi_user/bl_types/bl_font.py +++ b/multi_user/bl_types/bl_font.py @@ -23,7 +23,7 @@ from pathlib import Path import bpy from .bl_datablock import BlDatablock -from .bl_file import get_filepath +from .bl_file import get_filepath, ensure_unpacked from .dump_anything import Dumper, Loader @@ -59,6 +59,8 @@ class BlFont(BlDatablock): def _resolve_deps_implementation(self): deps = [] if self.instance.filepath and self.instance.filepath != '': + ensure_unpacked(self.instance) + deps.append(Path(self.instance.filepath)) return deps diff --git a/multi_user/bl_types/bl_image.py b/multi_user/bl_types/bl_image.py index 0f5b1fd..6026ca2 100644 --- a/multi_user/bl_types/bl_image.py +++ b/multi_user/bl_types/bl_image.py @@ -26,7 +26,7 @@ import mathutils from .. import utils from .bl_datablock import BlDatablock from .dump_anything import Dumper, Loader -from .bl_file import get_filepath +from .bl_file import get_filepath, ensure_unpacked format_to_ext = { 'BMP': 'bmp', @@ -65,23 +65,19 @@ class BlImage(BlDatablock): ) def _load(self, data, target): + loader = Loader() + loader.load(data, target) + target.source = 'FILE' target.filepath_raw = get_filepath(data['filename']) target.colorspace_settings.name = data["colorspace_settings"]["name"] - - loader = Loader() - loader.load(data, target) + def _dump(self, instance=None): assert(instance) filename = Path(instance.filepath).name - # Cache the image on the disk - if instance.source == "GENERATED" or instance.packed_file is not None: - instance.filepath = get_filepath(filename) - instance.save() - data = { "filename": filename } @@ -108,6 +104,20 @@ class BlImage(BlDatablock): def _resolve_deps_implementation(self): deps = [] if self.instance.filepath: + + if self.instance.packed_file: + filename = Path(bpy.path.abspath(self.instance.filepath)).name + self.instance.filepath = get_filepath(filename) + self.instance.save() + # An image can't be unpacked to the modified path + # TODO: make a bug report + self.instance.unpack(method="REMOVE") + + elif self.instance.source == "GENERATED": + filename = f"{self.instance.name}.png" + self.instance.filepath = get_filepath(filename) + self.instance.save() + deps.append(Path(self.instance.filepath)) return deps diff --git a/multi_user/bl_types/bl_sound.py b/multi_user/bl_types/bl_sound.py index 91b163b..93f3990 100644 --- a/multi_user/bl_types/bl_sound.py +++ b/multi_user/bl_types/bl_sound.py @@ -22,7 +22,7 @@ from pathlib import Path import bpy -from .bl_file import get_filepath +from .bl_file import get_filepath, ensure_unpacked from .bl_datablock import BlDatablock from .dump_anything import Dumper, Loader @@ -56,6 +56,8 @@ class BlSound(BlDatablock): def _resolve_deps_implementation(self): deps = [] if self.instance.filepath and self.instance.filepath != '': + ensure_unpacked(self.instance) + deps.append(Path(self.instance.filepath)) return deps diff --git a/multi_user/preferences.py b/multi_user/preferences.py index 90ec490..0af44c9 100644 --- a/multi_user/preferences.py +++ b/multi_user/preferences.py @@ -162,6 +162,11 @@ class SessionPrefs(bpy.types.AddonPreferences): description="Enable objects update in edit mode (! Impact performances !)", default=False ) + clear_memory_filecache: bpy.props.BoolProperty( + name="Clear memory filecache", + description="Remove filecache from memory", + default=False + ) # for UI category: bpy.props.EnumProperty( name="Category", @@ -230,6 +235,12 @@ class SessionPrefs(bpy.types.AddonPreferences): description="sidebar_advanced_net_expanded", default=False ) + sidebar_advanced_cache_expanded: bpy.props.BoolProperty( + name="sidebar_advanced_cache_expanded", + description="sidebar_advanced_cache_expanded", + default=False + ) + auto_check_update: bpy.props.BoolProperty( name="Auto-check for Update", description="If enabled, auto-check for updates using an interval", @@ -343,6 +354,7 @@ class SessionPrefs(bpy.types.AddonPreferences): emboss=False) if self.conf_session_cache_expanded: box.row().prop(self, "cache_directory", text="Cache directory") + box.row().prop(self, "clear_memory_filecache", text="Clear memory filecache") # INTERFACE SETTINGS box = grid.box() diff --git a/multi_user/ui.py b/multi_user/ui.py index ef79e9c..429cd57 100644 --- a/multi_user/ui.py +++ b/multi_user/ui.py @@ -356,6 +356,22 @@ class SESSION_PT_advanced_settings(bpy.types.Panel): replication_timers.label(text="Update rate (ms):") replication_timers.prop(settings, "depsgraph_update_rate", text="") + cache_section = layout.row().box() + cache_section.prop( + settings, + "sidebar_advanced_cache_expanded", + text="Cache", + icon=get_expanded_icon(settings.sidebar_advanced_cache_expanded), + emboss=False) + if settings.sidebar_advanced_cache_expanded: + cache_section_row = cache_section.row() + cache_section_row.label(text="Cache directory:") + cache_section_row = cache_section.row() + cache_section_row.prop(settings, "cache_directory", text="") + cache_section_row = cache_section.row() + cache_section_row.label(text="Clear memory filecache:") + cache_section_row.prop(settings, "clear_memory_filecache", text="") + log_section = layout.row().box() log_section.prop( settings,