[Bf-extensions-cvs] [ba7f423] master: Fix T40516: Binary FBX export missing deform bones only option.

Bastien Montagne noreply at git.blender.org
Fri Jun 6 09:41:32 CEST 2014


Commit: ba7f4237ef7587c1bb80fe0004d00dee83624fca
Author: Bastien Montagne
Date:   Fri Jun 6 09:00:10 2014 +0200
https://developer.blender.org/rBAba7f4237ef7587c1bb80fe0004d00dee83624fca

Fix T40516: Binary FBX export missing deform bones only option.

===================================================================

M	io_scene_fbx/__init__.py
M	io_scene_fbx/export_fbx_bin.py

===================================================================

diff --git a/io_scene_fbx/__init__.py b/io_scene_fbx/__init__.py
index ecb35d1..b30296c 100644
--- a/io_scene_fbx/__init__.py
+++ b/io_scene_fbx/__init__.py
@@ -253,10 +253,9 @@ class ExportFBX(bpy.types.Operator, ExportHelper):
         description="Export custom properties",
         default=False,
     )
-    # 6.1 only
     use_armature_deform_only = BoolProperty(
         name="Only Deform Bones",
-        description="Only write deforming bones",
+        description="Only write deforming bones (and non-deforming ones when they have deforming children)",
         default=False,
     )
     # Anim - 7.4
@@ -363,6 +362,7 @@ class ExportFBX(bpy.types.Operator, ExportHelper):
         layout.prop(self, "mesh_smooth_type")
         layout.prop(self, "use_mesh_edges")
         layout.prop(self, "use_tspace")
+        layout.prop(self, "use_armature_deform_only")
         if is_74bin:
             layout.prop(self, "use_custom_properties")
             layout.prop(self, "bake_anim")
@@ -373,7 +373,6 @@ class ExportFBX(bpy.types.Operator, ExportHelper):
             col.prop(self, "bake_anim_step")
             col.prop(self, "bake_anim_simplify_factor")
         else:
-            layout.prop(self, "use_armature_deform_only")
             layout.prop(self, "use_anim")
             col = layout.column()
             col.enabled = self.use_anim
diff --git a/io_scene_fbx/export_fbx_bin.py b/io_scene_fbx/export_fbx_bin.py
index dac4721..1475f2e 100644
--- a/io_scene_fbx/export_fbx_bin.py
+++ b/io_scene_fbx/export_fbx_bin.py
@@ -1220,9 +1220,10 @@ def fbx_data_armature_elements(root, arm_obj, scene_data):
     Note armature itself has no data, it is a mere "Null" Model...
     """
     mat_world_arm = arm_obj.fbx_object_matrix(scene_data, global_space=True)
+    bones = tuple(bo_obj for bo_obj in arm_obj.bones if bo_obj in scene_data.objects)
 
     # Bones "data".
-    for bo_obj in arm_obj.bones:
+    for bo_obj in bones:
         bo = bo_obj.bdata
         bo_data_key = scene_data.data_bones[bo_obj]
         fbx_bo = elem_data_single_int64(root, b"NodeAttribute", get_fbx_uuid_from_key(bo_data_key))
@@ -1254,7 +1255,7 @@ def fbx_data_armature_elements(root, arm_obj, scene_data):
 
             elem_data_single_string(fbx_pose, b"Type", b"BindPose")
             elem_data_single_int32(fbx_pose, b"Version", FBX_POSE_BIND_VERSION)
-            elem_data_single_int32(fbx_pose, b"NbPoseNodes", 1 + len(arm_obj.bdata.data.bones))
+            elem_data_single_int32(fbx_pose, b"NbPoseNodes", 1 + len(bones))
 
             # First node is mesh/object.
             mat_world_obj = ob_obj.fbx_object_matrix(scene_data, global_space=True)
@@ -1263,7 +1264,7 @@ def fbx_data_armature_elements(root, arm_obj, scene_data):
             elem_data_single_float64_array(fbx_posenode, b"Matrix", matrix_to_array(mat_world_obj))
             # And all bones of armature!
             mat_world_bones = {}
-            for bo_obj in arm_obj.bones:
+            for bo_obj in bones:
                 bomat = bo_obj.fbx_object_matrix(scene_data, rest=True, global_space=True)
                 mat_world_bones[bo_obj] = bomat
                 fbx_posenode = elem_empty(fbx_pose, b"PoseNode")
@@ -1522,15 +1523,27 @@ def fbx_skeleton_from_armature(scene, settings, arm_obj, objects, data_meshes,
     arm_parents is a set of tuples (armature, object) for all successful armature bindings.
     """
     arm_data = arm_obj.bdata.data
-    bones = OrderedDict()  # Because we do not have any ordered set :/
+    bones = OrderedDict()
     for bo in arm_obj.bones:
-        data_key = get_blender_bone_key(arm_obj.bdata, bo.bdata)
-        data_bones[bo] = data_key
-        bones[bo] = None
+        if settings.use_armature_deform_only:
+            if bo.bdata.use_deform:
+                bones[bo] = True
+                bo_par = bo.parent
+                while bo_par.is_bone:
+                    bones[bo_par] = True
+                    bo_par = bo_par.parent
+            elif bo not in bones:  # Do not override if already set in the loop above!
+                bones[bo] = False
+        else:
+            bones[bo] = True
+
+    bones = OrderedDict((bo, None) for bo, use in bones.items() if use)
 
     if not bones:
         return
 
+    data_bones.update((bo, get_blender_bone_key(arm_obj.bdata, bo.bdata)) for bo in bones)
+
     for ob_obj in objects:
         if not (ob_obj.is_object and ob_obj.type == 'MESH' and ob_obj.parent == arm_obj):
             continue
@@ -1625,7 +1638,7 @@ def fbx_animations_objects_do(scene_data, ref_id, f_start, f_end, start_zero, ob
             if not ob_obj.is_object:
                 continue
             if ob_obj.type == 'ARMATURE':
-                objects |= set(ob_obj.bones)
+                objects |= {bo_obj for bo_obj in ob_obj.bones if bo_obj in scene_data.objects}
             ob_obj.dupli_list_create(scene, 'RENDER')
             for dp_obj in ob_obj.dupli_list:
                 if dp_obj in scene_data.objects:
@@ -2442,6 +2455,7 @@ def save_single(operator, scene, filepath="",
                 object_types=None,
                 use_mesh_modifiers=True,
                 mesh_smooth_type='FACE',
+                use_armature_deform_only=False,
                 bake_anim=True,
                 bake_anim_use_nla_strips=True,
                 bake_anim_use_all_actions=True,
@@ -2489,7 +2503,7 @@ def save_single(operator, scene, filepath="",
         operator.report, (axis_up, axis_forward), global_matrix, global_scale,
         bake_space_transform, global_matrix_inv, global_matrix_inv_transposed,
         context_objects, object_types, use_mesh_modifiers,
-        mesh_smooth_type, use_mesh_edges, use_tspace, False,
+        mesh_smooth_type, use_mesh_edges, use_tspace, use_armature_deform_only,
         bake_anim, bake_anim_use_nla_strips, bake_anim_use_all_actions, bake_anim_step, bake_anim_simplify_factor,
         False, media_settings, use_custom_properties,
     )



More information about the Bf-extensions-cvs mailing list