diff --git a/multi_user/operators.py b/multi_user/operators.py index 491228f..6a3a1ee 100644 --- a/multi_user/operators.py +++ b/multi_user/operators.py @@ -59,16 +59,21 @@ from replication.repository import Repository from . import bl_types, environment, shared_data, timers, ui, utils from .handlers import on_scene_update, sanitize_deps_graph -from .presence import SessionStatusWidget, renderer, view3d_find, refresh_sidebar_view +from .presence import SessionStatusWidget, renderer, view3d_find, refresh_sidebar_view, bbox_from_obj from .timers import registry background_execution_queue = Queue() deleyables = [] stop_modal_executor = False -def loard_users(username, view_corners, radius=0.01, color=(1,1,1,0), intensity=10.0): + +def draw_user(username, metadata, radius=0.01, intensity=10.0): + view_corners = metadata.get('view_corners') + color = metadata.get('color', (1,1,1,0)) + objects = metadata.get('selected_objects', None) + user_collection = bpy.data.collections.new(username) - + # User Color user_mat = bpy.data.materials.new(username) user_mat.use_nodes = True @@ -78,8 +83,9 @@ def loard_users(username, view_corners, radius=0.01, color=(1,1,1,0), intensity= emission_node.inputs['Color'].default_value = color emission_node.inputs['Strength'].default_value = intensity - output_node = nodes['Material Output'] - user_mat.node_tree.links.new(emission_node.outputs['Emission'], output_node.inputs['Surface']) + output_node = nodes['Material Output'] + user_mat.node_tree.links.new( + emission_node.outputs['Emission'], output_node.inputs['Surface']) # Generate camera mesh camera_vertices = view_corners[:4] @@ -89,7 +95,6 @@ def loard_users(username, view_corners, radius=0.01, color=(1,1,1,0), intensity= frustum_bm = bmesh.new() frustum_bm.from_mesh(camera_mesh) - for p in camera_vertices: frustum_bm.verts.new(p) frustum_bm.verts.ensure_lookup_table() @@ -108,9 +113,9 @@ def loard_users(username, view_corners, radius=0.01, color=(1,1,1,0), intensity= frustum_bm.to_mesh(camera_mesh) frustum_bm.free() # free and prevent further access - camera_obj.modifiers.new("wireframe","SKIN") + camera_obj.modifiers.new("wireframe", "SKIN") camera_obj.data.skin_vertices[0].data[0].use_root = True - for v in camera_mesh.skin_vertices[0].data : + for v in camera_mesh.skin_vertices[0].data: v.radius = [radius, radius] camera_mesh.materials.append(user_mat) @@ -130,16 +135,47 @@ def loard_users(username, view_corners, radius=0.01, color=(1,1,1,0), intensity= sight_bm.edges.new((sight_bm.verts[0], sight_bm.verts[1])) sight_bm.edges.ensure_lookup_table() sight_bm.to_mesh(sight_mesh) - sight_bm.free() + sight_bm.free() - sight_obj.modifiers.new("wireframe","SKIN") + sight_obj.modifiers.new("wireframe", "SKIN") sight_obj.data.skin_vertices[0].data[0].use_root = True - for v in sight_mesh.skin_vertices[0].data : + for v in sight_mesh.skin_vertices[0].data: v.radius = [radius, radius] sight_mesh.materials.append(user_mat) user_collection.objects.link(sight_obj) + # Draw selected objects + if objects: + for o in list(objects): + instance = bl_types.bl_datablock.get_datablock_from_uuid(o, None) + if instance: + bbox_mesh = bpy.data.meshes.new(f"{instance.name}_bbox") + bbox_obj = bpy.data.objects.new( + f"{instance.name}_bbox", bbox_mesh) + bbox_verts, bbox_ind = bbox_from_obj(instance, index=0) + bbox_bm = bmesh.new() + bbox_bm.from_mesh(bbox_mesh) + + for p in bbox_verts: + bbox_bm.verts.new(p) + bbox_bm.verts.ensure_lookup_table() + + for e in bbox_ind: + bbox_bm.edges.new( + (bbox_bm.verts[e[0]], bbox_bm.verts[e[1]])) + + bbox_bm.to_mesh(bbox_mesh) + bbox_bm.free() + bpy.data.collections[username].objects.link(bbox_obj) + + bbox_obj.modifiers.new("wireframe", "SKIN") + bbox_obj.data.skin_vertices[0].data[0].use_root = True + for v in bbox_mesh.skin_vertices[0].data: + v.radius = [radius, radius] + + bbox_mesh.materials.append(user_mat) + bpy.context.scene.collection.children.link(user_collection) @@ -949,7 +985,7 @@ class SessionLoadSaveOperator(bpy.types.Operator, ImportHelper): user_skin_radius: bpy.props.FloatProperty( name="User radius", description="User skin radius", - default=0.01, + default=0.005, ) user_color_intensity: bpy.props.FloatProperty( name="User emission intensity", @@ -988,15 +1024,9 @@ class SessionLoadSaveOperator(bpy.types.Operator, ImportHelper): for username, user_data in users.items(): metadata = user_data['metadata'] - points = metadata.get('view_corners') - color = metadata.get('color', (1,1,1,0)) + if metadata: + draw_user(username, metadata, radius=self.user_skin_radius, intensity=self.user_color_intensity) - loard_users( - username, - points, - radius=self.user_skin_radius, - color=color, - intensity=self.user_color_intensity) return {'FINISHED'}