[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