[Bf-extensions-cvs] [aa634bc] master: FBX: Add option (enabled by default) to export each strip from NLA in a separated baked animstack (in addition to global anim from scene).

Bastien Montagne noreply at git.blender.org
Wed Apr 9 18:22:20 CEST 2014


Commit: aa634bcea0b8d241d1846e87286a598c2b527b6c
Author: Bastien Montagne
Date:   Wed Apr 9 18:20:11 2014 +0200
https://developer.blender.org/rBAaa634bcea0b8d241d1846e87286a598c2b527b6c

FBX: Add option (enabled by default) to export each strip from NLA in a separated baked animstack
(in addition to global anim from scene).

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

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 6b6ceeb..0347471 100644
--- a/io_scene_fbx/__init__.py
+++ b/io_scene_fbx/__init__.py
@@ -258,6 +258,11 @@ class ExportFBX(bpy.types.Operator, ExportHelper):
         description="Export baked keyframe animation",
         default=True,
     )
+    bake_anim_use_nla_strips = BoolProperty(
+        name="NLA Strips",
+        description="Export each non-muted NLA strip as a separated FBX's AnimStack, if any",
+        default=True,
+    )
     bake_anim_step = FloatProperty(
         name="Sampling Rate",
         description=("How often to evaluate animated values (in frames)"),
diff --git a/io_scene_fbx/export_fbx_bin.py b/io_scene_fbx/export_fbx_bin.py
index 2133cb5..f26dfc0 100644
--- a/io_scene_fbx/export_fbx_bin.py
+++ b/io_scene_fbx/export_fbx_bin.py
@@ -254,14 +254,20 @@ def get_blender_bone_cluster_key(armature, mesh, bone):
                      get_blenderID_key(bone), "SubDeformerCluster"))
 
 
-def get_blender_anim_stack_key(scene):
+def get_blender_anim_stack_key(scene, ID=None):
     """Return single anim stack key."""
-    return "|".join((get_blenderID_key(scene), "AnimStack"))
+    if ID:
+        return "|".join((get_blenderID_key(scene), get_blenderID_key(ID), "AnimStack"))
+    else:
+        return "|".join((get_blenderID_key(scene), "AnimStack"))
 
 
-def get_blender_anim_layer_key(ID):
+def get_blender_anim_layer_key(scene, ID=None):
     """Return ID's anim layer key."""
-    return "|".join((get_blenderID_key(ID), "AnimLayer"))
+    if ID:
+        return "|".join((get_blenderID_key(scene), get_blenderID_key(ID), "AnimLayer"))
+    else:
+        return "|".join((get_blenderID_key(scene), "AnimLayer"))
 
 
 def get_blender_anim_curve_node_key(ID, fbx_prop_name):
@@ -1917,77 +1923,76 @@ def fbx_data_animation_elements(root, scene_data):
     def keys_to_ktimes(keys):
         return (int(v) for v in units_convert_iter((f / fps for f, _v in keys), "second", "ktime"))
 
