123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- import bpy, os
- from lxml import etree
- from . import collada_funcs
- from . import blender_funcs
- from . import math_funcs
- def import_collada_superbmd(context, filepath):
-
-
- scene = bpy.context.scene
-
-
-
-
- xml = collada_funcs.check_collada(filepath)
- if (xml == None):
- blender_funcs.disp_msg("Collada file isn't well formatted")
- return {'FINISHED'}
-
-
- root = xml.getroot()
-
- if (os.name == "posix"):
- for image in root.find("library_images"):
- tmp = image.find("init_from").text
- while (tmp[0] != '\\'):
- tmp = tmp[1:]
- image.find("init_from").text = tmp.replace("\\", "/")
-
-
- xml.write(filepath + ".xml", pretty_print = True)
- bpy.ops.wm.collada_import(filepath = filepath + ".xml")
-
- os.remove(filepath + ".xml")
-
-
-
-
- armature = bpy.data.objects[-1]
-
-
- blender_funcs.select_obj(scene, armature, False)
-
-
-
-
- bpy.ops.object.mode_set(mode = 'EDIT')
- bpy.ops.armature.select_all(action = 'SELECT')
- bpy.ops.armature.delete()
-
-
-
-
- bind_matrices = {}
- for controller in root.find("library_controllers").findall("controller"):
- bone_names = controller[0][1][0].text.split()
- bone_matrices = controller[0][2][0].text
- for i in range(0, len(bone_names)):
- mat = collada_funcs.get_text_mat4x4(bone_matrices, 16 * i).inverted()
- dict_entry = {bone_names[i] : mat}
- bind_matrices.update(dict_entry)
-
-
-
- rest_matrices = {}
-
-
- jnt_root_node = root.find("library_visual_scenes").find("visual_scene")
- for node in jnt_root_node:
- if (node.attrib["name"] == "skeleton_root"):
- jnt_root_node = node.find("node")
- break
-
-
- bpy.ops.object.mode_set(mode='EDIT')
- jnts_same_level = [jnt_root_node]
- is_first_jnt = True
- while (jnts_same_level != []):
-
-
- next_jnts = []
- for jnt in jnts_same_level:
- for elem in jnt.getchildren():
- if (elem.tag == "node"):
- next_jnts.append(elem)
-
-
- for jnt in jnts_same_level:
- jnt_name = jnt.attrib["name"]
-
- bpy.ops.armature.bone_primitive_add(name = jnt_name)
- armature.data.edit_bones[jnt_name].length = 10
- mat = collada_funcs.get_text_mat4x4(jnt.find("matrix").text, 0)
-
- if (is_first_jnt == False):
- parent_name = jnt.getparent().attrib["name"]
-
- armature.data.edit_bones[jnt_name].parent = armature.data.edit_bones[parent_name]
-
- if (mat.determinant() == 0):
- mat = math_funcs.get_id_mat4x4()
-
- rest_matrices.update({jnt_name : mat})
-
- jnts_same_level = next_jnts
- is_first_jnt = False
-
-
- for i in range(0, len(armature.data.edit_bones)):
- bone = armature.data.edit_bones[i]
- if (bone.name in bind_matrices):
- bone.matrix = bind_matrices[bone.name]
- else:
- if (bone.parent != None):
- bone.matrix = bone.parent.matrix * rest_matrices[bone.name]
- else:
- bone.matrix = rest_matrices[bone.name]
-
-
- bpy.ops.object.mode_set(mode='POSE')
-
-
- for bone in armature.pose.bones:
- if (bone.parent != None):
- bone.matrix = bone.parent.matrix * rest_matrices[bone.name]
- else:
- bone.matrix = rest_matrices[bone.name]
-
-
- bpy.ops.object.mode_set(mode='OBJECT')
- for child in armature.children:
- blender_funcs.select_obj(scene, child, False)
- bpy.ops.object.convert(target='MESH')
-
-
- blender_funcs.select_obj(scene, armature, False)
- bpy.ops.object.mode_set(mode='POSE')
- bpy.ops.pose.armature_apply()
-
-
- bpy.ops.object.mode_set(mode='OBJECT')
- for child in armature.children:
- blender_funcs.select_obj(scene, child, False)
- bpy.ops.object.modifier_add(type = 'ARMATURE')
- child.modifiers["Armature"].object = armature
- child.modifiers["Armature"].use_vertex_groups = True
-
-
- armature.scale = (0.01, 0.01, 0.01)
- blender_funcs.transf_apply_recurse(scene, armature, True, True, True)
-
-
- blender_funcs.disp_msg("SuperBMD Collada file imported!")
- return {'FINISHED'}
- from bpy_extras.io_utils import ExportHelper
- from bpy.props import StringProperty, BoolProperty, EnumProperty
- from bpy.types import Operator
- class import_superbmd_collada(Operator, ExportHelper):
- """Import a Collada file from SuperBMD (SuperBMD only)"""
- bl_idname = "import_scene.superbmd_collada"
- bl_label = "Import SuperBMD Collada (.DAE)"
-
- filename_ext = ".dae"
- filter_glob = StringProperty(default = "*.dae", options = {'HIDDEN'}, maxlen = 255)
-
- def execute(self, context):
- return import_collada_superbmd(context, self.filepath)
- def menu_import_superbmd_collada(self, context):
- self.layout.operator(import_superbmd_collada.bl_idname, text="SuperBMD Collada (.dae)")
- bpy.utils.register_class(import_superbmd_collada)
- bpy.types.INFO_MT_file_import.append(menu_import_superbmd_collada)
- bpy.ops.import_scene.superbmd_collada('INVOKE_DEFAULT')
|