From fef6559ce0ef2f8b534f7e1c81978e9fa4ec0222 Mon Sep 17 00:00:00 2001 From: Swann Date: Wed, 19 May 2021 10:52:04 +0200 Subject: [PATCH] refactor: add light and camera support back --- multi_user/bl_types/bl_curve.py | 59 +++++++++++++++++++++++--------- multi_user/bl_types/bl_light.py | 36 ++++++++++++++++--- multi_user/bl_types/bl_mesh.py | 1 + multi_user/bl_types/bl_object.py | 4 ++- multi_user/libs/replication | 2 +- multi_user/operators.py | 6 ++-- multi_user/preferences.py | 6 ++-- 7 files changed, 84 insertions(+), 30 deletions(-) diff --git a/multi_user/bl_types/bl_curve.py b/multi_user/bl_types/bl_curve.py index 52e7efe..9269f57 100644 --- a/multi_user/bl_types/bl_curve.py +++ b/multi_user/bl_types/bl_curve.py @@ -27,6 +27,9 @@ from .dump_anything import (Dumper, Loader, np_load_collection, np_dump_collection) from .bl_material import dump_materials_slots, load_materials_slots +from .bl_datablock import resolve_datablock_from_uuid +from .bl_action import dump_animation_data, load_animation_data, resolve_animation_dependencies + SPLINE_BEZIER_POINT = [ # "handle_left_type", @@ -140,18 +143,22 @@ class BlCurve(ReplicatedDatablock): bl_icon = 'CURVE_DATA' bl_reload_parent = False + @staticmethod def construct(data: dict) -> object: return bpy.data.curves.new(data["name"], data["type"]) + @staticmethod def load(data: dict, datablock: object): - loader = Loader() - loader.load(target, data) + load_animation_data(datablock.get('animation_data'), datablock) - target.splines.clear() + loader = Loader() + loader.load(datablock, data) + + datablock.splines.clear() # load splines for spline in data['splines'].values(): - new_spline = target.splines.new(spline['type']) + new_spline = datablock.splines.new(spline['type']) # Load curve geometry data if new_spline.type == 'BEZIER': @@ -172,15 +179,14 @@ class BlCurve(ReplicatedDatablock): # MATERIAL SLOTS src_materials = data.get('materials', None) if src_materials: - load_materials_slots(src_materials, target.materials) + load_materials_slots(src_materials, datablock.materials) + @staticmethod def dump(datablock: object) -> dict: - assert(instance) dumper = Dumper() # Conflicting attributes # TODO: remove them with the NURBS support dumper.include_filter = CURVE_METADATA - dumper.exclude_filter = [ 'users', 'order_u', @@ -189,14 +195,16 @@ class BlCurve(ReplicatedDatablock): 'point_count_u', 'active_textbox' ] - if instance.use_auto_texspace: + if datablock.use_auto_texspace: dumper.exclude_filter.extend([ 'texspace_location', 'texspace_size']) - data = dumper.dump(instance) + data = dumper.dump(datablock) + + data['animation_data'] = dump_animation_data(datablock) data['splines'] = {} - for index, spline in enumerate(instance.splines): + for index, spline in enumerate(datablock.splines): dumper.depth = 2 dumper.include_filter = SPLINE_METADATA spline_data = dumper.dump(spline) @@ -210,21 +218,32 @@ class BlCurve(ReplicatedDatablock): spline.bezier_points, SPLINE_BEZIER_POINT) data['splines'][index] = spline_data - if isinstance(instance, T.SurfaceCurve): + if isinstance(datablock, T.SurfaceCurve): data['type'] = 'SURFACE' - elif isinstance(instance, T.TextCurve): + elif isinstance(datablock, T.TextCurve): data['type'] = 'FONT' - elif isinstance(instance, T.Curve): + elif isinstance(datablock, T.Curve): data['type'] = 'CURVE' - data['materials'] = dump_materials_slots(instance.materials) + data['materials'] = dump_materials_slots(datablock.materials) return data + @staticmethod + def resolve(data: dict) -> object: + uuid = data.get('uuid') + name = data.get('name') + datablock = resolve_datablock_from_uuid(uuid, bpy.data.curves) + if datablock is None: + datablock = bpy.data.curves.get(name) + + return datablock + + @staticmethod def resolve_deps(datablock: object) -> [object]: # TODO: resolve material deps = [] - curve = self.instance + curve = datablock if isinstance(curve, T.TextCurve): deps.extend([ @@ -233,15 +252,21 @@ class BlCurve(ReplicatedDatablock): curve.font_bold_italic, curve.font_italic]) - for material in self.instance.materials: + for material in datablock.materials: if material: deps.append(material) + + deps.extend(resolve_animation_dependencies(datablock)) return deps + @staticmethod def diff(self): if 'EDIT' in bpy.context.mode \ and not self.preferences.sync_flags.sync_during_editmode: return None else: - return super().diff() \ No newline at end of file + return super().diff() + +_type = bpy.types.Curve +_class = BlCurve \ No newline at end of file diff --git a/multi_user/bl_types/bl_light.py b/multi_user/bl_types/bl_light.py index c40e74d..66b170c 100644 --- a/multi_user/bl_types/bl_light.py +++ b/multi_user/bl_types/bl_light.py @@ -21,6 +21,8 @@ import mathutils from .dump_anything import Loader, Dumper from replication.protocol import ReplicatedDatablock +from .bl_datablock import resolve_datablock_from_uuid +from .bl_action import dump_animation_data, load_animation_data, resolve_animation_dependencies class BlLight(ReplicatedDatablock): @@ -30,15 +32,20 @@ class BlLight(ReplicatedDatablock): bl_icon = 'LIGHT_DATA' bl_reload_parent = False + @staticmethod def construct(data: dict) -> object: - return bpy.data.lights.new(data["name"], data["type"]) + instance = bpy.data.lights.new(data["name"], data["type"]) + instance.uuid = data.get("uuid") + return instance + @staticmethod def load(data: dict, datablock: object): loader = Loader() - loader.load(target, data) + loader.load(datablock, data) + load_animation_data(datablock.get('animation_data'), datablock) + @staticmethod def dump(datablock: object) -> dict: - assert(instance) dumper = Dumper() dumper.depth = 3 dumper.include_filter = [ @@ -67,9 +74,28 @@ class BlLight(ReplicatedDatablock): 'spot_size', 'spot_blend' ] - data = dumper.dump(instance) + data = dumper.dump(datablock) + data['animation_data'] = dump_animation_data(datablock) return data + @staticmethod + def resolve(data: dict) -> object: + uuid = data.get('uuid') + name = data.get('name') + datablock = resolve_datablock_from_uuid(uuid, bpy.data.lights) + if datablock is None: + datablock = bpy.data.lights.get(name) + + return datablock + + @staticmethod + def resolve_deps(datablock: object) -> [object]: + deps = [] + + deps.extend(resolve_animation_dependencies(datablock)) + + return deps - +_type = [bpy.types.SpotLight, bpy.types.PointLight, bpy.types.AreaLight, bpy.types.SunLight] +_class = BlLight diff --git a/multi_user/bl_types/bl_mesh.py b/multi_user/bl_types/bl_mesh.py index ad869e4..01a9ccb 100644 --- a/multi_user/bl_types/bl_mesh.py +++ b/multi_user/bl_types/bl_mesh.py @@ -205,5 +205,6 @@ class BlMesh(ReplicatedDatablock): else: return super().diff() + _type = bpy.types.Mesh _class = BlMesh diff --git a/multi_user/bl_types/bl_object.py b/multi_user/bl_types/bl_object.py index d962918..c5765e4 100644 --- a/multi_user/bl_types/bl_object.py +++ b/multi_user/bl_types/bl_object.py @@ -765,10 +765,12 @@ class BlObject(ReplicatedDatablock): if hasattr(datablock.data, 'shape_keys') and datablock.data.shape_keys: deps.extend(resolve_animation_dependencies(datablock.data.shape_keys)) - return deps deps.extend(resolve_animation_dependencies(datablock)) + return deps + + @staticmethod def resolve(data: dict) -> object: uuid = data.get('uuid') diff --git a/multi_user/libs/replication b/multi_user/libs/replication index 0eccf69..a6b4c55 160000 --- a/multi_user/libs/replication +++ b/multi_user/libs/replication @@ -1 +1 @@ -Subproject commit 0eccf69957e52442e9837b22c820f67187ee0e64 +Subproject commit a6b4c5596980f22acb96e956660cf74b7191294d diff --git a/multi_user/operators.py b/multi_user/operators.py index 480d4a8..0e05d32 100644 --- a/multi_user/operators.py +++ b/multi_user/operators.py @@ -191,9 +191,9 @@ class SessionStartOperator(bpy.types.Operator): # Check if supported_datablocks are up to date before starting the # the session - for impl in bpy_protocol.implementations.values(): - if impl.bl_class.__name__ not in settings.supported_datablocks: - logging.info(f"{impl.bl_class.__name__} not found, \ + for dcc_type_id in bpy_protocol.implementations.keys(): + if dcc_type_id not in settings.supported_datablocks: + logging.info(f"{dcc_type_id} not found, \ regenerate type settings...") settings.generate_supported_types() diff --git a/multi_user/preferences.py b/multi_user/preferences.py index c0d87a4..2e614cd 100644 --- a/multi_user/preferences.py +++ b/multi_user/preferences.py @@ -410,11 +410,11 @@ class SessionPrefs(bpy.types.AddonPreferences): bpy_protocol = bl_types.get_data_translation_protocol() # init the factory with supported types - for impl in bpy_protocol.implementations.values(): + for dcc_type_id, impl in bpy_protocol.implementations.items(): new_db = self.supported_datablocks.add() - new_db.name = impl.bl_class.__name__ - new_db.type_name = impl.bl_class.__name__ + new_db.name = dcc_type_id + new_db.type_name = dcc_type_id new_db.use_as_filter = True new_db.icon = impl.bl_icon new_db.bl_name = impl.bl_id