import os import bpy import mathutils import bpy_extras.io_utils BASE_PATH = "/home/malloc/Documents/link_test/" def bone_id(name: str): if(len(name) < 3): return None bid = name[0:3] if(bid[2] != "."): return None try: bid = int(bid[0:2], 16) except: bid = None return bid def triangulate_mesh(mesh): import bmesh bm = bmesh.new() bm.from_mesh(mesh) bmesh.ops.triangulate(bm, faces=bm.faces) bm.to_mesh(mesh) bm.free() def write_mesh(object): vertices = weights = normals = texuvs = faces = bones = [] mesh: bpy.types.Mesh = None armature: bpy.types.Armature = None try: mesh = object.to_mesh(bpy.data.scenes[0], False, settings='PREVIEW', calc_tessface=False) except: print("Could not copy mesh.") return if object.parent != None and object.parent.type == 'ARMATURE': armature = object.parent.data bones = [(bone_id(group.name), armature.bones[group.name]) for group in object.vertex_groups] check = [bone for bone in bones if bone[0] == None] if len(check) > 0: for bone in check: print("Bone", bone[1].name, "is not named according to format 'XX.NAME'") return triangulate_mesh(mesh) mesh.transform(object.matrix_world) if(object.matrix_world.determinant() < 0.0): mesh.flip_normals() mesh.calc_normals_split() vertices = mesh.vertices[:] if armature: weights = [list( (group.group, group.weight) for group in vertex.groups) for vertex in vertices] normals = [vertex.normal for vertex in vertices] tris = [(i, tri) for i, tri in enumerate(mesh.polygons)] for i, tri in tris: bpy.data.meshes.remove(mesh) def write_armature(object): pass #fw(b"\xDE\xAF\xB0\x0B") os.makedirs(BASE_PATH, exist_ok=True) for object in bpy.data.objects: if object.type == 'MESH' : write_mesh(object) elif object.type == 'ARMATURE': write_armature(object)