Files
multi-user/replication.py

119 lines
3.5 KiB
Python
Raw Normal View History

2019-07-04 15:56:03 +02:00
import logging
from .libs.dump_anything import dump_datablock
from uuid import uuid4
try:
from .libs import umsgpack
except:
# Server import
from libs import umsgpack
import zmq
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.DEBUG)
2019-07-04 18:24:12 +02:00
2019-07-04 15:56:03 +02:00
class ReplicatedDatablock(object):
"""
Datablock used for replication
"""
uuid = None # key (string)
pointer = None # dcc data reference
2019-07-04 18:24:12 +02:00
data = None # data blob (json)
deps = []
2019-07-04 15:56:03 +02:00
2019-07-04 18:24:12 +02:00
def __init__(self, owner=None, data=None):
2019-07-04 15:56:03 +02:00
self.uuid = str(uuid4())
assert(owner)
2019-07-04 18:24:12 +02:00
2019-07-04 15:56:03 +02:00
self.pointer = data
def push(self, socket):
"""
2019-07-04 18:24:12 +02:00
Here send data over the wire:
- serialize the data
- send them as a multipart frame
2019-07-04 15:56:03 +02:00
"""
pass
@classmethod
def pull(cls, socket):
"""
2019-07-04 18:24:12 +02:00
Here we reeceive data from the wire:
- read data from the socket
- reconstruct an instance
2019-07-04 15:56:03 +02:00
"""
2019-07-04 18:24:12 +02:00
pass
2019-07-04 15:56:03 +02:00
def store(self, dict, persistent=False):
"""
I want to store my replicated data. Persistent means into the disk
If uuid is none we delete the key from the volume
"""
if self.uuid is not None:
if self.data == 'None':
logger.info("erasing key {}".format(self.uuid))
del dict[self.uuid]
else:
dict[self.uuid] = self
pass
2019-07-04 18:24:12 +02:00
def deserialize(self):
2019-07-04 15:56:03 +02:00
"""
I want to apply changes into the DCC
"""
raise NotImplementedError
2019-07-04 18:24:12 +02:00
def serialize(self):
2019-07-04 15:56:03 +02:00
"""
I want to load data from DCC
"""
raise NotImplementedError
2019-07-04 18:24:12 +02:00
import bpy, mathutils
2019-07-04 15:56:03 +02:00
2019-07-04 18:24:12 +02:00
class RepObject(ReplicatedDatablock):
def deserialize(self):
try:
if self.pointer is None:
pointer = None
2019-07-04 15:56:03 +02:00
2019-07-04 18:24:12 +02:00
# Object specific constructor...
if self.data["data"] in bpy.data.meshes.keys():
pointer = bpy.data.meshes[self.data["data"]]
elif self.data["data"] in bpy.data.lights.keys():
pointer = bpy.data.lights[self.data["data"]]
elif self.data["data"] in bpy.data.cameras.keys():
pointer = bpy.data.cameras[self.data["data"]]
elif self.data["data"] in bpy.data.curves.keys():
pointer = bpy.data.curves[self.data["data"]]
elif self.data["data"] in bpy.data.armatures.keys():
pointer = bpy.data.armatures[self.data["data"]]
elif self.data["data"] in bpy.data.grease_pencils.keys():
pointer = bpy.data.grease_pencils[self.data["data"]]
elif self.data["data"] in bpy.data.curves.keys():
pointer = bpy.data.curves[self.data["data"]]
self.pointer = bpy.data.objects.new(self.data["name"], pointer)
self.pointer.matrix_world = mathutils.Matrix(self.data["matrix_world"])
self.pointer.id = self.data['id']
client = bpy.context.window_manager.session.username
if self.pointer.id == client or self.pointer.id == "Common":
self.pointer.hide_select = False
else:
self.pointer.hide_select = True
2019-07-04 15:56:03 +02:00
2019-07-04 18:24:12 +02:00
except Exception as e:
logger.error("Object {} loading error: {} ".format(self.data["name"], e))
2019-07-04 15:56:03 +02:00
2019-07-04 18:24:12 +02:00
def deserialize(self):
self.data = dump_datablock(self.pointer, 1)