1
0
mirror of https://github.com/DarklightGames/io_scene_psk_psa.git synced 2024-11-28 00:20:48 +01:00

Now eliminating redundant final keyframes on PSA import.

This commit is contained in:
Colin Basnett 2022-01-18 20:09:53 -08:00
parent f2ad61ce84
commit 59af9d2145

View File

@ -90,10 +90,6 @@ class PsaImporter(object):
import_bone.orig_quat = armature_bone.matrix_local.to_quaternion() import_bone.orig_quat = armature_bone.matrix_local.to_quaternion()
import_bone.post_quat = import_bone.orig_quat.conjugated() import_bone.post_quat = import_bone.orig_quat.conjugated()
io_time = datetime.timedelta()
math_time = datetime.timedelta()
keyframe_time = datetime.timedelta()
# Create and populate the data for new sequences. # Create and populate the data for new sequences.
for sequence in sequences: for sequence in sequences:
# F-curve data buffer for all bones. This is used later on to avoid adding redundant keyframes. # F-curve data buffer for all bones. This is used later on to avoid adding redundant keyframes.
@ -120,10 +116,7 @@ class PsaImporter(object):
# Read the sequence keys from the PSA file. # Read the sequence keys from the PSA file.
sequence_name = sequence.name.decode('windows-1252') sequence_name = sequence.name.decode('windows-1252')
now = datetime.datetime.now()
sequence_keys = psa_reader.read_sequence_keys(sequence_name) sequence_keys = psa_reader.read_sequence_keys(sequence_name)
io_time += datetime.datetime.now() - now
# Add keyframes for each frame of the sequence. # Add keyframes for each frame of the sequence.
for frame_index in reversed(range(sequence.frame_count)): for frame_index in reversed(range(sequence.frame_count)):
@ -134,7 +127,6 @@ class PsaImporter(object):
key_index += 1 key_index += 1
continue continue
now = datetime.datetime.now()
# Convert world-space transforms to local-space transforms. # Convert world-space transforms to local-space transforms.
key_rotation = Quaternion(tuple(sequence_keys[key_index].rotation)) key_rotation = Quaternion(tuple(sequence_keys[key_index].rotation))
q = import_bone.post_quat.copy() q = import_bone.post_quat.copy()
@ -149,9 +141,7 @@ class PsaImporter(object):
key_location = Vector(tuple(sequence_keys[key_index].location)) key_location = Vector(tuple(sequence_keys[key_index].location))
loc = key_location - import_bone.orig_loc loc = key_location - import_bone.orig_loc
loc.rotate(import_bone.post_quat.conjugated()) loc.rotate(import_bone.post_quat.conjugated())
math_time += datetime.datetime.now() - now
now = datetime.datetime.now()
# Add keyframe data for each of the associated f-curves. # Add keyframe data for each of the associated f-curves.
bone_fcurve_data = quat.w, quat.x, quat.y, quat.z, loc.x, loc.y, loc.z bone_fcurve_data = quat.w, quat.x, quat.y, quat.z, loc.x, loc.y, loc.z
@ -171,16 +161,14 @@ class PsaImporter(object):
next_frame_bones_fcurve_data[bone_index] = bone_fcurve_data next_frame_bones_fcurve_data[bone_index] = bone_fcurve_data
keyframe_time += datetime.datetime.now() - now
key_index += 1 key_index += 1
# TODO: eliminate last keyframe if there are only two keyframes (beginning + end and the values are identical) # Eliminate redundant final keyframe if the f-curve value is identical to the previous keyframe.
# in this way, we will effectively have cleaned the keyframes inline. for import_bone in filter(lambda x: x is not None, import_bones):
pass for fcurve in filter(lambda x: len(x.keyframe_points) > 1, import_bone.fcurves):
second_to_last_keyframe, last_keyframe = fcurve.keyframe_points[-2:]
print(f'io_time: {io_time}') if second_to_last_keyframe.co[1] == last_keyframe.co[1]:
print(f'math_time: {math_time}') fcurve.keyframe_points.remove(last_keyframe)
print(f'keyframe_time: {keyframe_time}')
class PsaImportActionListItem(PropertyGroup): class PsaImportActionListItem(PropertyGroup):