refactor: add light and camera support back
This commit is contained in:
@ -27,6 +27,9 @@ from .dump_anything import (Dumper, Loader,
|
|||||||
np_load_collection,
|
np_load_collection,
|
||||||
np_dump_collection)
|
np_dump_collection)
|
||||||
from .bl_material import dump_materials_slots, load_materials_slots
|
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 = [
|
SPLINE_BEZIER_POINT = [
|
||||||
# "handle_left_type",
|
# "handle_left_type",
|
||||||
@ -140,18 +143,22 @@ class BlCurve(ReplicatedDatablock):
|
|||||||
bl_icon = 'CURVE_DATA'
|
bl_icon = 'CURVE_DATA'
|
||||||
bl_reload_parent = False
|
bl_reload_parent = False
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
def construct(data: dict) -> object:
|
def construct(data: dict) -> object:
|
||||||
return bpy.data.curves.new(data["name"], data["type"])
|
return bpy.data.curves.new(data["name"], data["type"])
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
def load(data: dict, datablock: object):
|
def load(data: dict, datablock: object):
|
||||||
loader = Loader()
|
load_animation_data(datablock.get('animation_data'), datablock)
|
||||||
loader.load(target, data)
|
|
||||||
|
|
||||||
target.splines.clear()
|
loader = Loader()
|
||||||
|
loader.load(datablock, data)
|
||||||
|
|
||||||
|
datablock.splines.clear()
|
||||||
|
|
||||||
# load splines
|
# load splines
|
||||||
for spline in data['splines'].values():
|
for spline in data['splines'].values():
|
||||||
new_spline = target.splines.new(spline['type'])
|
new_spline = datablock.splines.new(spline['type'])
|
||||||
|
|
||||||
# Load curve geometry data
|
# Load curve geometry data
|
||||||
if new_spline.type == 'BEZIER':
|
if new_spline.type == 'BEZIER':
|
||||||
@ -172,15 +179,14 @@ class BlCurve(ReplicatedDatablock):
|
|||||||
# MATERIAL SLOTS
|
# MATERIAL SLOTS
|
||||||
src_materials = data.get('materials', None)
|
src_materials = data.get('materials', None)
|
||||||
if src_materials:
|
if src_materials:
|
||||||
load_materials_slots(src_materials, target.materials)
|
load_materials_slots(src_materials, datablock.materials)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
def dump(datablock: object) -> dict:
|
def dump(datablock: object) -> dict:
|
||||||
assert(instance)
|
|
||||||
dumper = Dumper()
|
dumper = Dumper()
|
||||||
# Conflicting attributes
|
# Conflicting attributes
|
||||||
# TODO: remove them with the NURBS support
|
# TODO: remove them with the NURBS support
|
||||||
dumper.include_filter = CURVE_METADATA
|
dumper.include_filter = CURVE_METADATA
|
||||||
|
|
||||||
dumper.exclude_filter = [
|
dumper.exclude_filter = [
|
||||||
'users',
|
'users',
|
||||||
'order_u',
|
'order_u',
|
||||||
@ -189,14 +195,16 @@ class BlCurve(ReplicatedDatablock):
|
|||||||
'point_count_u',
|
'point_count_u',
|
||||||
'active_textbox'
|
'active_textbox'
|
||||||
]
|
]
|
||||||
if instance.use_auto_texspace:
|
if datablock.use_auto_texspace:
|
||||||
dumper.exclude_filter.extend([
|
dumper.exclude_filter.extend([
|
||||||
'texspace_location',
|
'texspace_location',
|
||||||
'texspace_size'])
|
'texspace_size'])
|
||||||
data = dumper.dump(instance)
|
data = dumper.dump(datablock)
|
||||||
|
|
||||||
|
data['animation_data'] = dump_animation_data(datablock)
|
||||||
data['splines'] = {}
|
data['splines'] = {}
|
||||||
|
|
||||||
for index, spline in enumerate(instance.splines):
|
for index, spline in enumerate(datablock.splines):
|
||||||
dumper.depth = 2
|
dumper.depth = 2
|
||||||
dumper.include_filter = SPLINE_METADATA
|
dumper.include_filter = SPLINE_METADATA
|
||||||
spline_data = dumper.dump(spline)
|
spline_data = dumper.dump(spline)
|
||||||
@ -210,21 +218,32 @@ class BlCurve(ReplicatedDatablock):
|
|||||||
spline.bezier_points, SPLINE_BEZIER_POINT)
|
spline.bezier_points, SPLINE_BEZIER_POINT)
|
||||||
data['splines'][index] = spline_data
|
data['splines'][index] = spline_data
|
||||||
|
|
||||||
if isinstance(instance, T.SurfaceCurve):
|
if isinstance(datablock, T.SurfaceCurve):
|
||||||
data['type'] = 'SURFACE'
|
data['type'] = 'SURFACE'
|
||||||
elif isinstance(instance, T.TextCurve):
|
elif isinstance(datablock, T.TextCurve):
|
||||||
data['type'] = 'FONT'
|
data['type'] = 'FONT'
|
||||||
elif isinstance(instance, T.Curve):
|
elif isinstance(datablock, T.Curve):
|
||||||
data['type'] = 'CURVE'
|
data['type'] = 'CURVE'
|
||||||
|
|
||||||
data['materials'] = dump_materials_slots(instance.materials)
|
data['materials'] = dump_materials_slots(datablock.materials)
|
||||||
|
|
||||||
return data
|
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]:
|
def resolve_deps(datablock: object) -> [object]:
|
||||||
# TODO: resolve material
|
# TODO: resolve material
|
||||||
deps = []
|
deps = []
|
||||||
curve = self.instance
|
curve = datablock
|
||||||
|
|
||||||
if isinstance(curve, T.TextCurve):
|
if isinstance(curve, T.TextCurve):
|
||||||
deps.extend([
|
deps.extend([
|
||||||
@ -233,15 +252,21 @@ class BlCurve(ReplicatedDatablock):
|
|||||||
curve.font_bold_italic,
|
curve.font_bold_italic,
|
||||||
curve.font_italic])
|
curve.font_italic])
|
||||||
|
|
||||||
for material in self.instance.materials:
|
for material in datablock.materials:
|
||||||
if material:
|
if material:
|
||||||
deps.append(material)
|
deps.append(material)
|
||||||
|
|
||||||
|
deps.extend(resolve_animation_dependencies(datablock))
|
||||||
|
|
||||||
return deps
|
return deps
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
def diff(self):
|
def diff(self):
|
||||||
if 'EDIT' in bpy.context.mode \
|
if 'EDIT' in bpy.context.mode \
|
||||||
and not self.preferences.sync_flags.sync_during_editmode:
|
and not self.preferences.sync_flags.sync_during_editmode:
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
return super().diff()
|
return super().diff()
|
||||||
|
|
||||||
|
_type = bpy.types.Curve
|
||||||
|
_class = BlCurve
|
@ -21,6 +21,8 @@ import mathutils
|
|||||||
|
|
||||||
from .dump_anything import Loader, Dumper
|
from .dump_anything import Loader, Dumper
|
||||||
from replication.protocol import ReplicatedDatablock
|
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):
|
class BlLight(ReplicatedDatablock):
|
||||||
@ -30,15 +32,20 @@ class BlLight(ReplicatedDatablock):
|
|||||||
bl_icon = 'LIGHT_DATA'
|
bl_icon = 'LIGHT_DATA'
|
||||||
bl_reload_parent = False
|
bl_reload_parent = False
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
def construct(data: dict) -> object:
|
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):
|
def load(data: dict, datablock: object):
|
||||||
loader = Loader()
|
loader = Loader()
|
||||||
loader.load(target, data)
|
loader.load(datablock, data)
|
||||||
|
load_animation_data(datablock.get('animation_data'), datablock)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
def dump(datablock: object) -> dict:
|
def dump(datablock: object) -> dict:
|
||||||
assert(instance)
|
|
||||||
dumper = Dumper()
|
dumper = Dumper()
|
||||||
dumper.depth = 3
|
dumper.depth = 3
|
||||||
dumper.include_filter = [
|
dumper.include_filter = [
|
||||||
@ -67,9 +74,28 @@ class BlLight(ReplicatedDatablock):
|
|||||||
'spot_size',
|
'spot_size',
|
||||||
'spot_blend'
|
'spot_blend'
|
||||||
]
|
]
|
||||||
data = dumper.dump(instance)
|
data = dumper.dump(datablock)
|
||||||
|
data['animation_data'] = dump_animation_data(datablock)
|
||||||
return data
|
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
|
||||||
|
@ -205,5 +205,6 @@ class BlMesh(ReplicatedDatablock):
|
|||||||
else:
|
else:
|
||||||
return super().diff()
|
return super().diff()
|
||||||
|
|
||||||
|
|
||||||
_type = bpy.types.Mesh
|
_type = bpy.types.Mesh
|
||||||
_class = BlMesh
|
_class = BlMesh
|
||||||
|
@ -765,10 +765,12 @@ class BlObject(ReplicatedDatablock):
|
|||||||
|
|
||||||
if hasattr(datablock.data, 'shape_keys') and datablock.data.shape_keys:
|
if hasattr(datablock.data, 'shape_keys') and datablock.data.shape_keys:
|
||||||
deps.extend(resolve_animation_dependencies(datablock.data.shape_keys))
|
deps.extend(resolve_animation_dependencies(datablock.data.shape_keys))
|
||||||
return deps
|
|
||||||
|
|
||||||
deps.extend(resolve_animation_dependencies(datablock))
|
deps.extend(resolve_animation_dependencies(datablock))
|
||||||
|
|
||||||
|
return deps
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def resolve(data: dict) -> object:
|
def resolve(data: dict) -> object:
|
||||||
uuid = data.get('uuid')
|
uuid = data.get('uuid')
|
||||||
|
Submodule multi_user/libs/replication updated: 0eccf69957...a6b4c55969
@ -191,9 +191,9 @@ class SessionStartOperator(bpy.types.Operator):
|
|||||||
|
|
||||||
# Check if supported_datablocks are up to date before starting the
|
# Check if supported_datablocks are up to date before starting the
|
||||||
# the session
|
# the session
|
||||||
for impl in bpy_protocol.implementations.values():
|
for dcc_type_id in bpy_protocol.implementations.keys():
|
||||||
if impl.bl_class.__name__ not in settings.supported_datablocks:
|
if dcc_type_id not in settings.supported_datablocks:
|
||||||
logging.info(f"{impl.bl_class.__name__} not found, \
|
logging.info(f"{dcc_type_id} not found, \
|
||||||
regenerate type settings...")
|
regenerate type settings...")
|
||||||
settings.generate_supported_types()
|
settings.generate_supported_types()
|
||||||
|
|
||||||
|
@ -410,11 +410,11 @@ class SessionPrefs(bpy.types.AddonPreferences):
|
|||||||
bpy_protocol = bl_types.get_data_translation_protocol()
|
bpy_protocol = bl_types.get_data_translation_protocol()
|
||||||
|
|
||||||
# init the factory with supported types
|
# 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 = self.supported_datablocks.add()
|
||||||
|
|
||||||
new_db.name = impl.bl_class.__name__
|
new_db.name = dcc_type_id
|
||||||
new_db.type_name = impl.bl_class.__name__
|
new_db.type_name = dcc_type_id
|
||||||
new_db.use_as_filter = True
|
new_db.use_as_filter = True
|
||||||
new_db.icon = impl.bl_icon
|
new_db.icon = impl.bl_icon
|
||||||
new_db.bl_name = impl.bl_id
|
new_db.bl_name = impl.bl_id
|
||||||
|
Reference in New Issue
Block a user