diff --git a/multi_user/presence.py b/multi_user/presence.py index bd789ca..f0c44f6 100644 --- a/multi_user/presence.py +++ b/multi_user/presence.py @@ -26,7 +26,7 @@ import bgl import blf import bpy import gpu -from mathutils import Vector, Matrix +from mathutils import Vector, Matrix, Quaternion from bpy_extras import view3d_utils from gpu_extras.batch import batch_for_shader from replication.constants import (STATE_ACTIVE, STATE_AUTH, STATE_CONFIG, @@ -278,9 +278,17 @@ class UserFrustumWidget(Widget): def draw(self): shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR') - - view_matrix = Matrix(self.data.get('view_matrix')).inverted() - coords = [view_matrix @ Vector(vertex) for vertex in self.camera_vertex] + xr_state = self.data.get('xr') + transformation = Matrix() + if xr_state: + loc = Vector(xr_state.get('viewer_pose_location')) + rot = Quaternion(xr_state.get('viewer_pose_rotation')) + scale = Vector((1,1,1)) + transformation = Matrix.LocRotScale(loc, rot, scale) + else: + transformation = Matrix(self.data.get('view_matrix')).inverted() + + coords = [transformation @ Vector(vertex) for vertex in self.camera_vertex] batch = batch_for_shader( shader, @@ -390,7 +398,13 @@ class UserNameWidget(Widget): self.settings.enable_presence def draw(self): - position = Matrix(self.data.get('view_matrix')).inverted().to_translation() + xr_state = self.data.get('xr') + + if xr_state: + position = xr_state.get('viewer_pose_location', [0,0,0]) + else: + position = Matrix(self.data.get('view_matrix')).inverted().to_translation() + color = self.data.get('color') coords = project_to_screen(position) diff --git a/multi_user/timers.py b/multi_user/timers.py index 3ff6e1c..09295dc 100644 --- a/multi_user/timers.py +++ b/multi_user/timers.py @@ -287,11 +287,13 @@ class ClientUpdate(Timer): 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']: + 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'] or \ + 'xr' in cached_user_data and \ + 'xr' in new_user_data and \ + cached_user_data['xr']['viewer_pose_location'] != new_user_data['xr']['viewer_pose_location']: refresh_3d_view() - viewer = new_user_data.get('xr') - if viewer: - logging.info(viewer) self.users_metadata[username] = user_data['metadata'] break else: @@ -386,7 +388,7 @@ class MainThreadExecutor(Timer): function(**kwargs) class XrUserUpdate(Timer): - def __init__(self, timeout=1): + def __init__(self, timeout=.01): # TODO: Add user refresh rate settings super().__init__(timeout)