diff --git a/client.json b/client.json new file mode 100644 index 0000000..d766688 --- /dev/null +++ b/client.json @@ -0,0 +1,184 @@ +{ + "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 +} \ No newline at end of file diff --git a/libs/dump_anything.py b/libs/dump_anything.py index b81519d..221e537 100644 --- a/libs/dump_anything.py +++ b/libs/dump_anything.py @@ -226,6 +226,7 @@ class Loader: if filter_function(any): load_function(any, dump) return + def _load_identity(self, element, dump): element.write(dump) @@ -298,6 +299,7 @@ class Loader: return # TODO error handling for k in self._ordered_keys(dump.keys()): v = dump[k] + print(k) if not hasattr(default.read(), k): continue # TODO error handling self._load_any(default.extend(k), v) diff --git a/net_operators.py b/net_operators.py index 6f486d4..95132f2 100644 --- a/net_operators.py +++ b/net_operators.py @@ -120,67 +120,6 @@ def randomStringDigits(stringLength=6): return ''.join(random.choice(lettersAndDigits) for i in range(stringLength)) -def match_supported_types(value): - type_factory = None - - if isinstance(value, bool): - print("float") - elif isinstance(value, mathutils.Vector): - print("vector") - type_factory = VectorTypeTranslation() - elif isinstance(value, mathutils.Euler): - print("Euler") - elif type(value) in NATIVE_TYPES: - print("native") - else: - raise NotImplementedError - - return type_factory - - -# TODO: Less ugly method -def from_bpy(value): - # logger.debug(' casting from bpy') - value_type = type(value) - value_casted = None - - if value_type is mathutils.Vector or value_type is mathutils.Euler: - value_casted = [value.x, value.y, value.z] - elif isinstance(value,mathutils.Matrix): - value_casted = [] - for r in value.row: - value_casted.extend([r[0], r[1], r[2],r[3]]) - elif value_type is bpy.props.collection: - pass # TODO: Collection replication - # elif value_type is mathutils.Euler: - # value_casted = [value.x, value.y, value.z] - elif value_type in NATIVE_TYPES: - value_casted = value - - return str(value.__class__.__name__), value_casted - - -def to_bpy(store_item): - """ - Get bpy value from store - """ - value_type = store_item.mtype - value_casted = None - store_value = store_item.body - - if value_type == 'Vector' or 'Euler': - value_casted = mathutils.Vector( - (store_value[0], store_value[1], store_value[2])) - if value_type == 'Matrix': - mat = mathutils.Matrix() - mat[0] = mathutils.Vector((store_value[0], store_value[1], store_value[2], store_value[3])) - mat[1] = mathutils.Vector((store_value[4], store_value[5], store_value[6], store_value[7])) - mat[2] = mathutils.Vector((store_value[8], store_value[9], store_value[10], store_value[11])) - mat[3] = mathutils.Vector((store_value[12], store_value[13], store_value[14], store_value[15])) - value_casted = mat - return value_casted - - def resolve_bpy_path(path): """ Get bpy property value from path @@ -229,6 +168,33 @@ def refresh_window(): def init_scene(): global client +def load_mesh(target,data): + import bmesh + + mesh_buffer = bmesh.new() + + for i in data["vertices"]: + mesh_buffer.verts.new(data["vertices"][i]["co"]) + + mesh_buffer.verts.ensure_lookup_table() + + for i in data["edges"]: + verts = mesh_buffer.verts + v1 = data["edges"][i]["vertices"][0] + v2 = data["edges"][i]["vertices"][1] + mesh_buffer.edges.new([verts[v1],verts[v2]]) + + for p in data["polygons"]: + verts = [] + for v in data["polygons"][p]["vertices"]: + verts.append(mesh_buffer.verts[v]) + + + if len(verts) > 0: + mesh_buffer.faces.new(verts) + + + mesh_buffer.to_mesh(target) def update_scene(msg): global client @@ -240,19 +206,24 @@ def update_scene(msg): if bpy.context.scene.session_settings.active_object.name in msg.key: raise ValueError() - item = resolve_bpy_path(msg.key) - - if item: - loader = dump_anything.Loader() - loader.load(item, msg.body) - + if msg.mtype == 'Mesh' or 'Object': + item = resolve_bpy_path(msg.key) + + if item: + loader = dump_anything.Loader() + loader.load(item,msg.body) + + if msg.mtype == 'Mesh': + load_mesh(item, msg.body) + + print("LOADED") # print(msg.get) # logger.debug("Updating scene:\n object: {} attribute: {} , value: {}".format( # obj, attr_name, value)) # setattr(obj, attr_name, value) # except: - # pass + # passñ else: pass # logger.debug('no need to update scene on our own') @@ -334,7 +305,7 @@ class session_add_property(bpy.types.Operator): dumper = dump_anything.Dumper() dumper.type_subset = dumper.match_subset_all - dumper.depth = 3 + dumper.depth = 4 data = dumper.dump(item) data_type = item.__class__.__name__ diff --git a/server.json b/server.json new file mode 100644 index 0000000..d142e1f --- /dev/null +++ b/server.json @@ -0,0 +1,184 @@ +{ + "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 +} \ No newline at end of file