feat(client): append load to serial agent
This commit is contained in:
57
client.py
57
client.py
@ -13,19 +13,14 @@ import queue
|
|||||||
# import zmq
|
# import zmq
|
||||||
lock = threading.Lock()
|
lock = threading.Lock()
|
||||||
|
|
||||||
try:
|
|
||||||
from .libs import umsgpack
|
from .libs import umsgpack
|
||||||
from .libs import zmq
|
from .libs import zmq
|
||||||
from .libs import dump_anything
|
from .libs import dump_anything
|
||||||
from . import helpers
|
from . import helpers
|
||||||
from . import message
|
from . import message
|
||||||
except:
|
from . import draw
|
||||||
# Server import
|
|
||||||
from libs import umsgpack
|
|
||||||
from libs import zmq
|
|
||||||
from libs import dump_anything
|
|
||||||
import helpers
|
|
||||||
import message
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
logging.basicConfig(level=logging.INFO)
|
logging.basicConfig(level=logging.INFO)
|
||||||
@ -76,7 +71,7 @@ class RCFClient(object):
|
|||||||
|
|
||||||
# Database and connexion agent
|
# Database and connexion agent
|
||||||
self.net_agent = threading.Thread(
|
self.net_agent = threading.Thread(
|
||||||
target=rcf_client_agent, args=(self.ctx, self.store, peer, self.serial_product), name="net-agent")
|
target=rcf_client_agent, args=(self.ctx, self.store, peer, self.serial_product,self.serial_feed), name="net-agent")
|
||||||
self.net_agent.daemon = True
|
self.net_agent.daemon = True
|
||||||
self.net_agent.start()
|
self.net_agent.start()
|
||||||
|
|
||||||
@ -122,7 +117,7 @@ class RCFClient(object):
|
|||||||
self.pipe.send_multipart(
|
self.pipe.send_multipart(
|
||||||
[b"SET", umsgpack.packb(key), (umsgpack.packb(value) if value else umsgpack.packb('None')),umsgpack.packb(override)])
|
[b"SET", umsgpack.packb(key), (umsgpack.packb(value) if value else umsgpack.packb('None')),umsgpack.packb(override)])
|
||||||
else:
|
else:
|
||||||
self.serial_feed.put(key)
|
self.serial_feed.put(('DUMP',key,None))
|
||||||
# self.serial_pipe.send_multipart(
|
# self.serial_pipe.send_multipart(
|
||||||
# [b"DUMP", umsgpack.packb(key)])
|
# [b"DUMP", umsgpack.packb(key)])
|
||||||
# self.pipe.send_multipart(
|
# self.pipe.send_multipart(
|
||||||
@ -156,7 +151,7 @@ class RCFClient(object):
|
|||||||
global stop
|
global stop
|
||||||
stop = True
|
stop = True
|
||||||
for a in range(0,DUMP_AGENTS_NUMBER):
|
for a in range(0,DUMP_AGENTS_NUMBER):
|
||||||
self.serial_feed.put('exit')
|
self.serial_feed.put(('exit',None,None))
|
||||||
|
|
||||||
|
|
||||||
# READ-ONLY FUNCTIONS
|
# READ-ONLY FUNCTIONS
|
||||||
@ -377,10 +372,12 @@ class RCFClientAgent(object):
|
|||||||
elif command == b"STATE":
|
elif command == b"STATE":
|
||||||
self.pipe.send(umsgpack.packb(self.state.value))
|
self.pipe.send(umsgpack.packb(self.state.value))
|
||||||
|
|
||||||
def rcf_client_agent(ctx,store, pipe, queue):
|
|
||||||
|
def rcf_client_agent(ctx,store, pipe, serial_product, serial_feed):
|
||||||
agent = RCFClientAgent(ctx,store, pipe)
|
agent = RCFClientAgent(ctx,store, pipe)
|
||||||
server = None
|
server = None
|
||||||
net_feed = queue
|
net_feed = serial_product
|
||||||
|
net_product = serial_feed
|
||||||
global stop
|
global stop
|
||||||
while True:
|
while True:
|
||||||
if stop:
|
if stop:
|
||||||
@ -434,15 +431,17 @@ def rcf_client_agent(ctx,store, pipe, queue):
|
|||||||
logger.info("snapshot complete")
|
logger.info("snapshot complete")
|
||||||
agent.state = State.ACTIVE
|
agent.state = State.ACTIVE
|
||||||
else:
|
else:
|
||||||
helpers.load(rcfmsg.key, rcfmsg.body)
|
net_product.put(('LOAD',rcfmsg.key, rcfmsg.body))
|
||||||
|
# helpers.load(rcfmsg.key, rcfmsg.body)
|
||||||
rcfmsg.store(agent.property_map)
|
rcfmsg.store(agent.property_map)
|
||||||
logger.info("snapshot from {} stored".format(rcfmsg.id))
|
logger.info("snapshot from {} stored".format(rcfmsg.id))
|
||||||
elif agent.state == State.ACTIVE:
|
elif agent.state == State.ACTIVE:
|
||||||
# IN
|
# IN
|
||||||
if rcfmsg.id != agent.id:
|
if rcfmsg.id != agent.id:
|
||||||
|
|
||||||
with lock:
|
# with lock:
|
||||||
helpers.load(rcfmsg.key, rcfmsg.body)
|
# helpers.load(rcfmsg.key, rcfmsg.body)
|
||||||
|
net_product.put(('LOAD',rcfmsg.key, rcfmsg.body))
|
||||||
rcfmsg.store(agent.property_map)
|
rcfmsg.store(agent.property_map)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
@ -473,15 +472,19 @@ def rcf_client_agent(ctx,store, pipe, queue):
|
|||||||
# else: else
|
# else: else
|
||||||
# agent.state = State.INITIAL
|
# agent.state = State.INITIAL
|
||||||
|
|
||||||
|
|
||||||
def dumper_agent(product, feed):
|
def dumper_agent(product, feed):
|
||||||
while True:
|
while True:
|
||||||
key = feed.get()
|
command,key,value = feed.get()
|
||||||
|
|
||||||
if key == 'exit':
|
if command == 'exit':
|
||||||
break
|
break
|
||||||
|
elif command == 'DUMP':
|
||||||
|
value = helpers.dump(key)
|
||||||
|
|
||||||
value = helpers.dump(key)
|
if value:
|
||||||
|
product.put((key,value))
|
||||||
if value:
|
elif command == 'LOAD':
|
||||||
product.put((key,value))
|
if value:
|
||||||
|
helpers.load(key, value)
|
||||||
|
|
54
draw.py
54
draw.py
@ -82,7 +82,7 @@ def get_client_2d(coords):
|
|||||||
|
|
||||||
class HUD(object):
|
class HUD(object):
|
||||||
|
|
||||||
def __init__(self, client_instance=None):
|
def __init__(self):
|
||||||
self.d3d_items = {}
|
self.d3d_items = {}
|
||||||
self.d2d_items = {}
|
self.d2d_items = {}
|
||||||
self.draw3d_handle = None
|
self.draw3d_handle = None
|
||||||
@ -91,11 +91,9 @@ class HUD(object):
|
|||||||
self.coords = None
|
self.coords = None
|
||||||
self.active_object = None
|
self.active_object = None
|
||||||
|
|
||||||
if client_instance:
|
|
||||||
self.client = client_instance
|
|
||||||
|
|
||||||
self.draw_clients()
|
# self.draw_clients()
|
||||||
self.register_handlers()
|
self.register_handlers()
|
||||||
|
|
||||||
def register_handlers(self):
|
def register_handlers(self):
|
||||||
self.draw3d_handle = bpy.types.SpaceView3D.draw_handler_add(
|
self.draw3d_handle = bpy.types.SpaceView3D.draw_handler_add(
|
||||||
@ -163,32 +161,31 @@ class HUD(object):
|
|||||||
for k in key_to_remove:
|
for k in key_to_remove:
|
||||||
del self.d3d_items[k]
|
del self.d3d_items[k]
|
||||||
|
|
||||||
def draw_clients(self):
|
def draw_client(self, client):
|
||||||
clients = self.client.get("Client")
|
clients = self.client.get("Client")
|
||||||
|
|
||||||
if clients:
|
if client:
|
||||||
for client in clients:
|
name = client['id']
|
||||||
name = client[0].split('/')[1]
|
local_username = bpy.context.scene.session_settings.username
|
||||||
local_username = bpy.context.scene.session_settings.username
|
|
||||||
|
|
||||||
if name != local_username:
|
if name != local_username:
|
||||||
try:
|
try:
|
||||||
indices = (
|
indices = (
|
||||||
(1, 3), (2, 1), (3, 0), (2, 0),(4, 5)
|
(1, 3), (2, 1), (3, 0), (2, 0),(4, 5)
|
||||||
)
|
)
|
||||||
|
|
||||||
shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR')
|
shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR')
|
||||||
position = client[1]['location']
|
position = client['location']
|
||||||
color = client[1]['color']
|
color = client['color']
|
||||||
|
|
||||||
batch = batch_for_shader(
|
batch = batch_for_shader(
|
||||||
shader, 'LINES', {"pos": position}, indices=indices)
|
shader, 'LINES', {"pos": position}, indices=indices)
|
||||||
|
|
||||||
self.d3d_items[client[0]] = (shader, batch, color)
|
self.d3d_items[client[0]] = (shader, batch, color)
|
||||||
self.d2d_items[client[0]] = (position[1], name, color)
|
self.d2d_items[client[0]] = (position[1], name, color)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("Draw client exception {}".format(e))
|
print("Draw client exception {}".format(e))
|
||||||
|
|
||||||
def draw3d_callback(self):
|
def draw3d_callback(self):
|
||||||
bgl.glLineWidth(2)
|
bgl.glLineWidth(2)
|
||||||
@ -213,12 +210,3 @@ class HUD(object):
|
|||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("2D EXCEPTION")
|
print("2D EXCEPTION")
|
||||||
|
|
||||||
def draw(self):
|
|
||||||
if self.client:
|
|
||||||
self.d3d_items.clear()
|
|
||||||
self.d2d_items.clear()
|
|
||||||
|
|
||||||
# Draw clients
|
|
||||||
self.draw_clients()
|
|
||||||
self.draw_selected_object()
|
|
||||||
|
@ -72,8 +72,6 @@ def load(key, value):
|
|||||||
load_client(key.split('/')[1], value)
|
load_client(key.split('/')[1], value)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def resolve_bpy_path(path):
|
def resolve_bpy_path(path):
|
||||||
"""
|
"""
|
||||||
Get bpy property value from path
|
Get bpy property value from path
|
||||||
|
42
operators.py
42
operators.py
@ -173,7 +173,8 @@ def draw_tick():
|
|||||||
# drawing
|
# drawing
|
||||||
global drawer
|
global drawer
|
||||||
|
|
||||||
drawer.draw()
|
|
||||||
|
# drawer.draw()
|
||||||
|
|
||||||
# Upload
|
# Upload
|
||||||
upload_client_instance_position()
|
upload_client_instance_position()
|
||||||
@ -197,9 +198,9 @@ def sync():
|
|||||||
|
|
||||||
def register_ticks():
|
def register_ticks():
|
||||||
# REGISTER Updaters
|
# REGISTER Updaters
|
||||||
bpy.app.timers.register(draw_tick)
|
# bpy.app.timers.register(draw_tick)
|
||||||
bpy.app.timers.register(sync)
|
bpy.app.timers.register(sync)
|
||||||
# bpy.app.timers.register(default_tick)
|
bpy.app.timers.register(default_tick)
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def unregister_ticks():
|
def unregister_ticks():
|
||||||
@ -246,7 +247,7 @@ class session_join(bpy.types.Operator):
|
|||||||
net_settings.ip, net_settings.port)
|
net_settings.ip, net_settings.port)
|
||||||
|
|
||||||
# net_settings.is_running = True
|
# net_settings.is_running = True
|
||||||
drawer = draw.HUD(client_instance=client_instance)
|
drawer = draw.HUD()
|
||||||
# bpy.ops.session.refresh()
|
# bpy.ops.session.refresh()
|
||||||
register_ticks()
|
register_ticks()
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
@ -563,39 +564,6 @@ def depsgraph_update(scene):
|
|||||||
update_selected_object(bpy.context)
|
update_selected_object(bpy.context)
|
||||||
|
|
||||||
|
|
||||||
# selected_objects = helpers.get_selected_objects(scene)
|
|
||||||
|
|
||||||
|
|
||||||
# if len(selected_objects) > 0:
|
|
||||||
# for update in updates:
|
|
||||||
# update_key = "{}/{}".format(update.id.bl_rna.name, update.id.name)
|
|
||||||
# remote_update = client_instance.get(update_key)
|
|
||||||
|
|
||||||
# if remote_update and remote_update[0][1]["uuid"] == update.id.uuid:
|
|
||||||
# print("{} sending update".format(username))
|
|
||||||
# client_instance.set(
|
|
||||||
# "{}/{}".format(update.id.bl_rna.name, update.id.name))
|
|
||||||
# else:
|
|
||||||
# print("{} applying update".format(username))
|
|
||||||
|
|
||||||
|
|
||||||
# for update in ordered(updates):
|
|
||||||
# if update[2] == "Master Collection":
|
|
||||||
# pass
|
|
||||||
# elif update[1] in SUPPORTED_TYPES:
|
|
||||||
# key = "{}/{}".format(update[1], update[2])
|
|
||||||
|
|
||||||
# data = client_instance.get(key)
|
|
||||||
|
|
||||||
# if data:
|
|
||||||
# if update[3].id == username:
|
|
||||||
# # Queue update
|
|
||||||
# client_instance.set(key)
|
|
||||||
# else:
|
|
||||||
# # Instance new object ?
|
|
||||||
# print("new")
|
|
||||||
# client_instance.add(key)
|
|
||||||
|
|
||||||
selected_objects = helpers.get_selected_objects(scene)
|
selected_objects = helpers.get_selected_objects(scene)
|
||||||
if len(selected_objects) > 0:
|
if len(selected_objects) > 0:
|
||||||
for updated_data in updates:
|
for updated_data in updates:
|
||||||
|
Reference in New Issue
Block a user