From 761fa26ed7b1823dd4dc3951ea3eeb127505a94f Mon Sep 17 00:00:00 2001 From: Swann Martinez Date: Wed, 11 Nov 2020 19:31:06 +0000 Subject: [PATCH] Revert "Merge branch '45-vse-support' into 'master'" This reverts merge request !68 --- README.md | 3 +- .../img/quickstart_presence.png | Bin 12306 -> 9891 bytes .../getting_started/img/quickstart_status.png | Bin 71856 -> 0 bytes docs/getting_started/quickstart.rst | 8 - multi_user/__init__.py | 4 +- multi_user/bl_types/__init__.py | 4 +- multi_user/bl_types/bl_action.py | 13 +- multi_user/bl_types/bl_camera.py | 11 +- multi_user/bl_types/bl_collection.py | 18 +- multi_user/bl_types/bl_datablock.py | 12 +- multi_user/bl_types/bl_material.py | 203 +++++------------- multi_user/bl_types/bl_mesh.py | 22 +- multi_user/bl_types/bl_node_group.py | 47 ---- multi_user/bl_types/bl_object.py | 9 +- multi_user/bl_types/bl_scene.py | 49 ++--- multi_user/bl_types/bl_sequencer.py | 197 ----------------- multi_user/bl_types/bl_world.py | 26 ++- multi_user/delayable.py | 21 +- multi_user/environment.py | 3 - multi_user/operators.py | 9 +- multi_user/preferences.py | 48 +---- multi_user/presence.py | 62 +++--- multi_user/ui.py | 10 +- multi_user/utils.py | 4 +- 24 files changed, 183 insertions(+), 600 deletions(-) delete mode 100644 docs/getting_started/img/quickstart_status.png delete mode 100644 multi_user/bl_types/bl_node_group.py delete mode 100644 multi_user/bl_types/bl_sequencer.py diff --git a/README.md b/README.md index fdc5a78..80525cb 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,6 @@ Currently, not all data-block are supported for replication over the wire. The f | image | ✔️ | | | mesh | ✔️ | | | material | ✔️ | | -| node_groups | ❗ | Material only | | metaball | ✔️ | | | object | ✔️ | | | texts | ✔️ | | @@ -49,7 +48,7 @@ Currently, not all data-block are supported for replication over the wire. The f | volumes | ❌ | | | particles | ❌ | [On-going](https://gitlab.com/slumber/multi-user/-/issues/24) | | speakers | ❗ | [Partial](https://gitlab.com/slumber/multi-user/-/issues/65) | -| vse | ❗ | Mask and Clip not supported yet | +| vse | ❌ | [Planned](https://gitlab.com/slumber/multi-user/-/issues/45) | | physics | ❌ | [Planned](https://gitlab.com/slumber/multi-user/-/issues/45) | | libraries | ❗ | Partial | diff --git a/docs/getting_started/img/quickstart_presence.png b/docs/getting_started/img/quickstart_presence.png index cc39bb0bcb2d2d866a672ef70aaebe574d86cf3d..771ca9fb16371800047a9c889e6161fb0fd29916 100644 GIT binary patch literal 9891 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 literal 12306 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 diff --git a/docs/getting_started/img/quickstart_status.png b/docs/getting_started/img/quickstart_status.png deleted file mode 100644 index 0a66d56bfd7c2a0bea8c182f514408e6d8ff0650..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71856 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

LT_uw~N3*Z5t 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 Sidebar > Multi-User tab", @@ -44,7 +44,7 @@ from . import environment DEPENDENCIES = { - ("replication", '0.1.9'), + ("replication", '0.1.3'), } diff --git a/multi_user/bl_types/__init__.py b/multi_user/bl_types/__init__.py index 07a07f1..add7058 100644 --- a/multi_user/bl_types/__init__.py +++ b/multi_user/bl_types/__init__.py @@ -37,9 +37,7 @@ __all__ = [ 'bl_speaker', 'bl_font', 'bl_sound', - 'bl_file', - 'bl_sequencer', - 'bl_node_group' + 'bl_file' ] # Order here defines execution order from . import * diff --git a/multi_user/bl_types/bl_action.py b/multi_user/bl_types/bl_action.py index 253a13e..15d3622 100644 --- a/multi_user/bl_types/bl_action.py +++ b/multi_user/bl_types/bl_action.py @@ -42,7 +42,7 @@ KEYFRAME = [ ] -def dump_fcurve(fcurve: bpy.types.FCurve, use_numpy: bool = True) -> dict: +def dump_fcurve(fcurve: bpy.types.FCurve, use_numpy:bool =True) -> dict: """ Dump a sigle curve to a dict :arg fcurve: fcurve to dump @@ -59,7 +59,7 @@ def dump_fcurve(fcurve: bpy.types.FCurve, use_numpy: bool = True) -> dict: if use_numpy: points = fcurve.keyframe_points - fcurve_data['keyframes_count'] = len(fcurve.keyframe_points) + fcurve_data['keyframes_count'] = len(fcurve.keyframe_points) fcurve_data['keyframe_points'] = np_dump_collection(points, KEYFRAME) else: # Legacy method @@ -92,8 +92,7 @@ def load_fcurve(fcurve_data, fcurve): if use_numpy: keyframe_points.add(fcurve_data['keyframes_count']) - np_load_collection( - fcurve_data["keyframe_points"], keyframe_points, KEYFRAME) + np_load_collection(fcurve_data["keyframe_points"], keyframe_points, KEYFRAME) else: # paste dumped keyframes @@ -154,11 +153,7 @@ class BlAction(BlDatablock): dumped_data_path, index=dumped_array_index) load_fcurve(dumped_fcurve, fcurve) - - id_root = data.get('id_root') - - if id_root: - target.id_root = id_root + target.id_root = data['id_root'] def _dump_implementation(self, data, instance=None): dumper = Dumper() diff --git a/multi_user/bl_types/bl_camera.py b/multi_user/bl_types/bl_camera.py index 22f58ae..e65b85a 100644 --- a/multi_user/bl_types/bl_camera.py +++ b/multi_user/bl_types/bl_camera.py @@ -48,15 +48,12 @@ class BlCamera(BlDatablock): background_images = data.get('background_images') - target.background_images.clear() - if background_images: + target.background_images.clear() for img_name, img_data in background_images.items(): - img_id = img_data.get('image') - if img_id: - target_img = target.background_images.new() - target_img.image = bpy.data.images[img_id] - loader.load(target_img, img_data) + target_img = target.background_images.new() + target_img.image = bpy.data.images[img_name] + loader.load(target_img, img_data) def _dump_implementation(self, data, instance=None): assert(instance) diff --git a/multi_user/bl_types/bl_collection.py b/multi_user/bl_types/bl_collection.py index 12b4948..542f49f 100644 --- a/multi_user/bl_types/bl_collection.py +++ b/multi_user/bl_types/bl_collection.py @@ -71,15 +71,6 @@ def load_collection_childrens(dumped_childrens, collection): if child_collection.uuid not in dumped_childrens: collection.children.unlink(child_collection) -def resolve_collection_dependencies(collection): - deps = [] - - for child in collection.children: - deps.append(child) - for object in collection.objects: - deps.append(object) - - return deps class BlCollection(BlDatablock): bl_id = "collections" @@ -133,4 +124,11 @@ class BlCollection(BlDatablock): return data def _resolve_deps_implementation(self): - return resolve_collection_dependencies(self.instance) + deps = [] + + for child in self.instance.children: + deps.append(child) + for object in self.instance.objects: + deps.append(object) + + return deps diff --git a/multi_user/bl_types/bl_datablock.py b/multi_user/bl_types/bl_datablock.py index c75fc20..c7996e3 100644 --- a/multi_user/bl_types/bl_datablock.py +++ b/multi_user/bl_types/bl_datablock.py @@ -21,7 +21,7 @@ from collections.abc import Iterable import bpy import mathutils -from replication.constants import DIFF_BINARY, DIFF_JSON, UP +from replication.constants import DIFF_BINARY, UP from replication.data import ReplicatedDatablock from .. import utils @@ -92,6 +92,7 @@ def load_driver(target_datablock, src_driver): def get_datablock_from_uuid(uuid, default, ignore=[]): if not uuid: return default + for category in dir(bpy.data): root = getattr(bpy.data, category) if isinstance(root, Iterable) and category not in ignore: @@ -122,15 +123,12 @@ class BlDatablock(ReplicatedDatablock): # TODO: use is_library_indirect self.is_library = (instance and hasattr(instance, 'library') and instance.library) or \ - (hasattr(self,'data') and self.data and 'library' in self.data) + (self.data and 'library' in self.data) if instance and hasattr(instance, 'uuid'): instance.uuid = self.uuid - if logging.getLogger().level == logging.DEBUG: - self.diff_method = DIFF_JSON - else: - self.diff_method = DIFF_BINARY + self.diff_method = DIFF_BINARY def resolve(self): datablock_ref = None @@ -219,7 +217,7 @@ class BlDatablock(ReplicatedDatablock): if not self.is_library: dependencies.extend(self._resolve_deps_implementation()) - logging.debug(f"{self.instance} dependencies: {dependencies}") + logging.debug(f"{self.instance.name} dependencies: {dependencies}") return dependencies def _resolve_deps_implementation(self): diff --git a/multi_user/bl_types/bl_material.py b/multi_user/bl_types/bl_material.py index 080c515..81fc6b5 100644 --- a/multi_user/bl_types/bl_material.py +++ b/multi_user/bl_types/bl_material.py @@ -21,8 +21,6 @@ import mathutils import logging import re -from uuid import uuid4 - from .dump_anything import Loader, Dumper from .bl_datablock import BlDatablock, get_datablock_from_uuid @@ -39,34 +37,28 @@ def load_node(node_data, node_tree): """ loader = Loader() target_node = node_tree.nodes.new(type=node_data["bl_idname"]) - target_node.select = False + loader.load(target_node, node_data) image_uuid = node_data.get('image_uuid', None) - node_tree_uuid = node_data.get('node_tree_uuid', None) if image_uuid and not target_node.image: target_node.image = get_datablock_from_uuid(image_uuid, None) - if node_tree_uuid: - target_node.node_tree = get_datablock_from_uuid(node_tree_uuid, None) + for input in node_data["inputs"]: + if hasattr(target_node.inputs[input], "default_value"): + try: + target_node.inputs[input].default_value = node_data["inputs"][input]["default_value"] + except: + logging.error( + f"Material {input} parameter not supported, skipping") - inputs = node_data.get('inputs') - if inputs: - for idx, inpt in enumerate(inputs): - if hasattr(target_node.inputs[idx], "default_value"): - try: - target_node.inputs[idx].default_value = inpt["default_value"] - except: - logging.error(f"Material input {inpt.keys()} parameter not supported, skipping") - - outputs = node_data.get('outputs') - if outputs: - for idx, output in enumerate(outputs): - if hasattr(target_node.outputs[idx], "default_value"): - try: - target_node.outputs[idx].default_value = output["default_value"] - except: - logging.error(f"Material output {output.keys()} parameter not supported, skipping") + for output in node_data["outputs"]: + if hasattr(target_node.outputs[output], "default_value"): + try: + target_node.outputs[output].default_value = node_data["outputs"][output]["default_value"] + except: + logging.error( + f"Material {output} parameter not supported, skipping") def load_links(links_data, node_tree): @@ -150,20 +142,24 @@ def dump_node(node): dumped_node = node_dumper.dump(node) if hasattr(node, 'inputs'): - dumped_node['inputs'] = [] + dumped_node['inputs'] = {} - io_dumper = Dumper() - io_dumper.depth = 2 - io_dumper.include_filter = ["default_value"] + for i in node.inputs: + input_dumper = Dumper() + input_dumper.depth = 2 + input_dumper.include_filter = ["default_value"] - for idx, inpt in enumerate(node.inputs): - if hasattr(inpt, 'default_value'): - dumped_node['inputs'].append(io_dumper.dump(inpt)) + if hasattr(i, 'default_value'): + dumped_node['inputs'][i.name] = input_dumper.dump(i) - dumped_node['outputs'] = [] - for idx, output in enumerate(node.outputs): - if hasattr(output, 'default_value'): - dumped_node['outputs'].append(io_dumper.dump(output)) + dumped_node['outputs'] = {} + for i in node.outputs: + output_dumper = Dumper() + output_dumper.depth = 2 + output_dumper.include_filter = ["default_value"] + + if hasattr(i, 'default_value'): + dumped_node['outputs'][i.name] = output_dumper.dump(i) if hasattr(node, 'color_ramp'): ramp_dumper = Dumper() @@ -186,126 +182,13 @@ def dump_node(node): dumped_node['mapping'] = curve_dumper.dump(node.mapping) if hasattr(node, 'image') and getattr(node, 'image'): dumped_node['image_uuid'] = node.image.uuid - if hasattr(node, 'node_tree') and getattr(node, 'node_tree'): - dumped_node['node_tree_uuid'] = node.node_tree.uuid return dumped_node -def dump_shader_node_tree(node_tree: bpy.types.ShaderNodeTree) -> dict: - """ Dump a shader node_tree to a dict including links and nodes - - :arg node_tree: dumped shader node tree - :type node_tree: bpy.types.ShaderNodeTree - :return: dict - """ - node_tree_data = { - 'nodes': {node.name: dump_node(node) for node in node_tree.nodes}, - 'links': dump_links(node_tree.links), - 'name': node_tree.name, - '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) - - return node_tree_data - - -def dump_node_tree_sockets(sockets: bpy.types.Collection)->dict: - """ dump sockets of a shader_node_tree - - :arg target_node_tree: target node_tree - :type target_node_tree: bpy.types.NodeTree - :arg socket_id: socket identifer - :type socket_id: str - :return: 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)) - - return sockets_data - -def load_node_tree_sockets(sockets: bpy.types.Collection, - sockets_data: dict): - """ load sockets of a shader_node_tree - - :arg target_node_tree: target node_tree - :type target_node_tree: bpy.types.NodeTree - :arg socket_id: socket identifer - :type socket_id: str - :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 socket['uuid'] == s[2]]: - sockets.remove(socket) - - # 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] - - -def load_shader_node_tree(node_tree_data:dict, target_node_tree:bpy.types.ShaderNodeTree)->dict: - """Load a shader node_tree from dumped data - - :arg node_tree_data: dumped node data - :type node_tree_data: dict - :arg target_node_tree: target node_tree - :type target_node_tree: bpy.types.NodeTree - """ - # TODO: load only required nodes - target_node_tree.nodes.clear() - - 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']) - - # Load nodes - for node in node_tree_data["nodes"]: - load_node(node_tree_data["nodes"][node], target_node_tree) - - # TODO: load only required nodes links - # Load nodes links - target_node_tree.links.clear() - - load_links(node_tree_data["links"], target_node_tree) - - def get_node_tree_dependencies(node_tree: bpy.types.NodeTree) -> list: has_image = lambda node : (node.type in ['TEX_IMAGE', 'TEX_ENVIRONMENT'] and node.image) - has_node_group = lambda node : (hasattr(node,'node_tree') and node.node_tree) - deps = [] - - for node in node_tree.nodes: - if has_image(node): - deps.append(node.image) - elif has_node_group(node): - deps.append(node.node_tree) - - return deps + return [node.image for node in node_tree.nodes if has_image(node)] class BlMaterial(BlDatablock): @@ -336,7 +219,16 @@ class BlMaterial(BlDatablock): if target.node_tree is None: target.use_nodes = True - load_shader_node_tree(data['node_tree'], target.node_tree) + target.node_tree.nodes.clear() + + # Load nodes + for node in data["node_tree"]["nodes"]: + load_node(data["node_tree"]["nodes"][node], target.node_tree) + + # Load nodes links + target.node_tree.links.clear() + + load_links(data["node_tree"]["links"], target.node_tree) def _dump_implementation(self, data, instance=None): assert(instance) @@ -367,7 +259,15 @@ class BlMaterial(BlDatablock): ] data = mat_dumper.dump(instance) - if instance.is_grease_pencil: + if instance.use_nodes: + nodes = {} + data["node_tree"] = {} + for node in instance.node_tree.nodes: + nodes[node.name] = dump_node(node) + data["node_tree"]['nodes'] = nodes + + data["node_tree"]["links"] = dump_links(instance.node_tree.links) + elif instance.is_grease_pencil: gp_mat_dumper = Dumper() gp_mat_dumper.depth = 3 @@ -399,9 +299,6 @@ class BlMaterial(BlDatablock): # 'fill_image', ] data['grease_pencil'] = gp_mat_dumper.dump(instance.grease_pencil) - elif instance.use_nodes: - data['node_tree'] = dump_shader_node_tree(instance.node_tree) - return data def _resolve_deps_implementation(self): diff --git a/multi_user/bl_types/bl_mesh.py b/multi_user/bl_types/bl_mesh.py index 70546b7..7ee32d5 100644 --- a/multi_user/bl_types/bl_mesh.py +++ b/multi_user/bl_types/bl_mesh.py @@ -25,7 +25,7 @@ import numpy as np from .dump_anything import Dumper, Loader, np_load_collection_primitives, np_dump_collection_primitive, np_load_collection, np_dump_collection from replication.constants import DIFF_BINARY from replication.exception import ContextError -from .bl_datablock import BlDatablock, get_datablock_from_uuid +from .bl_datablock import BlDatablock VERTICE = ['co'] @@ -70,17 +70,8 @@ class BlMesh(BlDatablock): # MATERIAL SLOTS target.materials.clear() - for mat_uuid, mat_name in data["material_list"]: - mat_ref = None - if mat_uuid is not None: - mat_ref = get_datablock_from_uuid(mat_uuid, None) - else: - mat_ref = bpy.data.materials.get(mat_name, None) - - if mat_ref is None: - raise Exception("Material doesn't exist") - - target.materials.append(mat_ref) + for m in data["material_list"]: + target.materials.append(bpy.data.materials[m]) # CLEAR GEOMETRY if target.vertices: @@ -172,7 +163,12 @@ class BlMesh(BlDatablock): data['vertex_colors'][color_map.name]['data'] = np_dump_collection_primitive(color_map.data, 'color') # Fix material index - data['material_list'] = [(m.uuid, m.name) for m in instance.materials if m] + m_list = [] + for material in instance.materials: + if material: + m_list.append(material.name) + + data['material_list'] = m_list return data diff --git a/multi_user/bl_types/bl_node_group.py b/multi_user/bl_types/bl_node_group.py deleted file mode 100644 index 8ebf568..0000000 --- a/multi_user/bl_types/bl_node_group.py +++ /dev/null @@ -1,47 +0,0 @@ -# ##### BEGIN GPL LICENSE BLOCK ##### -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# ##### END GPL LICENSE BLOCK ##### - - -import bpy -import mathutils - -from .dump_anything import Dumper, Loader, np_dump_collection, np_load_collection -from .bl_datablock import BlDatablock -from .bl_material import (dump_shader_node_tree, - load_shader_node_tree, - get_node_tree_dependencies) - -class BlNodeGroup(BlDatablock): - bl_id = "node_groups" - bl_class = bpy.types.ShaderNodeTree - bl_delay_refresh = 1 - bl_delay_apply = 1 - bl_automatic_push = True - bl_check_common = False - bl_icon = 'NODETREE' - - def _construct(self, data): - return bpy.data.node_groups.new(data["name"], data["type"]) - - def _load_implementation(self, data, target): - load_shader_node_tree(data, target) - - def _dump_implementation(self, data, instance=None): - return dump_shader_node_tree(instance) - - def _resolve_deps_implementation(self): - return get_node_tree_dependencies(self.instance) \ No newline at end of file diff --git a/multi_user/bl_types/bl_object.py b/multi_user/bl_types/bl_object.py index 4d0bc79..021fb35 100644 --- a/multi_user/bl_types/bl_object.py +++ b/multi_user/bl_types/bl_object.py @@ -24,6 +24,7 @@ from replication.exception import ContextError from .bl_datablock import BlDatablock, get_datablock_from_uuid from .dump_anything import Dumper, Loader +from replication.exception import ReparentException def load_pose(target_bone, data): @@ -119,7 +120,9 @@ class BlObject(BlDatablock): data_uuid = data.get("data_uuid") data_id = data.get("data") - if target.data and (target.data.name != data_id): + if target.type != data['type']: + raise ReparentException() + elif target.data and (target.data.name != data_id): target.data = get_datablock_from_uuid(data_uuid, find_data_from_name(data_id), ignore=['images']) # vertex groups @@ -188,10 +191,10 @@ class BlObject(BlDatablock): target_bone.bone_group = target.pose.bone_group[bone_data['bone_group_index']] # TODO: find another way... - if target.empty_display_type == "IMAGE": + if target.type == 'EMPTY': img_uuid = data.get('data_uuid') if target.data is None and img_uuid: - target.data = get_datablock_from_uuid(img_uuid, None) + target.data = get_datablock_from_uuid(img_uuid, None)#bpy.data.images.get(img_key, None) def _dump_implementation(self, data, instance=None): assert(instance) diff --git a/multi_user/bl_types/bl_scene.py b/multi_user/bl_types/bl_scene.py index 02f0c89..5597493 100644 --- a/multi_user/bl_types/bl_scene.py +++ b/multi_user/bl_types/bl_scene.py @@ -16,18 +16,15 @@ # ##### END GPL LICENSE BLOCK ##### -import logging - import bpy import mathutils -from deepdiff import DeepDiff -from replication.constants import DIFF_JSON, MODIFIED -from .bl_collection import (dump_collection_children, dump_collection_objects, - load_collection_childrens, load_collection_objects, - resolve_collection_dependencies) +from .dump_anything import Loader, Dumper from .bl_datablock import BlDatablock -from .dump_anything import Dumper, Loader +from .bl_collection import dump_collection_children, dump_collection_objects, load_collection_childrens, load_collection_objects +from replication.constants import (DIFF_JSON, MODIFIED) +from deepdiff import DeepDiff +import logging RENDER_SETTINGS = [ 'dither_intensity', @@ -264,12 +261,6 @@ VIEW_SETTINGS = [ 'black_level' ] - - - - - - class BlScene(BlDatablock): bl_id = "scenes" bl_class = bpy.types.Scene @@ -319,7 +310,7 @@ class BlScene(BlDatablock): if 'view_settings' in data.keys(): loader.load(target.view_settings, data['view_settings']) if target.view_settings.use_curve_mapping and \ - 'curve_mapping' in data['view_settings']: + 'curve_mapping' in data['view_settings']: # TODO: change this ugly fix target.view_settings.curve_mapping.white_level = data[ 'view_settings']['curve_mapping']['white_level'] @@ -329,8 +320,8 @@ class BlScene(BlDatablock): def _dump_implementation(self, data, instance=None): assert(instance) + data = {} - # Metadata scene_dumper = Dumper() scene_dumper.depth = 1 scene_dumper.include_filter = [ @@ -345,9 +336,11 @@ class BlScene(BlDatablock): if self.preferences.sync_flags.sync_active_camera: scene_dumper.include_filter.append('camera') - data.update(scene_dumper.dump(instance)) + data = scene_dumper.dump(instance) - # Master collection + scene_dumper.depth = 3 + + scene_dumper.include_filter = ['children', 'objects', 'name'] data['collection'] = {} data['collection']['children'] = dump_collection_children( instance.collection) @@ -357,7 +350,6 @@ class BlScene(BlDatablock): scene_dumper.depth = 1 scene_dumper.include_filter = None - # Render settings if self.preferences.sync_flags.sync_render_settings: scene_dumper.include_filter = RENDER_SETTINGS @@ -385,18 +377,18 @@ class BlScene(BlDatablock): data['view_settings']['curve_mapping']['curves'] = scene_dumper.dump( instance.view_settings.curve_mapping.curves) - if instance.sequence_editor: - data['has_sequence'] = True - else: - data['has_sequence'] = False - return data def _resolve_deps_implementation(self): deps = [] - # Master Collection - deps.extend(resolve_collection_dependencies(self.instance.collection)) + # child collections + for child in self.instance.collection.children: + deps.append(child) + + # childs objects + for object in self.instance.collection.objects: + deps.append(object) # world if self.instance.world: @@ -406,11 +398,6 @@ class BlScene(BlDatablock): if self.instance.grease_pencil: deps.append(self.instance.grease_pencil) - # Sequences - # deps.extend(list(self.instance.sequence_editor.sequences_all)) - if self.instance.sequence_editor: - deps.append(self.instance.sequence_editor) - return deps def diff(self): diff --git a/multi_user/bl_types/bl_sequencer.py b/multi_user/bl_types/bl_sequencer.py deleted file mode 100644 index b2376fd..0000000 --- a/multi_user/bl_types/bl_sequencer.py +++ /dev/null @@ -1,197 +0,0 @@ -# ##### BEGIN GPL LICENSE BLOCK ##### -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# ##### END GPL LICENSE BLOCK ##### - - -import bpy -import mathutils -from pathlib import Path -import logging - -from .bl_file import get_filepath -from .dump_anything import Loader, Dumper -from .bl_datablock import BlDatablock, get_datablock_from_uuid - -def dump_sequence(sequence: bpy.types.Sequence) -> dict: - """ Dump a sequence to a dict - - :arg sequence: sequence to dump - :type sequence: bpy.types.Sequence - :return dict: - """ - dumper = Dumper() - dumper.exclude_filter = [ - 'lock', - 'select', - 'select_left_handle', - 'select_right_handle', - 'strobe' - ] - dumper.depth = 1 - data = dumper.dump(sequence) - - - # TODO: Support multiple images - if sequence.type == 'IMAGE': - data['filenames'] = [e.filename for e in sequence.elements] - - - # Effect strip inputs - input_count = getattr(sequence, 'input_count', None) - if input_count: - for n in range(input_count): - input_name = f"input_{n+1}" - data[input_name] = getattr(sequence, input_name).name - - return data - - -def load_sequence(sequence_data: dict, sequence_editor: bpy.types.SequenceEditor): - """ Load sequence from dumped data - - :arg sequence_data: sequence to dump - :type sequence_data:dict - :arg sequence_editor: root sequence editor - :type sequence_editor: bpy.types.SequenceEditor - """ - strip_type = sequence_data.get('type') - strip_name = sequence_data.get('name') - strip_channel = sequence_data.get('channel') - strip_frame_start = sequence_data.get('frame_start') - - sequence = sequence_editor.sequences_all.get(strip_name, None) - - if sequence is None: - if strip_type == 'SCENE': - strip_scene = bpy.data.scenes.get(sequence_data.get('scene')) - sequence = sequence_editor.sequences.new_scene(strip_name, - strip_scene, - strip_channel, - strip_frame_start) - elif strip_type == 'MOVIE': - filepath = get_filepath(Path(sequence_data['filepath']).name) - sequence = sequence_editor.sequences.new_movie(strip_name, - filepath, - strip_channel, - strip_frame_start) - elif strip_type == 'SOUND': - filepath = bpy.data.sounds[sequence_data['sound']].filepath - sequence = sequence_editor.sequences.new_sound(strip_name, - filepath, - strip_channel, - strip_frame_start) - elif strip_type == 'IMAGE': - images_name = sequence_data.get('filenames') - filepath = get_filepath(images_name[0]) - sequence = sequence_editor.sequences.new_image(strip_name, - filepath, - strip_channel, - strip_frame_start) - # load other images - if len(images_name)>1: - for img_idx in range(1,len(images_name)): - sequence.elements.append((images_name[img_idx])) - else: - seq = {} - - for i in range(sequence_data['input_count']): - seq[f"seq{i+1}"] = sequence_editor.sequences_all.get(sequence_data.get(f"input_{i+1}", None)) - - sequence = sequence_editor.sequences.new_effect(name=strip_name, - type=strip_type, - channel=strip_channel, - frame_start=strip_frame_start, - frame_end=sequence_data['frame_final_end'], - **seq) - - loader = Loader() - loader.load(sequence, sequence_data) - sequence.select = False - - -class BlSequencer(BlDatablock): - bl_id = "scenes" - bl_class = bpy.types.SequenceEditor - bl_delay_refresh = 1 - bl_delay_apply = 1 - bl_automatic_push = True - bl_check_common = True - bl_icon = 'SEQUENCE' - - def _construct(self, data): - # Get the scene - scene_id = data.get('name') - scene = bpy.data.scenes.get(scene_id, None) - - # Create sequencer data - scene.sequence_editor_clear() - scene.sequence_editor_create() - - return scene.sequence_editor - - def resolve(self): - scene = bpy.data.scenes.get(self.data['name'], None) - if scene: - if scene.sequence_editor is None: - self.instance = self._construct(self.data) - else: - self.instance = scene.sequence_editor - else: - logging.warning("Sequencer editor scene not found") - - def _load_implementation(self, data, target): - loader = Loader() - # Sequencer - sequences = data.get('sequences') - if sequences: - for seq in target.sequences_all: - if seq.name not in sequences: - target.sequences.remove(seq) - for seq_name, seq_data in sequences.items(): - load_sequence(seq_data, target) - - def _dump_implementation(self, data, instance=None): - assert(instance) - sequence_dumper = Dumper() - sequence_dumper.depth = 1 - sequence_dumper.include_filter = [ - 'proxy_storage', - ] - data = {}#sequence_dumper.dump(instance) - # Sequencer - sequences = {} - - for seq in instance.sequences_all: - sequences[seq.name] = dump_sequence(seq) - - data['sequences'] = sequences - data['name'] = instance.id_data.name - - return data - - - def _resolve_deps_implementation(self): - deps = [] - - for seq in self.instance.sequences_all: - if seq.type == 'MOVIE' and seq.filepath: - deps.append(Path(bpy.path.abspath(seq.filepath))) - elif seq.type == 'SOUND' and seq.sound: - deps.append(seq.sound) - elif seq.type == 'IMAGE': - for e in seq.elements: - deps.append(Path(bpy.path.abspath(seq.directory), e.filename)) - return deps diff --git a/multi_user/bl_types/bl_world.py b/multi_user/bl_types/bl_world.py index 99ba1ae..f641c9f 100644 --- a/multi_user/bl_types/bl_world.py +++ b/multi_user/bl_types/bl_world.py @@ -21,8 +21,10 @@ import mathutils from .dump_anything import Loader, Dumper from .bl_datablock import BlDatablock -from .bl_material import (load_shader_node_tree, - dump_shader_node_tree, +from .bl_material import (load_links, + load_node, + dump_node, + dump_links, get_node_tree_dependencies) @@ -46,7 +48,15 @@ class BlWorld(BlDatablock): if target.node_tree is None: target.use_nodes = True - load_shader_node_tree(data['node_tree'], target.node_tree) + target.node_tree.nodes.clear() + + for node in data["node_tree"]["nodes"]: + load_node(data["node_tree"]["nodes"][node], target.node_tree) + + # Load nodes links + target.node_tree.links.clear() + + load_links(data["node_tree"]["links"], target.node_tree) def _dump_implementation(self, data, instance=None): assert(instance) @@ -60,7 +70,15 @@ class BlWorld(BlDatablock): ] data = world_dumper.dump(instance) if instance.use_nodes: - data['node_tree'] = dump_shader_node_tree(instance.node_tree) + data['node_tree'] = {} + nodes = {} + + for node in instance.node_tree.nodes: + nodes[node.name] = dump_node(node) + + data["node_tree"]['nodes'] = nodes + + data["node_tree"]['links'] = dump_links(instance.node_tree.links) return data diff --git a/multi_user/delayable.py b/multi_user/delayable.py index 70ecfe6..5fefee8 100644 --- a/multi_user/delayable.py +++ b/multi_user/delayable.py @@ -36,7 +36,8 @@ from replication.constants import (FETCHED, STATE_ACTIVE, STATE_SYNCING, STATE_LOBBY, - STATE_SRV_SYNC) + STATE_SRV_SYNC, + REPARENT) from replication.interface import session from replication.exception import NonAuthorizedOperationError @@ -121,6 +122,15 @@ class ApplyTimer(Timer): session.apply(node) except Exception as e: logging.error(f"Fail to apply {node_ref.uuid}: {e}") + elif node_ref.state == REPARENT: + # Reload the node + node_ref.remove_instance() + node_ref.resolve() + session.apply(node) + for parent in session._graph.find_parents(node): + logging.info(f"Applying parent {parent}") + session.apply(parent, force=True) + node_ref.state = UP class DynamicRightSelectTimer(Timer): @@ -161,8 +171,7 @@ class DynamicRightSelectTimer(Timer): session.change_owner( node.uuid, RP_COMMON, - ignore_warnings=True, - affect_dependencies=recursive) + recursive=recursive) except NonAuthorizedOperationError: logging.warning(f"Not authorized to change {node} owner") @@ -179,8 +188,7 @@ class DynamicRightSelectTimer(Timer): session.change_owner( node.uuid, settings.username, - ignore_warnings=True, - affect_dependencies=recursive) + recursive=recursive) except NonAuthorizedOperationError: logging.warning(f"Not authorized to change {node} owner") else: @@ -205,8 +213,7 @@ class DynamicRightSelectTimer(Timer): session.change_owner( key, RP_COMMON, - ignore_warnings=True, - affect_dependencies=recursive) + recursive=recursive) except NonAuthorizedOperationError: logging.warning(f"Not authorized to change {key} owner") diff --git a/multi_user/environment.py b/multi_user/environment.py index 5fc47a3..8796a4c 100644 --- a/multi_user/environment.py +++ b/multi_user/environment.py @@ -62,9 +62,6 @@ def install_package(name, version): del env["PIP_REQUIRE_VIRTUALENV"] subprocess.run([str(PYTHON_PATH), "-m", "pip", "install", f"{name}=={version}"], env=env) - if name in sys.modules: - del sys.modules[name] - def check_package_version(name, required_version): logging.info(f"Checking {name} version...") out = subprocess.run([str(PYTHON_PATH), "-m", "pip", "show", name], capture_output=True) diff --git a/multi_user/operators.py b/multi_user/operators.py index dc8611c..4a7adbf 100644 --- a/multi_user/operators.py +++ b/multi_user/operators.py @@ -166,8 +166,7 @@ class SessionStartOperator(bpy.types.Operator): # init the factory with supported types for type in bl_types.types_to_register(): type_module = getattr(bl_types, type) - name = [e.capitalize() for e in type.split('_')[1:]] - type_impl_name = 'Bl'+''.join(name) + type_impl_name = f"Bl{type.split('_')[1].capitalize()}" type_module_class = getattr(type_module, type_impl_name) supported_bl_types.append(type_module_class.bl_id) @@ -227,8 +226,7 @@ class SessionStartOperator(bpy.types.Operator): except Exception as e: self.report({'ERROR'}, repr(e)) logging.error(f"Error: {e}") - import traceback - traceback.print_exc() + # Join a session else: if not runtime_settings.admin: @@ -428,8 +426,7 @@ class SessionPropertyRightOperator(bpy.types.Operator): if session: session.change_owner(self.key, runtime_settings.clients, - ignore_warnings=True, - affect_dependencies=self.recursive) + recursive=self.recursive) return {"FINISHED"} diff --git a/multi_user/preferences.py b/multi_user/preferences.py index 0548da7..d728c9c 100644 --- a/multi_user/preferences.py +++ b/multi_user/preferences.py @@ -29,9 +29,8 @@ from .utils import get_preferences, get_expanded_icon from replication.constants import RP_COMMON from replication.interface import session -# From https://stackoverflow.com/a/106223 -IP_REGEX = re.compile("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$") -HOSTNAME_REGEX = re.compile("^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$") +IP_EXPR = re.compile('\d+\.\d+\.\d+\.\d+') + def randomColor(): """Generate a random color """ @@ -54,13 +53,10 @@ def update_panel_category(self, context): def update_ip(self, context): - ip = IP_REGEX.search(self.ip) - dns = HOSTNAME_REGEX.search(self.ip) + ip = IP_EXPR.search(self.ip) if ip: self['ip'] = ip.group() - elif dns: - self['ip'] = dns.group() else: logging.error("Wrong IP format") self['ip'] = "127.0.0.1" @@ -242,31 +238,6 @@ class SessionPrefs(bpy.types.AddonPreferences): set=set_log_level, get=get_log_level ) - presence_hud_scale: bpy.props.FloatProperty( - name="Text scale", - description="Adjust the session widget text scale", - min=7, - max=90, - default=25, - ) - presence_hud_hpos: bpy.props.FloatProperty( - name="Horizontal position", - description="Adjust the session widget horizontal position", - min=1, - max=90, - default=1, - step=1, - subtype='PERCENTAGE', - ) - presence_hud_vpos: bpy.props.FloatProperty( - name="Vertical position", - description="Adjust the session widget vertical position", - min=1, - max=94, - default=1, - step=1, - subtype='PERCENTAGE', - ) conf_session_identity_expanded: bpy.props.BoolProperty( name="Identity", description="Identity", @@ -441,15 +412,6 @@ class SessionPrefs(bpy.types.AddonPreferences): emboss=False) if self.conf_session_ui_expanded: box.row().prop(self, "panel_category", text="Panel category", expand=True) - row = box.row() - row.label(text="Session widget:") - - col = box.column(align=True) - col.prop(self, "presence_hud_scale", expand=True) - - - col.prop(self, "presence_hud_hpos", expand=True) - col.prop(self, "presence_hud_vpos", expand=True) if self.category == 'UPDATE': from . import addon_updater_ops @@ -462,9 +424,9 @@ class SessionPrefs(bpy.types.AddonPreferences): new_db = self.supported_datablocks.add() type_module = getattr(bl_types, type) - name = [e.capitalize() for e in type.split('_')[1:]] - type_impl_name = 'Bl'+''.join(name) + type_impl_name = f"Bl{type.split('_')[1].capitalize()}" type_module_class = getattr(type_module, type_impl_name) + new_db.name = type_impl_name new_db.type_name = type_impl_name new_db.bl_delay_refresh = type_module_class.bl_delay_refresh diff --git a/multi_user/presence.py b/multi_user/presence.py index 4776e03..b885013 100644 --- a/multi_user/presence.py +++ b/multi_user/presence.py @@ -35,7 +35,7 @@ from replication.constants import (STATE_ACTIVE, STATE_AUTH, STATE_CONFIG, STATE_SYNCING, STATE_WAITING) from replication.interface import session -from .utils import find_from_attr, get_state_str, get_preferences +from .utils import find_from_attr, get_state_str # Helper functions @@ -300,38 +300,41 @@ class UserSelectionWidget(Widget): ob = find_from_attr("uuid", select_ob, bpy.data.objects) if not ob: return + + position = None - vertex_pos = bbox_from_obj(ob, 1.0) - vertex_indices = ((0, 1), (0, 2), (1, 3), (2, 3), - (4, 5), (4, 6), (5, 7), (6, 7), - (0, 4), (1, 5), (2, 6), (3, 7)) - - if ob.instance_collection: - for obj in ob.instance_collection.objects: - if obj.type == 'MESH' and hasattr(obj, 'bound_box'): - vertex_pos = get_bb_coords_from_obj(obj, instance=ob) - break - elif ob.type == 'EMPTY': - vertex_pos = bbox_from_obj(ob, ob.empty_display_size) - elif ob.type == 'LIGHT': - vertex_pos = bbox_from_obj(ob, ob.data.shadow_soft_size) - elif ob.type == 'LIGHT_PROBE': - vertex_pos = bbox_from_obj(ob, ob.data.influence_distance) - elif ob.type == 'CAMERA': - vertex_pos = bbox_from_obj(ob, ob.data.display_size) - elif hasattr(ob, 'bound_box'): - vertex_indices = ( + if ob.type == 'EMPTY': + # TODO: Child case + # Collection instance case + indices = ( (0, 1), (1, 2), (2, 3), (0, 3), (4, 5), (5, 6), (6, 7), (4, 7), (0, 4), (1, 5), (2, 6), (3, 7)) - vertex_pos = get_bb_coords_from_obj(ob) + if ob.instance_collection: + for obj in ob.instance_collection.objects: + if obj.type == 'MESH' and hasattr(obj, 'bound_box'): + positions = get_bb_coords_from_obj(obj, instance=ob) + break + elif hasattr(ob, 'bound_box'): + indices = ( + (0, 1), (1, 2), (2, 3), (0, 3), + (4, 5), (5, 6), (6, 7), (4, 7), + (0, 4), (1, 5), (2, 6), (3, 7)) + positions = get_bb_coords_from_obj(ob) + if positions is None: + indices = ( + (0, 1), (0, 2), (1, 3), (2, 3), + (4, 5), (4, 6), (5, 7), (6, 7), + (0, 4), (1, 5), (2, 6), (3, 7)) + + positions = bbox_from_obj(ob, ob.scale.x) shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR') batch = batch_for_shader( shader, 'LINES', - {"pos": vertex_pos}, - indices=vertex_indices) + {"pos": positions}, + indices=indices) shader.bind() shader.uniform_float("color", self.data.get('color')) @@ -384,9 +387,6 @@ class UserNameWidget(Widget): class SessionStatusWidget(Widget): draw_type = 'POST_PIXEL' - def __init__(self): - self.preferences = get_preferences() - @property def settings(self): return getattr(bpy.context.window_manager, 'session', None) @@ -396,8 +396,6 @@ class SessionStatusWidget(Widget): self.settings.enable_presence def draw(self): - text_scale = self.preferences.presence_hud_scale - ui_scale = bpy.context.preferences.view.ui_scale color = [1, 1, 0, 1] state = session.state.get('STATE') state_str = f"{get_state_str(state)}" @@ -406,11 +404,9 @@ class SessionStatusWidget(Widget): color = [0, 1, 0, 1] elif state == STATE_INITIAL: color = [1, 0, 0, 1] - hpos = (self.preferences.presence_hud_hpos*bpy.context.area.width)/100 - 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.position(0, 10, 20, 0) + blf.size(0, 16, 45) blf.color(0, color[0], color[1], color[2], color[3]) blf.draw(0, state_str) diff --git a/multi_user/ui.py b/multi_user/ui.py index bf3fbb3..1f90ec8 100644 --- a/multi_user/ui.py +++ b/multi_user/ui.py @@ -448,17 +448,9 @@ class SESSION_PT_presence(bpy.types.Panel): layout = self.layout settings = context.window_manager.session - pref = get_preferences() layout.active = settings.enable_presence 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() @@ -630,7 +622,7 @@ class VIEW3D_PT_overlay_session(bpy.types.Panel): 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") diff --git a/multi_user/utils.py b/multi_user/utils.py index 57ed532..a8317c3 100644 --- a/multi_user/utils.py +++ b/multi_user/utils.py @@ -99,9 +99,7 @@ def clean_scene(): type_collection.remove(item) except: continue - - # Clear sequencer - bpy.context.scene.sequence_editor_clear() + def get_selected_objects(scene, active_view_layer): return [obj.uuid for obj in scene.objects if obj.select_get(view_layer=active_view_layer)]