diff --git a/multi_user/delayable.py b/multi_user/delayable.py index 78598d4..63b8ac8 100644 --- a/multi_user/delayable.py +++ b/multi_user/delayable.py @@ -214,11 +214,13 @@ class DrawClient(Draw): def execute(self): session = getattr(operators, 'client', None) renderer = getattr(presence, 'renderer', None) + prefs = utils.get_preferences() if session and renderer and session.state['STATE'] == STATE_ACTIVE: settings = bpy.context.window_manager.session users = session.online_users + # Update users for user in users.values(): metadata = user.get('metadata') color = metadata.get('color') @@ -237,10 +239,12 @@ class DrawClient(Draw): renderer.flush_selection() renderer.flush_users() + class ClientUpdate(Timer): - def __init__(self, timout=.5): + def __init__(self, timout=.016): super().__init__(timout) self.handle_quit = False + self.users_metadata = {} def execute(self): settings = utils.get_preferences() @@ -252,17 +256,34 @@ class ClientUpdate(Timer): if session.state['STATE'] == 0: bpy.ops.session.stop() - local_user = operators.client.online_users.get( - settings.username) + local_user = operators.client.online_users.get(settings.username) + if not local_user: return + else: + for username, user_data in operators.client.online_users.items(): + if username != settings.username: + cached_user_data = self.users_metadata.get(username) + new_user_data = operators.client.online_users[username]['metadata'] + + if cached_user_data is None: + self.users_metadata[username] = user_data['metadata'] + elif 'view_matrix' in cached_user_data and 'view_matrix' in new_user_data and cached_user_data['view_matrix'] != new_user_data['view_matrix']: + presence.refresh_3d_view() + self.users_metadata[username] = user_data['metadata'] + break + else: + self.users_metadata[username] = user_data['metadata'] local_user_metadata = local_user.get('metadata') - current_view_corners = presence.get_view_corners() scene_current = bpy.context.scene.name + local_user = session.online_users.get(settings.username) + current_view_corners = presence.get_view_corners() + + # Init client metadata if not local_user_metadata or 'color' not in local_user_metadata.keys(): metadata = { - 'view_corners': current_view_corners, + 'view_corners': presence.get_view_matrix(), 'view_matrix': presence.get_view_matrix(), 'color': (settings.client_color.r, settings.client_color.g, @@ -272,15 +293,16 @@ class ClientUpdate(Timer): 'scene_current': scene_current } session.update_user_metadata(metadata) - elif current_view_corners != local_user_metadata['view_corners']: - logger.info('update user metadata') + + # Update client representation + # Update client current scene + elif scene_current != local_user_metadata['scene_current']: + local_user_metadata['scene_current'] = scene_current + session.update_user_metadata(local_user_metadata) + elif 'view_corners' in local_user_metadata and current_view_corners != local_user_metadata['view_corners']: local_user_metadata['view_corners'] = current_view_corners local_user_metadata['view_matrix'] = presence.get_view_matrix() session.update_user_metadata(local_user_metadata) - elif scene_current != local_user_metadata['scene_current']: - local_user_metadata['scene_current'] = scene_current - session.update_user_metadata(local_user_metadata) - # sync online users session_users = operators.client.online_users ui_users = bpy.context.window_manager.online_users @@ -299,7 +321,9 @@ class ClientUpdate(Timer): new_key.username = user # TODO: event drivent 3d view refresh - presence.refresh_3d_view() + + + elif session.state['STATE'] == STATE_QUITTING: presence.refresh_3d_view() self.handle_quit = True