feat(rcf): mesh reloading

This commit is contained in:
Swann Martinez
2019-03-28 15:02:21 +01:00
parent b51ca0fde5
commit b9d013d5c4
3 changed files with 90 additions and 47 deletions

View File

@ -108,10 +108,10 @@ class RCFMessage(object):
def store(self, dikt): def store(self, dikt):
"""Store me in a dict if I have anything to store""" """Store me in a dict if I have anything to store"""
# this currently erasing old value # this currently erasing old value
if self.key is not None and self.body is not None: if self.key is not None :
dikt[self.key] = self dikt[self.key] = self
elif self.key in dikt: # elif self.key in dikt:
del dikt[self.key] # del dikt[self.key]
def send(self, socket): def send(self, socket):
"""Send key-value message to socket; any empty frames are sent as such.""" """Send key-value message to socket; any empty frames are sent as such."""
@ -243,9 +243,9 @@ class RCFClient():
logger.info("{} client running".format(id)) logger.info("{} client running".format(id))
self.push_update( self.push_update(
"net/clients/{}".format(self.id.decode()), "client", self.id) "net/clients/{}".format(self.id.decode()), "client", [(0,0,0),(0,0,0),(0,0,0),(0,0,0)])
self.push_update( self.push_update(
"net/objects/{}".format(self.id.decode()), "client_object", "None") "net/objects/{}".format(self.id.decode()), "client_object", None)
self.tick_task = asyncio.ensure_future(self.tick()) self.tick_task = asyncio.ensure_future(self.tick())

View File

