From 8935c94101a1151b05f08f44a47b796a9b07235d Mon Sep 17 00:00:00 2001 From: "s.martinez" Date: Tue, 28 Nov 2023 14:40:14 +0100 Subject: [PATCH] feat: initial support for blender 4.0 It may inpact the userpresence, mesh bevel/crease attributes and shader node groups input/output socket --- multi_user/bl_types/bl_material.py | 51 ++++++++++++------------------ multi_user/bl_types/bl_mesh.py | 4 +-- multi_user/presence.py | 16 ++++------ 3 files changed, 30 insertions(+), 41 deletions(-) diff --git a/multi_user/bl_types/bl_material.py b/multi_user/bl_types/bl_material.py index f016277..6aee06a 100644 --- a/multi_user/bl_types/bl_material.py +++ b/multi_user/bl_types/bl_material.py @@ -245,9 +245,8 @@ def dump_node_tree(node_tree: bpy.types.ShaderNodeTree) -> dict: 'type': type(node_tree).__name__ } - for socket_id in ['inputs', 'outputs']: - socket_collection = getattr(node_tree, socket_id) - node_tree_data[socket_id] = dump_node_tree_sockets(socket_collection) + sockets = [item for item in node_tree.interface.items_tree if item.item_type == 'SOCKET'] + node_tree_data['interface'] = dump_node_tree_sockets(sockets) return node_tree_data @@ -263,18 +262,18 @@ def dump_node_tree_sockets(sockets: bpy.types.Collection) -> dict: """ sockets_data = [] for socket in sockets: - try: - socket_uuid = socket['uuid'] - except Exception: - socket_uuid = str(uuid4()) - socket['uuid'] = socket_uuid - - sockets_data.append((socket.name, socket.bl_socket_idname, socket_uuid)) + sockets_data.append( + ( + socket.name, + socket.socket_type, + socket.in_out + ) + ) return sockets_data -def load_node_tree_sockets(sockets: bpy.types.Collection, +def load_node_tree_sockets(interface: bpy.types.NodeTreeInterface, sockets_data: dict): """ load sockets of a shader_node_tree @@ -285,20 +284,17 @@ def load_node_tree_sockets(sockets: bpy.types.Collection, :arg socket_data: dumped socket data :type socket_data: dict """ - # Check for removed sockets - for socket in sockets: - if not [s for s in sockets_data if 'uuid' in socket and socket['uuid'] == s[2]]: - sockets.remove(socket) + # Remove old sockets + interface.clear() # Check for new sockets - for idx, socket_data in enumerate(sockets_data): - try: - checked_socket = sockets[idx] - if checked_socket.name != socket_data[0]: - checked_socket.name = socket_data[0] - except Exception: - s = sockets.new(socket_data[1], socket_data[0]) - s['uuid'] = socket_data[2] + for name, socket_type, in_out in sockets_data: + socket = interface.new_socket( + name, + in_out=in_out, + socket_type=socket_type + ) + def load_node_tree(node_tree_data: dict, target_node_tree: bpy.types.ShaderNodeTree) -> dict: @@ -315,13 +311,8 @@ def load_node_tree(node_tree_data: dict, target_node_tree: bpy.types.ShaderNodeT if not target_node_tree.is_property_readonly('name'): target_node_tree.name = node_tree_data['name'] - if 'inputs' in node_tree_data: - socket_collection = getattr(target_node_tree, 'inputs') - load_node_tree_sockets(socket_collection, node_tree_data['inputs']) - - if 'outputs' in node_tree_data: - socket_collection = getattr(target_node_tree, 'outputs') - load_node_tree_sockets(socket_collection, node_tree_data['outputs']) + if 'interface' in node_tree_data: + load_node_tree_sockets(target_node_tree.interface, node_tree_data['interface']) # Load nodes for node in node_tree_data["nodes"]: diff --git a/multi_user/bl_types/bl_mesh.py b/multi_user/bl_types/bl_mesh.py index 2b7e31a..8f49655 100644 --- a/multi_user/bl_types/bl_mesh.py +++ b/multi_user/bl_types/bl_mesh.py @@ -37,8 +37,8 @@ VERTICE = ['co'] EDGE = [ 'vertices', - 'crease', - 'bevel_weight', + # 'crease', + # 'bevel_weight', 'use_seam', 'use_edge_sharp', ] diff --git a/multi_user/presence.py b/multi_user/presence.py index 2da5096..00755a1 100644 --- a/multi_user/presence.py +++ b/multi_user/presence.py @@ -253,11 +253,9 @@ 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) - + gpu.state.blend_set('ALPHA') + gpu.state.depth_test_set('LESS_EQUAL') + gpu.state.line_width_set(2.0) def draw(self): """How to draw the widget @@ -300,7 +298,7 @@ class UserFrustumWidget(Widget): def draw(self): location = self.data.get('view_corners') - shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR') + shader = gpu.shader.from_builtin('UNIFORM_COLOR') positions = [tuple(coord) for coord in location] if len(positions) != 7: @@ -372,7 +370,7 @@ class UserSelectionWidget(Widget): vertex_pos += bbox_pos vertex_ind += bbox_ind - shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR') + shader = gpu.shader.from_builtin('UNIFORM_COLOR') batch = batch_for_shader( shader, 'LINES', @@ -421,7 +419,7 @@ class UserNameWidget(Widget): if coords: blf.position(0, coords[0], coords[1]+10, 0) - blf.size(0, 16, 72) + blf.size(0, 16) blf.color(0, color[0], color[1], color[2], color[3]) blf.draw(0, self.username) @@ -511,7 +509,7 @@ class SessionStatusWidget(Widget): vpos = (self.preferences.presence_hud_vpos*bpy.context.area.height)/100 blf.position(0, hpos, vpos, 0) - blf.size(0, int(text_scale*ui_scale), 72) + blf.size(0, int(text_scale*ui_scale)) blf.color(0, color[0], color[1], color[2], color[3]) blf.draw(0, state_str)