[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