diff --git a/multi_user/preferences.py b/multi_user/preferences.py index b1d993c..86e8b8d 100644 --- a/multi_user/preferences.py +++ b/multi_user/preferences.py @@ -538,6 +538,11 @@ class SessionProps(bpy.types.PropertyGroup): description='Enable user overlay ', default=True, ) + presence_show_mode: bpy.props.BoolProperty( + name="Show users current mode", + description='Enable user mode overlay ', + default=True, + ) presence_show_far_user: bpy.props.BoolProperty( name="Show users on different scenes", description="Show user on different scenes", diff --git a/multi_user/presence.py b/multi_user/presence.py index 5302f72..2825f9e 100644 --- a/multi_user/presence.py +++ b/multi_user/presence.py @@ -27,6 +27,7 @@ import blf import bpy import gpu import mathutils +# from mathutils import Vector from bpy_extras import view3d_utils from gpu_extras.batch import batch_for_shader from replication.constants import (STATE_ACTIVE, STATE_AUTH, STATE_CONFIG, @@ -251,6 +252,13 @@ class Widget(object): """ return True + def configure_bgl(self): + bgl.glLineWidth(2.) + bgl.glEnable(bgl.GL_DEPTH_TEST) + bgl.glEnable(bgl.GL_BLEND) + bgl.glEnable(bgl.GL_LINE_SMOOTH) + + def draw(self): """How to draw the widget """ @@ -304,11 +312,6 @@ class UserFrustumWidget(Widget): {"pos": positions}, indices=self.indices) - bgl.glLineWidth(2.) - bgl.glEnable(bgl.GL_DEPTH_TEST) - bgl.glEnable(bgl.GL_BLEND) - bgl.glEnable(bgl.GL_LINE_SMOOTH) - shader.bind() shader.uniform_float("color", self.data.get('color')) batch.draw(shader) @@ -408,7 +411,7 @@ class UserNameWidget(Widget): class UserModeWidget(Widget): draw_type = 'POST_PIXEL' - + def __init__( self, username): @@ -435,12 +438,19 @@ class UserModeWidget(Widget): mode_current == bpy.context.mode or self.settings.presence_show_far_user) and \ user_selection and \ - self.settings.presence_show_user and \ + self.settings.presence_show_mode and \ self.settings.enable_presence + + def draw(self): user_selection = self.data.get('selected_objects') + B = [1000,0] + A = [1000,0] + C = [1000,0] + + for select_obj in user_selection: obj = find_from_attr("uuid", select_obj, bpy.data.objects) if not obj: @@ -449,14 +459,30 @@ class UserModeWidget(Widget): vertex_pos, vertex_indices = bbox_from_obj(obj) mode_current = self.data.get('mode_current') color = self.data.get('color') - coords = project_to_screen(vertex_pos[1]) - if coords: - blf.position(0, coords[0], coords[1]+10, 0) + origin_coord = project_to_screen(obj.location) + + # A upper left corner + # B lower right corner + for vertex in range(len(vertex_pos)) : + coords = project_to_screen(vertex_pos[vertex]) + if coords[0] < A[0]: + A[0] = coords[0] + if coords[1] > A[1]: + A[1] = coords[1] + if coords[0] > B[0]: + B[0] = coords[0] + if coords[1] < B[1]: + B[1] = coords[1] + + + distance = math.sqrt((A[0]-B[0])**2 + (A[1]-B[1])**2) + + if distance > 950 and coords : + blf.position(0, origin_coord[0]+8, origin_coord[1]-15, 0) blf.size(0, 16, 72) blf.color(0, color[0], color[1], color[2], color[3]) - blf.draw(0, mode_current) - + blf.draw(0, mode_current) class SessionStatusWidget(Widget): draw_type = 'POST_PIXEL' @@ -539,6 +565,7 @@ class DrawFactory(object): try: for widget in self.widgets.values(): if widget.draw_type == 'POST_VIEW' and widget.poll(): + widget.configure_bgl() widget.draw() except Exception as e: logging.error( @@ -548,6 +575,7 @@ class DrawFactory(object): try: for widget in self.widgets.values(): if widget.draw_type == 'POST_PIXEL' and widget.poll(): + widget.configure_bgl() widget.draw() except Exception as e: logging.error( @@ -560,6 +588,7 @@ this.renderer = DrawFactory() def register(): this.renderer.register_handlers() + this.renderer.add_widget("session_status", SessionStatusWidget()) diff --git a/multi_user/timers.py b/multi_user/timers.py index 43d5261..185416d 100644 --- a/multi_user/timers.py +++ b/multi_user/timers.py @@ -354,6 +354,7 @@ class SessionUserSync(Timer): renderer.remove_widget(f"{user.username}_cam") renderer.remove_widget(f"{user.username}_select") renderer.remove_widget(f"{user.username}_name") + renderer.remove_widget(f"{user.username}_mode") ui_users.remove(index) break @@ -370,7 +371,7 @@ class SessionUserSync(Timer): renderer.add_widget( f"{user}_name", UserNameWidget(user)) renderer.add_widget( - f"{user}_name", UserModeWidget(user)) + f"{user}_mode", UserModeWidget(user)) class MainThreadExecutor(Timer): diff --git a/multi_user/ui.py b/multi_user/ui.py index 5e97f11..7b22766 100644 --- a/multi_user/ui.py +++ b/multi_user/ui.py @@ -107,7 +107,7 @@ class SESSION_PT_settings(bpy.types.Panel): row = row.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=True) row.prop(settings.sync_flags, "sync_render_settings",text="",icon_only=True, icon='SCENE') row.prop(settings.sync_flags, "sync_during_editmode", text="",icon_only=True, icon='EDITMODE_HLT') - row.prop(settings.sync_flags, "sync_active_camera", text="",icon_only=True, icon='OBJECT_DATAMODE') + row.prop(settings.sync_flags, "sync_active_camera", text="",icon_only=True, icon='VIEW_CAMERA') row= layout.row() @@ -345,6 +345,7 @@ class SESSION_PT_user(bpy.types.Panel): split.label(text="user") split = split.split(factor=0.5) split.label(text="location") + split.label(text="mode") split.label(text="frame") split.label(text="ping") @@ -383,6 +384,8 @@ class SESSION_UL_users(bpy.types.UIList): ping = '-' frame_current = '-' scene_current = '-' + mode_current = '-' + mode_icon = 'BLANK1' status_icon = 'BLANK1' if session: user = session.online_users.get(item.username) @@ -392,12 +395,44 @@ class SESSION_UL_users(bpy.types.UIList): if metadata and 'frame_current' in metadata: frame_current = str(metadata.get('frame_current','-')) scene_current = metadata.get('scene_current','-') + mode_current = metadata.get('mode_current','-') + if mode_current == "OBJECT" : + mode_icon = "OBJECT_DATAMODE" + elif mode_current == "EDIT_MESH" : + mode_icon = "EDITMODE_HLT" + elif mode_current == 'EDIT_CURVE': + mode_icon = "CURVE_DATA" + elif mode_current == 'EDIT_SURFACE': + mode_icon = "SURFACE_DATA" + elif mode_current == 'EDIT_TEXT': + mode_icon = "FILE_FONT" + elif mode_current == 'EDIT_ARMATURE': + mode_icon = "ARMATURE_DATA" + elif mode_current == 'EDIT_METABALL': + mode_icon = "META_BALL" + elif mode_current == 'EDIT_LATTICE': + mode_icon = "LATTICE_DATA" + elif mode_current == 'POSE': + mode_icon = "POSE_HLT" + elif mode_current == 'SCULPT': + mode_icon = "SCULPTMODE_HLT" + elif mode_current == 'PAINT_WEIGHT': + mode_icon = "WPAINT_HLT" + elif mode_current == 'PAINT_VERTEX': + mode_icon = "VPAINT_HLT" + elif mode_current == 'PAINT_TEXTURE': + mode_icon = "TPAINT_HLT" + elif mode_current == 'PARTICLE': + mode_icon = "PARTICLES" + elif mode_current == 'PAINT_GPENCIL' or mode_current =='EDIT_GPENCIL' or mode_current =='SCULPT_GPENCIL' or mode_current =='WEIGHT_GPENCIL' or mode_current =='VERTEX_GPENCIL': + mode_icon = "GREASEPENCIL" if user['admin']: status_icon = 'FAKE_USER_ON' split = layout.split(factor=0.35) split.label(text=item.username, icon=status_icon) split = split.split(factor=0.5) split.label(text=scene_current) + split.label(icon=mode_icon) split.label(text=frame_current) split.label(text=ping) @@ -425,20 +460,25 @@ class SESSION_PT_presence(bpy.types.Panel): settings = context.window_manager.session pref = get_preferences() layout.active = settings.enable_presence + + row = layout.row() + row = row.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=True) + row.prop(settings, "presence_show_selected",text="",icon_only=True, icon='CUBE') + row.prop(settings, "presence_show_user", text="",icon_only=True, icon='CAMERA_DATA') + row.prop(settings, "presence_show_mode", text="",icon_only=True, icon='OBJECT_DATAMODE') + row.prop(settings, "presence_show_far_user", text="",icon_only=True, icon='SCENE_DATA') + col = layout.column() col.prop(settings, "presence_show_session_status") - row = col.column() - row.active = settings.presence_show_session_status - row.prop(pref, "presence_hud_scale", expand=True) - row = col.column(align=True) - row.active = settings.presence_show_session_status - row.prop(pref, "presence_hud_hpos", expand=True) - row.prop(pref, "presence_hud_vpos", expand=True) - col.prop(settings, "presence_show_selected") - col.prop(settings, "presence_show_user") - row = layout.column() - row.active = settings.presence_show_user - row.prop(settings, "presence_show_far_user") + if settings.presence_show_session_status : + row = col.column() + row.active = settings.presence_show_session_status + row.prop(pref, "presence_hud_scale", expand=True) + row = col.column(align=True) + row.active = settings.presence_show_session_status + row.prop(pref, "presence_hud_hpos", expand=True) + row.prop(pref, "presence_hud_vpos", expand=True) + def draw_property(context, parent, property_uuid, level=0): settings = get_preferences() @@ -590,23 +630,27 @@ class VIEW3D_PT_overlay_session(bpy.types.Panel): def draw(self, context): layout = self.layout - view = context.space_data - overlay = view.overlay - display_all = overlay.show_overlays - - col = layout.column() - - row = col.row(align=True) settings = context.window_manager.session + pref = get_preferences() layout.active = settings.enable_presence + + row = layout.row() + row = row.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=True) + row.prop(settings, "presence_show_selected",text="",icon_only=True, icon='CUBE') + row.prop(settings, "presence_show_user", text="",icon_only=True, icon='CAMERA_DATA') + row.prop(settings, "presence_show_mode", text="",icon_only=True, icon='OBJECT_DATAMODE') + row.prop(settings, "presence_show_far_user", text="",icon_only=True, icon='SCENE_DATA') + col = layout.column() col.prop(settings, "presence_show_session_status") - col.prop(settings, "presence_show_selected") - col.prop(settings, "presence_show_user") - - row = layout.column() - row.active = settings.presence_show_user - row.prop(settings, "presence_show_far_user") + if settings.presence_show_session_status : + row = col.column() + row.active = settings.presence_show_session_status + row.prop(pref, "presence_hud_scale", expand=True) + row = col.column(align=True) + row.active = settings.presence_show_session_status + row.prop(pref, "presence_hud_hpos", expand=True) + row.prop(pref, "presence_hud_vpos", expand=True) classes = ( SESSION_UL_users,