[Bf-extensions-cvs] [07352bd] master: After Effects export: fix interpolation when channel stays fixed

Damien Picard noreply at git.blender.org
Wed May 25 12:43:15 CEST 2022


Commit: 07352bddf40ef0408b6bfe024355511b36589e0f
Author: Damien Picard
Date:   Mon Aug 9 16:28:53 2021 +0200
Branches: master
https://developer.blender.org/rBAC07352bddf40ef0408b6bfe024355511b36589e0f

After Effects export: fix interpolation when channel stays fixed

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

M	io_export_after_effects.py

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

diff --git a/io_export_after_effects.py b/io_export_after_effects.py
index 1fcca15..0f4bd28 100644
--- a/io_export_after_effects.py
+++ b/io_export_after_effects.py
@@ -110,8 +110,16 @@ class ObjectExport():
     def get_prop_keyframe(self, context, prop_name, value, time):
         """Set keyframe for given property"""
         prop_keys = self.keyframes.setdefault(prop_name, [])
-        if not len(prop_keys) or value != prop_keys[-1][1]:
-            prop_keys.append((time, value))
+        if len(prop_keys) == 0:
+            prop_keys.append([time, value, False])
+            return
+
+        if value != prop_keys[-1][1]:
+            prop_keys.append([time, value, False])
+        # Store which keys should hold, that is, which are
+        # the first in a series of identical values
+        else:
+            prop_keys[-1][2] = True
 
     def get_keyframe(self, context, data, time, ae_size):
         """Store animation for the current frame"""
@@ -141,10 +149,21 @@ class ObjectExport():
         # Set values of properties, add keyframes only where needed
         for prop, keys in self.keyframes.items():
             if include_animation and len(keys) > 1:
-                times = ",".join((str(k[0]) for k in keys))
-                values = ",".join((str(k[1]) for k in keys)).replace(" ", "")
+                times = ",".join(str(k[0]) for k in keys)
+                values = ",".join(str(k[1]) for k in keys).replace(" ", "")
                 prop_script += (
                     f'{self.name_ae}.property("{prop}").setValuesAtTimes([{times}],[{values}]);\n')
+
+                # Set to HOLD the frames after which animation is fixed
+                # for several frames, to avoid interpolation errors
+                if any(k[2] for k in keys):
+                    prop_script += (
+                        f'var hold_frames = {[i + 1 for i, k in enumerate(keys) if k[2]]};\n'
+                        'for (var i = 0; i < hold_frames.length; i++) {\n'
+                        f'  {self.name_ae}.property("{prop}").setInterpolationTypeAtKey(hold_frames[i], KeyframeInterpolationType.HOLD);\n'
+                        '}\n')
+
+            # No animation for this property
             else:
                 value = str(keys[0][1]).replace(" ", "")
                 prop_script += (



More information about the Bf-extensions-cvs mailing list