FBX IO: Speed up animation import using NumPy #104856

Merged
Thomas Barlow merged 12 commits from Mysteryem/blender-addons:fbx_import_anim_numpy_p1 into main 2023-09-04 22:07:45 +02:00
Showing only changes of commit ae09d491d8 - Show all commits

View File

@ -622,10 +622,11 @@ def _transformation_curves_gen(item, values_arrays, channel_keys):
def blen_read_animation_channel_curves(curves): def blen_read_animation_channel_curves(curves):
"""Read one or (very rarely) more animation curves, that affect a single same channel of a single property, from FBX """Read one or (very rarely) more animation curves, that affect a single channel of a single property, from FBX
data. data.
When there are multiple curves, they will be combined into a single sorted animation curve. When there are multiple curves, they will be combined into a single sorted animation curve with later curves taking
precedence when the curves contain duplicate times.
It is expected that there will almost never be more than a single curve to read because FBX's default animation It is expected that there will almost never be more than a single curve to read because FBX's default animation
system only uses the first curve assigned to a channel. system only uses the first curve assigned to a channel.
@ -654,7 +655,7 @@ def blen_read_animation_channel_curves(curves):
def _combine_curve_keyframe_times(times_and_values_tuples, initial_values): def _combine_curve_keyframe_times(times_and_values_tuples, initial_values):
"""Combine multiple sorted animation curves, that affect different properties, such that every animation curve """Combine multiple parsed animation curves, that affect different channels, such that every animation curve
contains the keyframes from every other curve, interpolating the values for the newly inserted keyframes in each contains the keyframes from every other curve, interpolating the values for the newly inserted keyframes in each
curve. curve.
@ -705,6 +706,7 @@ def blen_read_invalid_animation_curve(key_times, key_values):
if idx >= 0: if idx >= 0:
idx += 1 idx += 1
if idx >= key_times_len: if idx >= key_times_len:
# We have reached our last element for this curve, stay on it from now on...
idx = -1 idx = -1
yield idx yield idx
@ -712,8 +714,8 @@ def blen_read_invalid_animation_curve(key_times, key_values):
indexed_times = key_times[indices] indexed_times = key_times[indices]
indexed_values = key_values[indices] indexed_values = key_values[indices]
# Interpolate the value for each time in sorted_unique_times according to the times and values at each index and the # Linear interpolate the value for each time in sorted_unique_times according to the times and values at each index
# previous index. # and the previous index.
interpolated_values = np.empty_like(indexed_values) interpolated_values = np.empty_like(indexed_values)
# Where the index is 0, there's no previous value to interpolate from, so we set the value without interpolating. # Where the index is 0, there's no previous value to interpolate from, so we set the value without interpolating.
@ -763,7 +765,7 @@ def _convert_fbx_time_to_blender_time(key_times, blen_start_offset, fbx_start_of
# Convert from FBX timing to Blender timing. # Convert from FBX timing to Blender timing.
# Cannot subtract in-place because key_times could be read directly from FBX and could be used by multiple Actions. # Cannot subtract in-place because key_times could be read directly from FBX and could be used by multiple Actions.
key_times = key_times - fbx_start_offset key_times = key_times - fbx_start_offset
# timefac is a Python float, so the new array will be a np.float64 array. # FBX times are integers and timefac is a Python float, so the new array will be a np.float64 array.
key_times = key_times * timefac key_times = key_times * timefac
key_times += blen_start_offset key_times += blen_start_offset