diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2015-06-23 13:59:21 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2015-06-23 13:59:21 +0300 |
commit | d2aa512ae8b1b326f41616a4109e7dadb36bd9d5 (patch) | |
tree | 23d8d856a662f365f630c1ba1c3d44bce7486de4 /io_scene_fbx | |
parent | e7f523325bdac580e28b6b4eca5e5badfbbd114e (diff) |
Fix T45157: FBX Import could do with better bone alignment in pure-joints armature case.
Note that, since I do not have any skinned zero-aligned bones FBX file at hands, I do not
know whether this option breaks skinning or not (hard to predict, we are playing with
at least four different matrices/transforms here)... Time will say.
Diffstat (limited to 'io_scene_fbx')
-rw-r--r-- | io_scene_fbx/__init__.py | 15 | ||||
-rw-r--r-- | io_scene_fbx/fbx_utils.py | 3 | ||||
-rw-r--r-- | io_scene_fbx/import_fbx.py | 13 |
3 files changed, 19 insertions, 12 deletions
diff --git a/io_scene_fbx/__init__.py b/io_scene_fbx/__init__.py index ece5f976..92b32af3 100644 --- a/io_scene_fbx/__init__.py +++ b/io_scene_fbx/__init__.py @@ -21,7 +21,7 @@ bl_info = { "name": "FBX format", "author": "Campbell Barton, Bastien Montagne, Jens Restemeier", - "version": (3, 3, 3), + "version": (3, 3, 4), "blender": (2, 74, 0), "location": "File > Import-Export", "description": "FBX IO meshes, UV's, vertex colors, materials, textures, cameras, lamps and actions", @@ -100,40 +100,40 @@ class ImportFBX(bpy.types.Operator, ImportHelper, IOFBXOrientationHelper): name="Alpha Decals", description="Treat materials with alpha as decals (no shadow casting)", default=False, - options={'HIDDEN'} ) decal_offset = FloatProperty( name="Decal Offset", description="Displace geometry of alpha meshes", min=0.0, max=1.0, default=0.0, - options={'HIDDEN'} ) use_custom_props = BoolProperty( name="Import User Properties", description="Import user properties as custom properties", default=True, - options={'HIDDEN'}, ) use_custom_props_enum_as_string = BoolProperty( name="Import Enums As Strings", description="Store enumeration values as strings", default=True, - options={'HIDDEN'}, ) ignore_leaf_bones = BoolProperty( name="Ignore Leaf Bones", description="Ignore the last bone at the end of each chain (used to mark the length of the previous bone)", default=False, - options={'HIDDEN'}, + ) + force_connect_children = BoolProperty( + name="Force Connect Children", + description="Force connection of children bones to their parent, even if their computed head/tail " + "positions do not match (can be useful with pure-joints-type armatures)", + default=False, ) automatic_bone_orientation = BoolProperty( name="Automatic Bone Orientation", description="Try to align the major bone axis with the bone children", default=False, - options={'HIDDEN'}, ) primary_bone_axis = EnumProperty( name="Primary Bone Axis", @@ -186,6 +186,7 @@ class ImportFBX(bpy.types.Operator, ImportHelper, IOFBXOrientationHelper): layout.prop(self, "ignore_leaf_bones") + layout.prop(self, "force_connect_children"), layout.prop(self, "automatic_bone_orientation"), sub = layout.column() sub.enabled = not self.automatic_bone_orientation diff --git a/io_scene_fbx/fbx_utils.py b/io_scene_fbx/fbx_utils.py index f5a8e1dd..1058150e 100644 --- a/io_scene_fbx/fbx_utils.py +++ b/io_scene_fbx/fbx_utils.py @@ -1227,5 +1227,6 @@ FBXImportSettings = namedtuple("FBXImportSettings", ( "use_alpha_decals", "decal_offset", "use_custom_props", "use_custom_props_enum_as_string", "cycles_material_wrap_map", "image_cache", - "ignore_leaf_bones", "automatic_bone_orientation", "bone_correction_matrix", "use_prepost_rot", + "ignore_leaf_bones", "force_connect_children", "automatic_bone_orientation", "bone_correction_matrix", + "use_prepost_rot", )) diff --git a/io_scene_fbx/import_fbx.py b/io_scene_fbx/import_fbx.py index 7a2808db..2eaf2f95 100644 --- a/io_scene_fbx/import_fbx.py +++ b/io_scene_fbx/import_fbx.py @@ -1762,7 +1762,7 @@ class FbxImportHelperNode: for child in self.children: child.collect_armature_meshes() - def build_skeleton(self, arm, parent_matrix, parent_bone_size=1): + def build_skeleton(self, arm, parent_matrix, parent_bone_size=1, force_connect_children=False): # ---- # Now, create the (edit)bone. bone = arm.bl_data.edit_bones.new(name=self.fbx_name) @@ -1802,11 +1802,15 @@ class FbxImportHelperNode: if child.ignore: continue if child.is_bone: - child_bone = child.build_skeleton(arm, bone_matrix, bone_size) + child_bone = child.build_skeleton(arm, bone_matrix, bone_size, + force_connect_children=force_connect_children) # Connection to parent. child_bone.parent = bone if similar_values_iter(bone.tail, child_bone.head): child_bone.use_connect = True + elif force_connect_children: + bone.tail = child_bone.head + child_bone.use_connect = True return bone @@ -1977,7 +1981,7 @@ class FbxImportHelperNode: if child.ignore: continue if child.is_bone: - child_obj = child.build_skeleton(self, Matrix()) + child.build_skeleton(self, Matrix(), force_connect_children=settings.force_connect_children) bpy.ops.object.mode_set(mode='OBJECT') @@ -2075,6 +2079,7 @@ def load(operator, context, filepath="", use_custom_props=True, use_custom_props_enum_as_string=True, ignore_leaf_bones=False, + force_connect_children=False, automatic_bone_orientation=False, primary_bone_axis='Y', secondary_bone_axis='X', @@ -2199,7 +2204,7 @@ def load(operator, context, filepath="", use_alpha_decals, decal_offset, use_custom_props, use_custom_props_enum_as_string, cycles_material_wrap_map, image_cache, - ignore_leaf_bones, automatic_bone_orientation, bone_correction_matrix, + ignore_leaf_bones, force_connect_children, automatic_bone_orientation, bone_correction_matrix, use_prepost_rot, ) |