-    astack_key, alayers, alayer_key = animations
-
-    # Animation stack.
-    astack = elem_data_single_int64(root, b"AnimationStack", get_fbxuid_from_key(astack_key))
-    astack.add_string(fbx_name_class(scene.name.encode(), b"AnimStack"))
-    astack.add_string(b"")
+    # Animation stacks.
+    for astack_key, alayers, alayer_key, name, f_start, f_end in animations:
+        astack = elem_data_single_int64(root, b"AnimationStack", get_fbxuid_from_key(astack_key))
+        astack.add_string(fbx_name_class(name, b"AnimStack"))
+        astack.add_string(b"")
+
+        astack_tmpl = elem_props_template_init(scene_data.templates, b"AnimationStack")
+        astack_props = elem_properties(astack)
+        r = scene_data.scene.render
+        fps = r.fps / r.fps_base
+        start = int(units_convert(f_start / fps, "second", "ktime"))
+        end = int(units_convert(f_end / fps, "second", "ktime"))
+        elem_props_template_set(astack_tmpl, astack_props, "p_timestamp", b"LocalStart", start)
+        elem_props_template_set(astack_tmpl, astack_props, "p_timestamp", b"LocalStop", end)
+        elem_props_template_set(astack_tmpl, astack_props, "p_timestamp", b"ReferenceStart", start)
+        elem_props_template_set(astack_tmpl, astack_props, "p_timestamp", b"ReferenceStop", end)
+        elem_props_template_finalize(astack_tmpl, astack_props)
+
+        # For now, only one layer for all animations.
+        alayer = elem_data_single_int64(root, b"AnimationLayer", get_fbxuid_from_key(alayer_key))
+        alayer.add_string(fbx_name_class(name, b"AnimLayer"))
+        alayer.add_string(b"")
+
+        for obj, (alayer_key, acurvenodes) in alayers.items():
+            # Animation layer.
+            # alayer = elem_data_single_int64(root, b"AnimationLayer", get_fbxuid_from_key(alayer_key))
+            # alayer.add_string(fbx_name_class(obj.name.encode(), b"AnimLayer"))
+            # alayer.add_string(b"")
 
