[Bf-extensions-cvs] [39c2c2a] master: FBX export: fix/enhance 'clean anim curves' code, to avoid writing curves for non-animated data.

Bastien Montagne noreply at git.blender.org
Fri May 23 19:39:59 CEST 2014


Commit: 39c2c2a2e5e228ceefe357b2bf0f3301f4a0d034
Author: Bastien Montagne
Date:   Fri May 23 18:45:39 2014 +0200
https://developer.blender.org/rBA39c2c2a2e5e228ceefe357b2bf0f3301f4a0d034

FBX export: fix/enhance 'clean anim curves' code, to avoid writing curves for non-animated data.

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

M	io_scene_fbx/export_fbx_bin.py

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

diff --git a/io_scene_fbx/export_fbx_bin.py b/io_scene_fbx/export_fbx_bin.py
index 85b70c2..ba6e900 100644
--- a/io_scene_fbx/export_fbx_bin.py
+++ b/io_scene_fbx/export_fbx_bin.py
@@ -1572,14 +1572,16 @@ def fbx_animations_simplify(scene_data, animdata):
     # So that, with default factor and step values (1), we get:
     max_frame_diff = step * fac * 10  # max step of 10 frames.
     value_diff_fac = fac / 1000  # min value evolution: 0.1% of whole range.
+    min_significant_diff = 1.0e-6
 
     for keys in animdata.values():
         if not keys:
             continue
         extremums = [(min(values), max(values)) for values in zip(*(k[1] for k in keys))]
-        min_diffs = [max((mx - mn) * value_diff_fac, 0.000001) for mx, mn in extremums]
+        min_diffs = [max((mx - mn) * value_diff_fac, min_significant_diff) for mn, mx in extremums]
         p_currframe, p_key, p_key_write = keys[0]
         p_keyed = [(p_currframe - max_frame_diff, val) for val in p_key]
+        are_keyed = [False] * len(p_key)
         for currframe, key, key_write in keys:
             for idx, (val, p_val) in enumerate(zip(key, p_key)):
                 p_keyedframe, p_keyedval = p_keyed[idx]
@@ -1591,14 +1593,23 @@ def fbx_animations_simplify(scene_data, animdata):
                     key_write[idx] = True
                     p_key_write[idx] = True
                     p_keyed[idx] = (currframe, val)
-                elif (abs(val - p_keyedval) >= min_diffs[idx]) or (currframe - p_keyedframe >= max_frame_diff):
-                    # Else, if enough difference from previous keyed value (or max gap between keys is reached),
-                    # key this value only!
-                    key_write[idx] = True
-                    p_keyed[idx] = (currframe, val)
+                    are_keyed[idx] = True
+                else:
+                    frame_diff = currframe - p_keyedframe
+                    val_diff = abs(val - p_keyedval)
+                    if ((val_diff >= min_diffs[idx]) or
+                        ((val_diff >= min_significant_diff) and (frame_diff >= max_frame_diff))):
+                        # Else, if enough difference from previous keyed value
+                        # (or any significant difference and max gap between keys is reached),
+                        # key this value only!
+                        key_write[idx] = True
+                        p_keyed[idx] = (currframe, val)
+                        are_keyed[idx] = True
             p_currframe, p_key, p_key_write = currframe, key, key_write
-        # Always key last sampled values (we ignore curves with a single valid key anyway).
-        p_key_write[:] = [True] * len(p_key_write)
+        # If we did key something, ensure first and last sampled values are keyed as well.
+        for idx, is_keyed in enumerate(are_keyed):
+            if is_keyed:
+                keys[0][2][idx] = keys[-1][2][idx] = True
 
 
 def fbx_animations_objects_do(scene_data, ref_id, f_start, f_end, start_zero, objects=None, force_keep=False):



More information about the Bf-extensions-cvs mailing list