remove(rcf): cleanup
This commit is contained in:
BIN
bench.blend
BIN
bench.blend
Binary file not shown.
184
client.json
184
client.json
@ -1,184 +0,0 @@
|
|||||||
{
|
|
||||||
"active_material": "Material",
|
|
||||||
"active_material_index": 0,
|
|
||||||
"active_shape_key_index": 0,
|
|
||||||
"data": "Cube",
|
|
||||||
"delta_location": [
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
"delta_scale": [
|
|
||||||
1.0,
|
|
||||||
1.0,
|
|
||||||
1.0
|
|
||||||
],
|
|
||||||
"dimensions": [
|
|
||||||
2.615931749343872,
|
|
||||||
2.0,
|
|
||||||
2.615931749343872
|
|
||||||
],
|
|
||||||
"display_bounds_type": "BOX",
|
|
||||||
"display_type": "TEXTURED",
|
|
||||||
"empty_display_size": 1.0,
|
|
||||||
"empty_display_type": "ARROWS",
|
|
||||||
"empty_image_depth": "DEFAULT",
|
|
||||||
"empty_image_side": "DOUBLE_SIDED",
|
|
||||||
"hide_render": false,
|
|
||||||
"hide_select": false,
|
|
||||||
"hide_viewport": false,
|
|
||||||
"instance_faces_scale": 1.0,
|
|
||||||
"instance_type": "NONE",
|
|
||||||
"is_evaluated": false,
|
|
||||||
"is_from_instancer": false,
|
|
||||||
"is_from_set": false,
|
|
||||||
"is_instancer": false,
|
|
||||||
"is_library_indirect": false,
|
|
||||||
"location": [
|
|
||||||
-3.7747275829315186,
|
|
||||||
0.3205798268318176,
|
|
||||||
0.3536362648010254
|
|
||||||
],
|
|
||||||
"lock_rotation_w": false,
|
|
||||||
"lock_rotations_4d": false,
|
|
||||||
"matrix_basis": [
|
|
||||||
[
|
|
||||||
1.0,
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
-3.7747275829315186
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
1.0,
|
|
||||||
0.0,
|
|
||||||
0.3205798268318176
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
1.0,
|
|
||||||
0.3536362648010254
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
1.0
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"matrix_local": [
|
|
||||||
[
|
|
||||||
1.0,
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
-3.7747275829315186
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
1.0,
|
|
||||||
0.0,
|
|
||||||
0.3205798268318176
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
1.0,
|
|
||||||
0.3536362648010254
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
1.0
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"matrix_parent_inverse": [
|
|
||||||
[
|
|
||||||
1.0,
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
1.0,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
1.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
1.0
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"matrix_world": [
|
|
||||||
[
|
|
||||||
1.0,
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
-3.7747275829315186
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
1.0,
|
|
||||||
0.0,
|
|
||||||
0.3205798268318176
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
1.0,
|
|
||||||
0.3536362648010254
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
1.0
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"mode": "OBJECT",
|
|
||||||
"name": "Cube",
|
|
||||||
"name_full": "Cube",
|
|
||||||
"original": "Cube",
|
|
||||||
"parent_bone": "",
|
|
||||||
"parent_type": "OBJECT",
|
|
||||||
"pass_index": 0,
|
|
||||||
"rotation_mode": "XYZ",
|
|
||||||
"scale": [
|
|
||||||
1.0,
|
|
||||||
1.0,
|
|
||||||
1.0
|
|
||||||
],
|
|
||||||
"show_all_edges": false,
|
|
||||||
"show_axis": false,
|
|
||||||
"show_bounds": false,
|
|
||||||
"show_empty_image_orthographic": true,
|
|
||||||
"show_empty_image_perspective": true,
|
|
||||||
"show_in_front": false,
|
|
||||||
"show_instancer_for_render": true,
|
|
||||||
"show_instancer_for_viewport": true,
|
|
||||||
"show_name": false,
|
|
||||||
"show_only_shape_key": false,
|
|
||||||
"show_texture_space": false,
|
|
||||||
"show_transparent": false,
|
|
||||||
"show_wire": false,
|
|
||||||
"tag": true,
|
|
||||||
"track_axis": "POS_Y",
|
|
||||||
"type": "MESH",
|
|
||||||
"up_axis": "Z",
|
|
||||||
"use_dynamic_topology_sculpting": false,
|
|
||||||
"use_fake_user": false,
|
|
||||||
"use_instance_faces_scale": false,
|
|
||||||
"use_instance_vertices_rotation": false,
|
|
||||||
"use_shape_key_edit_mode": false,
|
|
||||||
"users": 1
|
|
||||||
}
|
|
170
net_operators.py
170
net_operators.py
@ -22,34 +22,36 @@ client = None
|
|||||||
server = None
|
server = None
|
||||||
context = None
|
context = None
|
||||||
|
|
||||||
update_list = {}
|
update_list = {}
|
||||||
|
|
||||||
def add_update(type,item):
|
|
||||||
|
def add_update(type, item):
|
||||||
try:
|
try:
|
||||||
if item not in update_list[type]:
|
if item not in update_list[type]:
|
||||||
update_list[type].append(item)
|
update_list[type].append(item)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
update_list[type] = []
|
update_list[type] = []
|
||||||
|
|
||||||
|
|
||||||
def get_update(type):
|
def get_update(type):
|
||||||
try:
|
try:
|
||||||
update = None
|
update = None
|
||||||
|
|
||||||
if update_list[type]:
|
if update_list[type]:
|
||||||
update = update_list[type].pop()
|
update = update_list[type].pop()
|
||||||
except KeyError:
|
except KeyError:
|
||||||
update_list[type] = []
|
update_list[type] = []
|
||||||
|
|
||||||
return update
|
return update
|
||||||
COLOR_TABLE = [(1, 0, 0, 1), (0, 1, 0, 1), (0, 0, 1, 1),
|
|
||||||
(0, 0.5, 1, 1), (0.5, 0, 1, 1)]
|
|
||||||
SUPPORTED_DATABLOCKS = ['collections', 'meshes', 'objects',
|
|
||||||
'materials', 'textures', 'lights', 'cameras', 'actions', 'armatures','grease_pencils']
|
|
||||||
SUPPORTED_TYPES = ['Collection', 'Mesh', 'Object', 'Material',
|
|
||||||
'Texture', 'Light', 'Camera', 'Action', 'Armature','GreasePencil','Scene']
|
|
||||||
|
|
||||||
CORRESPONDANCE = {'Collection':'collections', 'Mesh':'meshes', 'Object':'objects', 'Material':'materials',
|
|
||||||
'Texture':'textures','Scene':'scenes', 'Light':'lights', 'Camera':'cameras', 'Action':'actions', 'Armature':'armatures','GreasePencil':'grease_pencils'}
|
SUPPORTED_DATABLOCKS = ['collections', 'meshes', 'objects',
|
||||||
|
'materials', 'textures', 'lights', 'cameras', 'actions', 'armatures', 'grease_pencils']
|
||||||
|
SUPPORTED_TYPES = ['Collection', 'Mesh', 'Object', 'Material',
|
||||||
|
'Texture', 'Light', 'Camera', 'Action', 'Armature', 'GreasePencil', 'Scene']
|
||||||
|
|
||||||
|
CORRESPONDANCE = {'Collection': 'collections', 'Mesh': 'meshes', 'Object': 'objects', 'Material': 'materials',
|
||||||
|
'Texture': 'textures', 'Scene': 'scenes', 'Light': 'lights', 'Camera': 'cameras', 'Action': 'actions', 'Armature': 'armatures', 'GreasePencil': 'grease_pencils'}
|
||||||
# UTILITY FUNCTIONS
|
# UTILITY FUNCTIONS
|
||||||
|
|
||||||
|
|
||||||
@ -73,7 +75,7 @@ def view3d_find():
|
|||||||
|
|
||||||
|
|
||||||
def get_target(region, rv3d, coord):
|
def get_target(region, rv3d, coord):
|
||||||
target = [0,0,0]
|
target = [0, 0, 0]
|
||||||
|
|
||||||
if coord and region and rv3d:
|
if coord and region and rv3d:
|
||||||
view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord)
|
view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord)
|
||||||
@ -121,11 +123,12 @@ def randomStringDigits(stringLength=6):
|
|||||||
lettersAndDigits = string.ascii_letters + string.digits
|
lettersAndDigits = string.ascii_letters + string.digits
|
||||||
return ''.join(random.choice(lettersAndDigits) for i in range(stringLength))
|
return ''.join(random.choice(lettersAndDigits) for i in range(stringLength))
|
||||||
|
|
||||||
|
|
||||||
def randomColor():
|
def randomColor():
|
||||||
r = random.random()
|
r = random.random()
|
||||||
v = random.random()
|
v = random.random()
|
||||||
b = random.random()
|
b = random.random()
|
||||||
return [r,v,b]
|
return [r, v, b]
|
||||||
|
|
||||||
|
|
||||||
def resolve_bpy_path(path):
|
def resolve_bpy_path(path):
|
||||||
@ -148,7 +151,8 @@ def refresh_window():
|
|||||||
import bpy
|
import bpy
|
||||||
bpy.ops.wm.redraw_timer(type='DRAW_WIN_SWAP', iterations=1)
|
bpy.ops.wm.redraw_timer(type='DRAW_WIN_SWAP', iterations=1)
|
||||||
|
|
||||||
def dump_datablock(datablock,depth):
|
|
||||||
|
def dump_datablock(datablock, depth):
|
||||||
if datablock:
|
if datablock:
|
||||||
print("sending {}".format(datablock.name))
|
print("sending {}".format(datablock.name))
|
||||||
|
|
||||||
@ -157,36 +161,41 @@ def dump_datablock(datablock,depth):
|
|||||||
dumper.depth = depth
|
dumper.depth = depth
|
||||||
|
|
||||||
datablock_type = datablock.bl_rna.name
|
datablock_type = datablock.bl_rna.name
|
||||||
key = "{}/{}".format(datablock_type,datablock.name)
|
key = "{}/{}".format(datablock_type, datablock.name)
|
||||||
data = dumper.dump(datablock)
|
data = dumper.dump(datablock)
|
||||||
|
|
||||||
client.push_update(key, datablock_type, data)
|
client.push_update(key, datablock_type, data)
|
||||||
|
|
||||||
def dump_datablock_attibute(datablock,attributes,depth=1):
|
|
||||||
|
def dump_datablock_attibute(datablock, attributes, depth=1):
|
||||||
if datablock:
|
if datablock:
|
||||||
dumper = dump_anything.Dumper()
|
dumper = dump_anything.Dumper()
|
||||||
dumper.type_subset = dumper.match_subset_all
|
dumper.type_subset = dumper.match_subset_all
|
||||||
dumper.depth = depth
|
dumper.depth = depth
|
||||||
|
|
||||||
datablock_type = datablock.bl_rna.name
|
datablock_type = datablock.bl_rna.name
|
||||||
key = "{}/{}".format(datablock_type,datablock.name)
|
key = "{}/{}".format(datablock_type, datablock.name)
|
||||||
|
|
||||||
data = {}
|
data = {}
|
||||||
for attr in attributes:
|
for attr in attributes:
|
||||||
try:
|
try:
|
||||||
data[attr] = dumper.dump(getattr(datablock,attr))
|
data[attr] = dumper.dump(getattr(datablock, attr))
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
client.push_update(key, datablock_type, data)
|
client.push_update(key, datablock_type, data)
|
||||||
|
|
||||||
|
|
||||||
def upload_mesh(mesh):
|
def upload_mesh(mesh):
|
||||||
if mesh.bl_rna.name == 'Mesh':
|
if mesh.bl_rna.name == 'Mesh':
|
||||||
dump_datablock_attibute(mesh,['name','polygons','edges','vertices'],6)
|
dump_datablock_attibute(
|
||||||
|
mesh, ['name', 'polygons', 'edges', 'vertices'], 6)
|
||||||
|
|
||||||
|
|
||||||
def upload_material(mesh):
|
def upload_material(mesh):
|
||||||
if mesh.bl_rna.name == 'Material':
|
if mesh.bl_rna.name == 'Material':
|
||||||
dump_datablock_attibute(mesh,['name','node_tree'],7)
|
dump_datablock_attibute(mesh, ['name', 'node_tree'], 7)
|
||||||
|
|
||||||
|
|
||||||
def upload_client_position():
|
def upload_client_position():
|
||||||
global client
|
global client
|
||||||
@ -200,8 +209,8 @@ def upload_client_position():
|
|||||||
if data is None:
|
if data is None:
|
||||||
data = {}
|
data = {}
|
||||||
data['location'] = current_coords
|
data['location'] = current_coords
|
||||||
color = bpy.context.scene.session_settings.client_color
|
color = bpy.context.scene.session_settings.client_color
|
||||||
data['color'] = (color.r,color.g,color.b,1)
|
data['color'] = (color.r, color.g, color.b, 1)
|
||||||
client.push_update(key, 'client', data)
|
client.push_update(key, 'client', data)
|
||||||
elif current_coords[0] != data['location'][0]:
|
elif current_coords[0] != data['location'][0]:
|
||||||
data['location'] = current_coords
|
data['location'] = current_coords
|
||||||
@ -209,21 +218,22 @@ def upload_client_position():
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
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)
|
||||||
for light in bpy.data.lights:
|
for light in bpy.data.lights:
|
||||||
dump_datablock(light,1)
|
dump_datablock(light, 1)
|
||||||
for mat in bpy.data.materials:
|
for mat in bpy.data.materials:
|
||||||
dump_datablock(mat,7)
|
dump_datablock(mat, 7)
|
||||||
for mesh in bpy.data.meshes:
|
for mesh in bpy.data.meshes:
|
||||||
upload_mesh(mesh)
|
upload_mesh(mesh)
|
||||||
for object in bpy.data.objects:
|
for object in bpy.data.objects:
|
||||||
dump_datablock(object,1)
|
dump_datablock(object, 1)
|
||||||
for collection in bpy.data.collections:
|
for collection in bpy.data.collections:
|
||||||
dump_datablock(collection,4)
|
dump_datablock(collection, 4)
|
||||||
for scene in bpy.data.scenes:
|
for scene in bpy.data.scenes:
|
||||||
dump_datablock(scene,4)
|
dump_datablock(scene, 4)
|
||||||
|
|
||||||
|
|
||||||
def load_mesh(target=None, data=None, create=False):
|
def load_mesh(target=None, data=None, create=False):
|
||||||
@ -311,7 +321,7 @@ def load_scene(target=None, data=None, create=False):
|
|||||||
# Load other meshes metadata
|
# Load other meshes metadata
|
||||||
# dump_anything.load(target, data)
|
# dump_anything.load(target, data)
|
||||||
|
|
||||||
#Load master collection
|
# Load master collection
|
||||||
for object in data["collection"]["objects"]:
|
for object in data["collection"]["objects"]:
|
||||||
if object not in target.collection.objects.keys():
|
if object not in target.collection.objects.keys():
|
||||||
target.collection.objects.link(bpy.data.objects[object])
|
target.collection.objects.link(bpy.data.objects[object])
|
||||||
@ -320,7 +330,8 @@ def load_scene(target=None, data=None, create=False):
|
|||||||
# TODO: Recursive link
|
# TODO: Recursive link
|
||||||
for collection in data["collection"]["children"]:
|
for collection in data["collection"]["children"]:
|
||||||
if collection not in target.collection.children.keys():
|
if collection not in target.collection.children.keys():
|
||||||
target.collection.children.link(bpy.data.collections[collection])
|
target.collection.children.link(
|
||||||
|
bpy.data.collections[collection])
|
||||||
except:
|
except:
|
||||||
print("Collection loading error")
|
print("Collection loading error")
|
||||||
|
|
||||||
@ -388,7 +399,7 @@ def load_gpencil(target=None, data=None, create=False):
|
|||||||
def load_light(target=None, data=None, create=False, type=None):
|
def load_light(target=None, data=None, create=False, type=None):
|
||||||
try:
|
try:
|
||||||
if target is None and create:
|
if target is None and create:
|
||||||
bpy.data.lights.new(data["name"],data["type"])
|
bpy.data.lights.new(data["name"], data["type"])
|
||||||
|
|
||||||
# Load other meshes metadata
|
# Load other meshes metadata
|
||||||
dump_anything.load(target, data)
|
dump_anything.load(target, data)
|
||||||
@ -425,25 +436,25 @@ def update_scene(msg):
|
|||||||
create=net_vars.load_data)
|
create=net_vars.load_data)
|
||||||
elif msg.mtype == 'Mesh':
|
elif msg.mtype == 'Mesh':
|
||||||
load_mesh(target=target, data=msg.body,
|
load_mesh(target=target, data=msg.body,
|
||||||
create=net_vars.load_data)
|
create=net_vars.load_data)
|
||||||
elif msg.mtype == 'Collection':
|
elif msg.mtype == 'Collection':
|
||||||
load_collection(target=target, data=msg.body,
|
load_collection(target=target, data=msg.body,
|
||||||
create=net_vars.load_data)
|
create=net_vars.load_data)
|
||||||
elif msg.mtype == 'Material':
|
elif msg.mtype == 'Material':
|
||||||
load_material(target=target, data=msg.body,
|
load_material(target=target, data=msg.body,
|
||||||
create=net_vars.load_data)
|
create=net_vars.load_data)
|
||||||
elif msg.mtype == 'GreasePencil':
|
elif msg.mtype == 'GreasePencil':
|
||||||
load_gpencil(target=target, data=msg.body,
|
load_gpencil(target=target, data=msg.body,
|
||||||
create=net_vars.load_data)
|
create=net_vars.load_data)
|
||||||
elif msg.mtype == 'Scene':
|
elif msg.mtype == 'Scene':
|
||||||
load_scene(target=target, data=msg.body,
|
load_scene(target=target, data=msg.body,
|
||||||
create=net_vars.load_data)
|
create=net_vars.load_data)
|
||||||
elif 'Light' in msg.mtype:
|
elif 'Light' in msg.mtype:
|
||||||
load_light(target=target, data=msg.body,
|
load_light(target=target, data=msg.body,
|
||||||
create=net_vars.load_data)
|
create=net_vars.load_data)
|
||||||
elif msg.mtype == 'Camera' :
|
elif msg.mtype == 'Camera':
|
||||||
load_default(target=target, data=msg.body,
|
load_default(target=target, data=msg.body,
|
||||||
create=net_vars.load_data, type=msg.mtype)
|
create=net_vars.load_data, type=msg.mtype)
|
||||||
else:
|
else:
|
||||||
if msg.mtype == 'client':
|
if msg.mtype == 'client':
|
||||||
refresh_window()
|
refresh_window()
|
||||||
@ -451,9 +462,9 @@ def update_scene(msg):
|
|||||||
selected_objects = []
|
selected_objects = []
|
||||||
|
|
||||||
for k, v in client.property_map.items():
|
for k, v in client.property_map.items():
|
||||||
if v.mtype == 'clientObject':
|
if v.mtype == 'clientObject':
|
||||||
if client.id != v.id:
|
if client.id != v.id:
|
||||||
selected_objects.append(v.body['object'])
|
selected_objects.append(v.body['object'])
|
||||||
|
|
||||||
for obj in bpy.data.objects:
|
for obj in bpy.data.objects:
|
||||||
if obj.name in selected_objects:
|
if obj.name in selected_objects:
|
||||||
@ -508,10 +519,7 @@ class session_join(bpy.types.Operator):
|
|||||||
|
|
||||||
net_settings.is_running = True
|
net_settings.is_running = True
|
||||||
|
|
||||||
# REGISTER Updaters
|
register_ticks()
|
||||||
bpy.app.timers.register(tick)
|
|
||||||
bpy.app.timers.register(mesh_tick)
|
|
||||||
bpy.app.timers.register(object_tick)
|
|
||||||
|
|
||||||
bpy.ops.session.draw('INVOKE_DEFAULT')
|
bpy.ops.session.draw('INVOKE_DEFAULT')
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
@ -626,9 +634,8 @@ class session_stop(bpy.types.Operator):
|
|||||||
client = None
|
client = None
|
||||||
bpy.ops.asyncio.stop()
|
bpy.ops.asyncio.stop()
|
||||||
net_settings.is_running = False
|
net_settings.is_running = False
|
||||||
bpy.app.timers.unregister(tick)
|
|
||||||
bpy.app.timers.unregister(mesh_tick)
|
unregister_ticks()
|
||||||
bpy.app.timers.unregister(object_tick)
|
|
||||||
else:
|
else:
|
||||||
logger.debug("No server/client running.")
|
logger.debug("No server/client running.")
|
||||||
|
|
||||||
@ -646,7 +653,7 @@ class session_settings(bpy.types.PropertyGroup):
|
|||||||
buffer = bpy.props.StringProperty(name="None")
|
buffer = bpy.props.StringProperty(name="None")
|
||||||
is_running = bpy.props.BoolProperty(name="is_running", default=False)
|
is_running = bpy.props.BoolProperty(name="is_running", default=False)
|
||||||
load_data = bpy.props.BoolProperty(name="load_data", default=True)
|
load_data = bpy.props.BoolProperty(name="load_data", default=True)
|
||||||
init_scene = bpy.props.BoolProperty(name="load_data", default=True)
|
init_scene = bpy.props.BoolProperty(name="load_data", default=True)
|
||||||
clear_scene = bpy.props.BoolProperty(name="clear_scene", default=True)
|
clear_scene = bpy.props.BoolProperty(name="clear_scene", default=True)
|
||||||
update_frequency = bpy.props.FloatProperty(
|
update_frequency = bpy.props.FloatProperty(
|
||||||
name="update_frequency", default=0.008)
|
name="update_frequency", default=0.008)
|
||||||
@ -660,8 +667,9 @@ class session_settings(bpy.types.PropertyGroup):
|
|||||||
('CONNECT', 'connexion', 'connect to a session')},
|
('CONNECT', 'connexion', 'connect to a session')},
|
||||||
default='HOST')
|
default='HOST')
|
||||||
client_color = bpy.props.FloatVectorProperty(name="client_color",
|
client_color = bpy.props.FloatVectorProperty(name="client_color",
|
||||||
subtype='COLOR',
|
subtype='COLOR',
|
||||||
default=randomColor())
|
default=randomColor())
|
||||||
|
|
||||||
|
|
||||||
class session_draw_clients(bpy.types.Operator):
|
class session_draw_clients(bpy.types.Operator):
|
||||||
bl_idname = "session.draw"
|
bl_idname = "session.draw"
|
||||||
@ -719,10 +727,8 @@ class session_draw_clients(bpy.types.Operator):
|
|||||||
|
|
||||||
self.draw_items.clear()
|
self.draw_items.clear()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: refactor this ugly things
|
# TODO: refactor this ugly things
|
||||||
|
|
||||||
def create_batch(self):
|
def create_batch(self):
|
||||||
global client
|
global client
|
||||||
index = 0
|
index = 0
|
||||||
@ -746,11 +752,11 @@ class session_draw_clients(bpy.types.Operator):
|
|||||||
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)
|
||||||
for point in bbox_corners]
|
for point in bbox_corners]
|
||||||
|
|
||||||
shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR')
|
shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR')
|
||||||
|
|
||||||
color = values.body['color']
|
color = values.body['color']
|
||||||
batch = batch_for_shader(
|
batch = batch_for_shader(
|
||||||
shader, 'LINES', {"pos": coords}, indices=indices)
|
shader, 'LINES', {"pos": coords}, indices=indices)
|
||||||
|
|
||||||
@ -765,10 +771,10 @@ class session_draw_clients(bpy.types.Operator):
|
|||||||
)
|
)
|
||||||
|
|
||||||
shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR')
|
shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR')
|
||||||
position = values.body['location']
|
position = values.body['location']
|
||||||
color = values.body['color']
|
color = values.body['color']
|
||||||
batch = batch_for_shader(
|
batch = batch_for_shader(
|
||||||
shader, 'LINES', {"pos":position}, indices=indices)
|
shader, 'LINES', {"pos": position}, indices=indices)
|
||||||
|
|
||||||
self.draw_items.append(
|
self.draw_items.append(
|
||||||
(shader, batch, (position[1], values.id.decode()), color))
|
(shader, batch, (position[1], values.id.decode()), color))
|
||||||
@ -833,8 +839,9 @@ 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())
|
||||||
data = {}
|
data = {}
|
||||||
data['color'] = [session.client_color.r,session.client_color.g,session.client_color.b]
|
data['color'] = [session.client_color.r,
|
||||||
data['object'] = session.active_object.name
|
session.client_color.g, session.client_color.b]
|
||||||
|
data['object'] = session.active_object.name
|
||||||
client.push_update(
|
client.push_update(
|
||||||
key, 'clientObject', data)
|
key, 'clientObject', data)
|
||||||
|
|
||||||
@ -858,7 +865,6 @@ class session_draw_clients(bpy.types.Operator):
|
|||||||
self.unregister_handlers(context)
|
self.unregister_handlers(context)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class session_snapview(bpy.types.Operator):
|
class session_snapview(bpy.types.Operator):
|
||||||
bl_idname = "session.snapview"
|
bl_idname = "session.snapview"
|
||||||
bl_label = "draw clients"
|
bl_label = "draw clients"
|
||||||
@ -899,6 +905,7 @@ classes = (
|
|||||||
session_snapview,
|
session_snapview,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def mesh_tick():
|
def mesh_tick():
|
||||||
mesh = get_update("Mesh")
|
mesh = get_update("Mesh")
|
||||||
|
|
||||||
@ -907,26 +914,28 @@ def mesh_tick():
|
|||||||
|
|
||||||
return 2
|
return 2
|
||||||
|
|
||||||
|
|
||||||
def object_tick():
|
def object_tick():
|
||||||
|
|
||||||
obj = get_update("Object")
|
obj = get_update("Object")
|
||||||
|
|
||||||
if obj:
|
if obj:
|
||||||
dump_datablock_attibute(bpy.data.objects[obj],['matrix_world'])
|
dump_datablock_attibute(bpy.data.objects[obj], ['matrix_world'])
|
||||||
|
|
||||||
return 0.1
|
return 0.1
|
||||||
|
|
||||||
|
|
||||||
def material_tick():
|
def material_tick():
|
||||||
|
|
||||||
return 2
|
return 2
|
||||||
|
|
||||||
|
|
||||||
def tick():
|
def draw_tick():
|
||||||
upload_client_position()
|
upload_client_position()
|
||||||
|
|
||||||
return 0.1
|
return 0.1
|
||||||
|
|
||||||
# TODO: Enqueu tqsks
|
|
||||||
def depsgraph_update(scene):
|
def depsgraph_update(scene):
|
||||||
for c in bpy.context.depsgraph.updates.items():
|
for c in bpy.context.depsgraph.updates.items():
|
||||||
|
|
||||||
@ -936,10 +945,10 @@ def depsgraph_update(scene):
|
|||||||
if scene.session_settings.active_object:
|
if scene.session_settings.active_object:
|
||||||
if c[1].is_updated_geometry:
|
if c[1].is_updated_geometry:
|
||||||
if c[1].id.name == scene.session_settings.active_object.name:
|
if c[1].id.name == scene.session_settings.active_object.name:
|
||||||
add_update(c[1].id.bl_rna.name,c[1].id.name)
|
add_update(c[1].id.bl_rna.name, c[1].id.name)
|
||||||
elif c[1].is_updated_transform:
|
elif c[1].is_updated_transform:
|
||||||
if c[1].id.name == scene.session_settings.active_object.name:
|
if c[1].id.name == scene.session_settings.active_object.name:
|
||||||
add_update(c[1].id.bl_rna.name,c[1].id.name)
|
add_update(c[1].id.bl_rna.name, c[1].id.name)
|
||||||
|
|
||||||
# if c[1].id.bl_rna.name == 'Material' or c[1].id.bl_rna.name== 'Shader Nodetree':
|
# if c[1].id.bl_rna.name == 'Material' or c[1].id.bl_rna.name== 'Shader Nodetree':
|
||||||
print(c[1].id.bl_rna.name)
|
print(c[1].id.bl_rna.name)
|
||||||
@ -948,19 +957,34 @@ def depsgraph_update(scene):
|
|||||||
if data_name in bpy.data.objects.keys():
|
if data_name in bpy.data.objects.keys():
|
||||||
found = False
|
found = False
|
||||||
for k in client.property_map.keys():
|
for k in client.property_map.keys():
|
||||||
if data_name in k:
|
if data_name in k:
|
||||||
found = True
|
found = True
|
||||||
break
|
break
|
||||||
|
|
||||||
if not found:
|
if not found:
|
||||||
client.property_map["Object/{}".format(data_name)] = net_components.RCFMessage("Object/{}".format(data_name), "Object", None)
|
client.property_map["Object/{}".format(data_name)] = net_components.RCFMessage(
|
||||||
|
"Object/{}".format(data_name), "Object", None)
|
||||||
upload_mesh(bpy.data.objects[data_name].data)
|
upload_mesh(bpy.data.objects[data_name].data)
|
||||||
dump_datablock(bpy.data.objects[data_name],1)
|
dump_datablock(bpy.data.objects[data_name], 1)
|
||||||
dump_datablock(bpy.data.scenes[0],4)
|
dump_datablock(bpy.data.scenes[0], 4)
|
||||||
|
|
||||||
# dump_datablock(bpy.data.scenes[0],4)
|
# dump_datablock(bpy.data.scenes[0],4)
|
||||||
|
|
||||||
|
|
||||||
|
def register_ticks():
|
||||||
|
# REGISTER Updaters
|
||||||
|
bpy.app.timers.register(draw_tick)
|
||||||
|
bpy.app.timers.register(mesh_tick)
|
||||||
|
bpy.app.timers.register(object_tick)
|
||||||
|
|
||||||
|
|
||||||
|
def unregister_ticks():
|
||||||
|
# REGISTER Updaters
|
||||||
|
bpy.app.timers.unregister(draw_tick)
|
||||||
|
bpy.app.timers.unregister(mesh_tick)
|
||||||
|
bpy.app.timers.unregister(object_tick)
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
from bpy.utils import register_class
|
from bpy.utils import register_class
|
||||||
for cls in classes:
|
for cls in classes:
|
||||||
@ -970,6 +994,7 @@ def register():
|
|||||||
type=session_settings)
|
type=session_settings)
|
||||||
bpy.app.handlers.depsgraph_update_post.append(depsgraph_update)
|
bpy.app.handlers.depsgraph_update_post.append(depsgraph_update)
|
||||||
|
|
||||||
|
|
||||||
def unregister():
|
def unregister():
|
||||||
global server
|
global server
|
||||||
global client
|
global client
|
||||||
@ -993,7 +1018,6 @@ def unregister():
|
|||||||
for cls in reversed(classes):
|
for cls in reversed(classes):
|
||||||
unregister_class(cls)
|
unregister_class(cls)
|
||||||
|
|
||||||
|
|
||||||
del bpy.types.Scene.session_settings
|
del bpy.types.Scene.session_settings
|
||||||
|
|
||||||
|
|
||||||
|
@ -102,7 +102,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(),values.body, info))
|
text="{} - {}".format(values.id.decode(), 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(
|
||||||
|
@ -1,29 +0,0 @@
|
|||||||
from . import net_components
|
|
||||||
import bpy
|
|
||||||
import mathutils
|
|
||||||
|
|
||||||
def set_vector(value):
|
|
||||||
return [value.x, value.y, value.z]
|
|
||||||
|
|
||||||
def get_vector(value):
|
|
||||||
return mathutils.Vector(
|
|
||||||
(value[0], value[1], value[2]))
|
|
||||||
|
|
||||||
class RNAFactory(net_components.RCFFactory):
|
|
||||||
def load_getter(self, data):
|
|
||||||
print("load RNA getter")
|
|
||||||
getter = None
|
|
||||||
if isinstance(data.body, mathutils.Vector):
|
|
||||||
print("Vector")
|
|
||||||
getter = get_vector
|
|
||||||
|
|
||||||
return getter
|
|
||||||
|
|
||||||
def load_setter(self,data):
|
|
||||||
print("load RNA setter")
|
|
||||||
setter = None
|
|
||||||
if isinstance(data.body, mathutils.Vector):
|
|
||||||
print("Vector")
|
|
||||||
setter = set_vector
|
|
||||||
|
|
||||||
return setter
|
|
184
server.json
184
server.json
@ -1,184 +0,0 @@
|
|||||||
{
|
|
||||||
"active_material": "Material",
|
|
||||||
"active_material_index": 0,
|
|
||||||
"active_shape_key_index": 0,
|
|
||||||
"data": "Cube",
|
|
||||||
"delta_location": [
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
"delta_scale": [
|
|
||||||
1.0,
|
|
||||||
1.0,
|
|
||||||
1.0
|
|
||||||
],
|
|
||||||
"dimensions": [
|
|
||||||
2.0,
|
|
||||||
2.0,
|
|
||||||
2.0
|
|
||||||
],
|
|
||||||
"display_bounds_type": "BOX",
|
|
||||||
"display_type": "TEXTURED",
|
|
||||||
"empty_display_size": 1.0,
|
|
||||||
"empty_display_type": "ARROWS",
|
|
||||||
"empty_image_depth": "DEFAULT",
|
|
||||||
"empty_image_side": "DOUBLE_SIDED",
|
|
||||||
"hide_render": false,
|
|
||||||
"hide_select": false,
|
|
||||||
"hide_viewport": false,
|
|
||||||
"instance_faces_scale": 1.0,
|
|
||||||
"instance_type": "NONE",
|
|
||||||
"is_evaluated": false,
|
|
||||||
"is_from_instancer": false,
|
|
||||||
"is_from_set": false,
|
|
||||||
"is_instancer": false,
|
|
||||||
"is_library_indirect": false,
|
|
||||||
"location": [
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
"lock_rotation_w": false,
|
|
||||||
"lock_rotations_4d": false,
|
|
||||||
"matrix_basis": [
|
|
||||||
[
|
|
||||||
1.0,
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
1.0,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
1.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
1.0
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"matrix_local": [
|
|
||||||
[
|
|
||||||
1.0,
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
1.0,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
1.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
1.0
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"matrix_parent_inverse": [
|
|
||||||
[
|
|
||||||
1.0,
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
1.0,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
1.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
1.0
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"matrix_world": [
|
|
||||||
[
|
|
||||||
1.0,
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
1.0,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
1.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
1.0
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"mode": "OBJECT",
|
|
||||||
"name": "Cube",
|
|
||||||
"name_full": "Cube",
|
|
||||||
"original": "Cube",
|
|
||||||
"parent_bone": "",
|
|
||||||
"parent_type": "OBJECT",
|
|
||||||
"pass_index": 0,
|
|
||||||
"rotation_mode": "XYZ",
|
|
||||||
"scale": [
|
|
||||||
1.0,
|
|
||||||
1.0,
|
|
||||||
1.0
|
|
||||||
],
|
|
||||||
"show_all_edges": false,
|
|
||||||
"show_axis": false,
|
|
||||||
"show_bounds": false,
|
|
||||||
"show_empty_image_orthographic": true,
|
|
||||||
"show_empty_image_perspective": true,
|
|
||||||
"show_in_front": false,
|
|
||||||
"show_instancer_for_render": true,
|
|
||||||
"show_instancer_for_viewport": true,
|
|
||||||
"show_name": false,
|
|
||||||
"show_only_shape_key": false,
|
|
||||||
"show_texture_space": false,
|
|
||||||
"show_transparent": false,
|
|
||||||
"show_wire": false,
|
|
||||||
"tag": false,
|
|
||||||
"track_axis": "POS_Y",
|
|
||||||
"type": "MESH",
|
|
||||||
"up_axis": "Z",
|
|
||||||
"use_dynamic_topology_sculpting": false,
|
|
||||||
"use_fake_user": false,
|
|
||||||
"use_instance_faces_scale": false,
|
|
||||||
"use_instance_vertices_rotation": false,
|
|
||||||
"use_shape_key_edit_mode": false,
|
|
||||||
"users": 1
|
|
||||||
}
|
|
Reference in New Issue
Block a user