diff --git a/multi_user/__init__.py b/multi_user/__init__.py index c1bf38c..0f862d2 100644 --- a/multi_user/__init__.py +++ b/multi_user/__init__.py @@ -44,7 +44,7 @@ from . import environment DEPENDENCIES = { - ("replication", '0.1.19'), + ("replication", '0.1.20'), } diff --git a/multi_user/bl_types/bl_datablock.py b/multi_user/bl_types/bl_datablock.py index c016b4f..b33fe5d 100644 --- a/multi_user/bl_types/bl_datablock.py +++ b/multi_user/bl_types/bl_datablock.py @@ -137,16 +137,19 @@ class BlDatablock(ReplicatedDatablock): def resolve(self, construct = True): datablock_ref = None datablock_root = getattr(bpy.data, self.bl_id) - datablock_ref = utils.find_from_attr('uuid', self.uuid, datablock_root) + + try: + datablock_ref = datablock_root[self.data['name']] + except Exception: + pass if not datablock_ref: - try: - datablock_ref = datablock_root[self.data['name']] - except Exception: - if construct: - name = self.data.get('name') - logging.debug(f"Constructing {name}") - datablock_ref = self._construct(data=self.data) + datablock_ref = utils.find_from_attr('uuid', self.uuid, datablock_root) + + if construct and not datablock_ref: + name = self.data.get('name') + logging.debug(f"Constructing {name}") + datablock_ref = self._construct(data=self.data) if datablock_ref is not None: setattr(datablock_ref, 'uuid', self.uuid) diff --git a/multi_user/operators.py b/multi_user/operators.py index 942aea0..2f553f2 100644 --- a/multi_user/operators.py +++ b/multi_user/operators.py @@ -45,7 +45,7 @@ from bpy_extras.io_utils import ExportHelper, ImportHelper from replication.constants import (COMMITED, FETCHED, RP_COMMON, STATE_ACTIVE, STATE_INITIAL, STATE_SYNCING, UP) from replication.data import ReplicatedDataFactory -from replication.exception import NonAuthorizedOperationError +from replication.exception import NonAuthorizedOperationError, ContextError from replication.interface import session from . import bl_types, environment, timers, ui, utils @@ -93,8 +93,7 @@ def initialize_session(): for d in deleyables: d.register() - if settings.update_method == 'DEPSGRAPH': - bpy.app.handlers.depsgraph_update_post.append(depsgraph_evaluation) + bpy.app.handlers.depsgraph_update_post.append(depsgraph_evaluation) bpy.ops.session.apply_armature_operator('INVOKE_DEFAULT') @@ -119,9 +118,7 @@ def on_connection_end(reason="none"): stop_modal_executor = True - if settings.update_method == 'DEPSGRAPH': - bpy.app.handlers.depsgraph_update_post.remove( - depsgraph_evaluation) + bpy.app.handlers.depsgraph_update_post.remove(depsgraph_evaluation) # Step 3: remove file handled logger = logging.getLogger() @@ -151,7 +148,7 @@ class SessionStartOperator(bpy.types.Operator): runtime_settings = context.window_manager.session users = bpy.data.window_managers['WinMan'].online_users admin_pass = runtime_settings.password - use_extern_update = settings.update_method == 'DEPSGRAPH' + users.clear() deleyables.clear() @@ -203,12 +200,11 @@ class SessionStartOperator(bpy.types.Operator): automatic=type_local_config.auto_push, check_common=type_module_class.bl_check_common) - if settings.update_method == 'DEFAULT': - if type_local_config.bl_delay_apply > 0: - deleyables.append( - timers.ApplyTimer( - timeout=type_local_config.bl_delay_apply, - target_type=type_module_class)) + if type_local_config.bl_delay_apply > 0: + deleyables.append( + timers.ApplyTimer( + timeout=type_local_config.bl_delay_apply, + target_type=type_module_class)) if bpy.app.version[1] >= 91: python_binary_path = sys.executable @@ -218,11 +214,7 @@ class SessionStartOperator(bpy.types.Operator): session.configure( factory=bpy_factory, python_path=python_binary_path, - external_update_handling=use_extern_update) - - if settings.update_method == 'DEPSGRAPH': - deleyables.append(timers.ApplyTimer( - settings.depsgraph_update_rate/1000)) + external_update_handling=True) # Host a session if self.host: @@ -929,13 +921,14 @@ def sanitize_deps_graph(dummy): """ if session and session.state['STATE'] == STATE_ACTIVE: - session.lock_operations() - + # pass + # session.lock_operations() + start = utils.current_milli_time() for node_key in session.list(): node = session.get(node_key) node.resolve(construct=False) - - session.unlock_operations() + logging.debug(f"Sanitize took { utils.current_milli_time()-start}ms") + # session.unlock_operations() @@ -979,7 +972,19 @@ def depsgraph_evaluation(scene): not settings.sync_flags.sync_during_editmode: break - session.stash(node.uuid) + # session.stash(node.uuid) + if node.has_changed(): + try: + session.commit(node.uuid) + session.push(node.uuid) + except ReferenceError: + logging.debug(f"Reference error {node.uuid}") + if not node.is_valid(): + session.remove(node.uuid) + except ContextError as e: + logging.debug(e) + except Exception as e: + logging.error(e) else: # Distant update continue diff --git a/multi_user/preferences.py b/multi_user/preferences.py index 3a2d816..c248e89 100644 --- a/multi_user/preferences.py +++ b/multi_user/preferences.py @@ -199,15 +199,6 @@ class SessionPrefs(bpy.types.AddonPreferences): description='connection timeout before disconnection', default=1000 ) - update_method: bpy.props.EnumProperty( - name='update method', - description='replication update method', - items=[ - ('DEFAULT', "Default", "Default: Use threads to monitor databloc changes"), - ('DEPSGRAPH', "Depsgraph", - "Experimental: Use the blender dependency graph to trigger updates"), - ], - ) # Replication update settings depsgraph_update_rate: bpy.props.IntProperty( name='depsgraph update rate', @@ -390,9 +381,6 @@ class SessionPrefs(bpy.types.AddonPreferences): row = box.row() row.label(text="Init the session from:") row.prop(self, "init_method", text="") - row = box.row() - row.label(text="Update method:") - row.prop(self, "update_method", text="") table = box.box() table.row().prop( diff --git a/multi_user/ui.py b/multi_user/ui.py index bca2e0e..bf44a67 100644 --- a/multi_user/ui.py +++ b/multi_user/ui.py @@ -269,7 +269,6 @@ class SESSION_PT_advanced_settings(bpy.types.Panel): if settings.sidebar_advanced_rep_expanded: replication_section_row = replication_section.row() - replication_section_row.label(text="Sync flags", icon='COLLECTION_NEW') replication_section_row = replication_section.row() replication_section_row.prop(settings.sync_flags, "sync_render_settings") replication_section_row = replication_section.row() @@ -283,33 +282,6 @@ class SESSION_PT_advanced_settings(bpy.types.Panel): warning.label(text="Don't use this with heavy meshes !", icon='ERROR') replication_section_row = replication_section.row() - replication_section_row.label(text="Update method", icon='RECOVER_LAST') - replication_section_row = replication_section.row() - replication_section_row.prop(settings, "update_method", expand=True) - replication_section_row = replication_section.row() - replication_timers = replication_section_row.box() - replication_timers.label(text="Replication timers", icon='TIME') - if settings.update_method == "DEFAULT": - replication_timers = replication_timers.row() - # Replication frequencies - flow = replication_timers.grid_flow( - row_major=True, columns=0, even_columns=True, even_rows=False, align=True) - line = flow.row(align=True) - line.label(text=" ") - line.separator() - line.label(text="refresh (sec)") - line.label(text="apply (sec)") - - for item in settings.supported_datablocks: - line = flow.row(align=True) - line.prop(item, "auto_push", text="", icon=item.icon) - line.separator() - line.prop(item, "bl_delay_refresh", text="") - line.prop(item, "bl_delay_apply", text="") - else: - replication_timers = replication_timers.row() - replication_timers.label(text="Update rate (ms):") - replication_timers.prop(settings, "depsgraph_update_rate", text="") cache_section = layout.row().box() cache_section.prop(