@ -154,6 +154,26 @@ def dump_datablock(datablock,depth):
client.push_update(key, datablock_type, data) client.push_update(key, datablock_type, data)
def dump_datablock_attibute(datablock,attributes):
if datablock:
print("sending {}".format(datablock.name))
dumper = dump_anything.Dumper()
dumper.type_subset = dumper.match_subset_all
dumper.depth = 1
datablock_type = datablock.bl_rna.name
key = "{}/{}".format(datablock_type,datablock.name)
data = {}
for attr in attributes:
try:
data[attr] = dumper.dump(getattr(datablock,attr))
except:
pass
client.push_update(key, datablock_type, data)
def init_scene(): def init_scene():
for cam in bpy.data.cameras: for cam in bpy.data.cameras:
dump_datablock(cam,1) dump_datablock(cam,1)
@ -230,7 +250,7 @@ def load_object(target=None, data=None, create=False):
target.matrix_world = mathutils.Matrix(data["matrix_world"]) target.matrix_world = mathutils.Matrix(data["matrix_world"])
except: except:
print("Object {} loading error ".format(data)) print("Object {} loading error ".format(data["name"]))
def load_collection(target=None, data=None, create=False): def load_collection(target=None, data=None, create=False):
@ -360,7 +380,7 @@ def update_scene(msg):
if net_vars.active_object.name in msg.key: if net_vars.active_object.name in msg.key:
raise ValueError() raise ValueError()
if 'net' not in msg.key:
target = resolve_bpy_path(msg.key) target = resolve_bpy_path(msg.key)
if msg.mtype == 'Object': if msg.mtype == 'Object':
@ -433,7 +453,7 @@ class session_join(bpy.types.Operator):
net_settings.is_running = True net_settings.is_running = True
# bpy.ops.session.draw('INVOKE_DEFAULT') bpy.ops.session.draw('INVOKE_DEFAULT')
return {"FINISHED"} return {"FINISHED"}
@ -637,16 +657,18 @@ class session_draw_clients(bpy.types.Operator):
index_object = 0 index_object = 0
for key, values in client.property_map.items(): for key, values in client.property_map.items():
if values.body is not None: if values.body is not None:
if values.mtype == "object": if values.mtype == "client_object":
if values.id != client.id: if values.id != client.id and values.body is not None:
indices = ( indices = (
(0, 1), (1, 2), (2, 3), (0, 3), (0, 1), (1, 2), (2, 3), (0, 3),
(4, 5), (5, 6), (6, 7), (4, 7), (4, 5), (5, 6), (6, 7), (4, 7),
(0, 4), (1, 5), (2, 6), (3, 7) (0, 4), (1, 5), (2, 6), (3, 7)
) )
if values.body in bpy.data.objects.keys():
ob = bpy.data.objects[values.body] ob = bpy.data.objects[values.body]
else:
return
bbox_corners = [ob.matrix_world @ mathutils.Vector(corner) for corner in ob.bound_box] bbox_corners = [ob.matrix_world @ mathutils.Vector(corner) for corner in ob.bound_box]
coords = [(point.x, point.y, point.z) coords = [(point.x, point.y, point.z)
@ -701,7 +723,7 @@ class session_draw_clients(bpy.types.Operator):
global client global client
for k, v in client.property_map.items(): for k, v in client.property_map.items():
if v.mtype == 'object': if v.mtype == 'client_object':
if client.id != v.id: if client.id != v.id:
if obj.name in v.body: if obj.name in v.body:
return True return True
@ -741,12 +763,12 @@ class session_draw_clients(bpy.types.Operator):
session.active_object = context.selected_objects[0] session.active_object = context.selected_objects[0]
key = "net/objects/{}".format(client.id.decode()) key = "net/objects/{}".format(client.id.decode())
client.push_update( client.push_update(
key, 'object', session.active_object.name) key, 'client_object', session.active_object.name)
elif len(context.selected_objects) == 0 and session.active_object: elif len(context.selected_objects) == 0 and session.active_object:
session.active_object = None session.active_object = None
key = "net/objects/{}".format(client.id.decode()) key = "net/objects/{}".format(client.id.decode())
client.push_update(key, 'object', None) client.push_update(key, 'client_object', None)
# Draw clients # Draw clients
if len(client.property_map) > 0: if len(client.property_map) > 0:
@ -805,13 +827,27 @@ classes = (
def depsgraph_update(scene): def depsgraph_update(scene):
for c in bpy.context.depsgraph.updates.items(): for c in bpy.context.depsgraph.updates.items():
# print(c[1].id) global client
if c[1].is_updated_geometry:
pass if client.status == net_components.RCFStatus.CONNECTED:
if c[1].is_updated_transform: if c[1].is_updated_geometry:
pass print("GEOMETRY UPDATE")
elif c[1].is_updated_transform:
print("TRANFORM UPDATE")
dump_datablock_attibute(bpy.data.objects[c[1].id.name],['matrix_world'])
else:
if c[1].id.name in bpy.data.objects.keys():
found = False
for k in client.property_map.keys():
if c[1].id.name in k:
found = True
break
if not found:
dump_datablock(bpy.data.objects[c[1].id.name].data,4)
dump_datablock(bpy.data.objects[c[1].id.name],1)
dump_datablock(bpy.data.scenes[0],4)
# print(dumper.dump(c[1]))
def register(): def register():
@ -821,12 +857,18 @@ def register():
bpy.types.Scene.session_settings = bpy.props.PointerProperty( bpy.types.Scene.session_settings = bpy.props.PointerProperty(
type=session_settings) type=session_settings)
bpy.app.handlers.depsgraph_update_post.append(depsgraph_update)
def unregister(): def unregister():
global server global server
global client global client
try:
bpy.app.handlers.depsgraph_update_post.remove(depsgraph_update)
except:
pass
if server: if server:
server.stop() server.stop()
del server del server

View File

@ -95,7 +95,7 @@ class SessionUsersPanel(bpy.types.Panel):
info = "(self)" info = "(self)"
# detail_item_box = item_box.row() # detail_item_box = item_box.row()
detail_item_box.label( detail_item_box.label(
text="{} {}".format(values.id.decode(), info)) text="{} - {} -{}".format(values.id.decode(),values.body, info))
if net_operators.client.id.decode() not in key: if net_operators.client.id.decode() not in key:
detail_item_box.operator( detail_item_box.operator(
@ -145,6 +145,7 @@ class SessionPropertiesPanel(bpy.types.Panel):
item_box = area_msg.box() item_box = area_msg.box()
detail_item_box = item_box.row() detail_item_box = item_box.row()
# detail_item_box = item_box.row() # detail_item_box = item_box.row()
detail_item_box.label(text="{} ({}) {} ".format( detail_item_box.label(text="{} ({}) {} ".format(
key, values.mtype, values.id.decode())) key, values.mtype, values.id.decode()))
detail_item_box.operator( detail_item_box.operator(