-    astack_tmpl = elem_props_template_init(scene_data.templates, b"AnimationStack")
-    astack_props = elem_properties(astack)
-    r = scene_data.scene.render
-    fps = r.fps / r.fps_base
-    f_start = int(units_convert(scene_data.scene.frame_start / fps, "second", "ktime"))
-    f_end = int(units_convert(scene_data.scene.frame_end / fps, "second", "ktime"))
-    elem_props_template_set(astack_tmpl, astack_props, "p_timestamp", b"LocalStart", f_start)
-    elem_props_template_set(astack_tmpl, astack_props, "p_timestamp", b"LocalStop", f_end)
-    elem_props_template_set(astack_tmpl, astack_props, "p_timestamp", b"ReferenceStart", f_start)
-    elem_props_template_set(astack_tmpl, astack_props, "p_timestamp", b"ReferenceStop", f_end)
-    elem_props_template_finalize(astack_tmpl, astack_props)
-
-    # For now, only one layer for all animations.
-    alayer = elem_data_single_int64(root, b"AnimationLayer", get_fbxuid_from_key(alayer_key))
-    alayer.add_string(fbx_name_class(scene.name.encode(), b"AnimLayer"))
-    alayer.add_string(b"")
-
-    for obj, (alayer_key, acurvenodes) in alayers.items():
-        # Animation layer.
-        # alayer = elem_data_single_int64(root, b"AnimationLayer", get_fbxuid_from_key(alayer_key))
-        # alayer.add_string(fbx_name_class(obj.name.encode(), b"AnimLayer"))
-        # alayer.add_string(b"")
-
-        for fbx_prop, (acurvenode_key, acurves, acurvenode_name) in acurvenodes.items():
-            # Animation curve node.
-            acurvenode = elem_data_single_int64(root, b"AnimationCurveNode", get_fbxuid_from_key(acurvenode_key))
-            acurvenode.add_string(fbx_name_class(acurvenode_name.encode(), b"AnimCurveNode"))
-            acurvenode.add_string(b"")
-
-            acn_tmpl = elem_props_template_init(scene_data.templates, b"AnimationCurveNode")
-            acn_props = elem_properties(acurvenode)
-
-            for fbx_item, (acurve_key, def_value, keys, _acurve_valid) in acurves.items():
-                elem_props_template_set(acn_tmpl, acn_props, "p_number", fbx_item.encode(), def_value, animatable=True)
-
-                # Only create Animation curve if needed!
-                if keys:
-                    acurve = elem_data_single_int64(root, b"AnimationCurve", get_fbxuid_from_key(acurve_key))
-                    acurve.add_string(fbx_name_class(b"", b"AnimCurve"))
-                    acurve.add_string(b"")
-
-                    # key attributes...
-                    nbr_keys = len(keys)
-                    # flags...
-                    keyattr_flags = (
-                        1 << 3 |   # interpolation mode, 1 = constant, 2 = linear, 3 = cubic.
-                        1 << 8 |   # tangent mode, 8 = auto, 9 = TCB, 10 = user, 11 = generic break,
-                        1 << 13 |  # tangent mode, 12 = generic clamp, 13 = generic time independent,
-                        1 << 14 |  # tangent mode, 13 + 14 = generic clamp progressive.
-                        0,
-                    )
-                    # Maybe values controlling TCB & co???
-                    keyattr_datafloat = (0.0, 0.0, 9.419963346924634e-30, 0.0)
-
-                    # And now, the *real* data!
-                    elem_data_single_float64(acurve, b"Default", def_value)
-                    elem_data_single_int32(acurve, b"KeyVer", FBX_ANIM_KEY_VERSION)
-                    elem_data_single_int64_array(acurve, b"KeyTime", keys_to_ktimes(keys))
-                    elem_data_single_float32_array(acurve, b"KeyValueFloat", (v for _f, v in keys))
-                    elem_data_single_int32_array(acurve, b"KeyAttrFlags", keyattr_flags)
-                    elem_data_single_float32_array(acurve, b"KeyAttrDataFloat", keyattr_datafloat)
-                    elem_data_single_int32_array(acurve, b"KeyAttrRefCount", (nbr_keys,))
-
-            elem_props_template_finalize(acn_tmpl, acn_props)
+            for fbx_prop, (acurvenode_key, acurves, acurvenode_name) in acurvenodes.items():
+                # Animation curve node.
+                acurvenode = elem_data_single_int64(root, b"AnimationCurveNode", get_fbxuid_from_key(acurvenode_key))
+                acurvenode.add_string(fbx_name_class(acurvenode_name.encode(), b"AnimCurveNode"))
+                acurvenode.add_string(b"")
+
+                acn_tmpl = elem_props_template_init(scene_data.templates, b"AnimationCurveNode")
+                acn_props = elem_properties(acurvenode)
+
+                for fbx_item, (acurve_key, def_value, keys, _acurve_valid) in acurves.items():
+                    elem_props_template_set(acn_tmpl, acn_props, "p_number", fbx_item.encode(), def_value, animatable=True)
+
+                    # Only create Animation curve if needed!
+                    if keys:
+                        acurve = elem_data_single_int64(root, b"AnimationCurve", get_fbxuid_from_key(acurve_key))
+                        acurve.add_string(fbx_name_class(b"", b"AnimCurve"))
+                        acurve.add_string(b"")
+
+                        # key attributes...
+                        nbr_keys = len(keys)
+                        # flags...
+                        keyattr_flags = (
+                            1 << 3 |   # interpolation mode, 1 = constant, 2 = linear, 3 = cubic.
+                            1 << 8 |   # tangent mode, 8 = auto, 9 = TCB, 10 = user, 11 = generic break,
+                            1 << 13 |  # tangent mode, 12 = generic clamp, 13 = generic time independent,
+                            1 << 14 |  # tangent mode, 13 + 14 = generic clamp progressive.
+                            0,
+                        )
+                        # Maybe values controlling TCB & co???
+                        keyattr_datafloat = (0.0, 0.0, 9.419963346924634e-30, 0.0)
+
+                        # And now, the *real* data!
+                        elem_data_single_float64(acurve, b"Default", def_value)
+                        elem_data_single_int32(acurve, b"KeyVer", FBX_ANIM_KEY_VERSION)
+                        elem_data_single_int64_array(acurve, b"KeyTime", keys_to_ktimes(keys))
+                        elem_data_single_float32_array(acurve, b"KeyValueFloat", (v for _f, v in keys))
+                        elem_data_single_int32_array(acurve, b"Ke

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list