From fb2ab897665a283fd794d541ff0300d1c878f97a Mon Sep 17 00:00:00 2001 From: Colin Basnett Date: Mon, 14 Aug 2023 22:42:59 -0700 Subject: [PATCH] Fixed a compatibility issue caused by the fix to #43 --- io_scene_psk_psa/psa/export/operators.py | 8 ++++---- io_scene_psk_psa/psk/reader.py | 12 ++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/io_scene_psk_psa/psa/export/operators.py b/io_scene_psk_psa/psa/export/operators.py index 407d144..5496ffe 100644 --- a/io_scene_psk_psa/psa/export/operators.py +++ b/io_scene_psk_psa/psa/export/operators.py @@ -8,10 +8,10 @@ from bpy_extras.io_utils import ExportHelper from bpy_types import Operator -from io_scene_psk_psa.helpers import populate_bone_group_list, get_nla_strips_in_timeframe -from io_scene_psk_psa.psa.builder import build_psa, PsaBuildSequence, PsaBuildOptions -from io_scene_psk_psa.psa.export.properties import PSA_PG_export, PSA_PG_export_action_list_item, filter_sequences -from io_scene_psk_psa.psa.writer import write_psa +from ..builder import build_psa, PsaBuildSequence, PsaBuildOptions +from ..export.properties import PSA_PG_export, PSA_PG_export_action_list_item, filter_sequences +from ..writer import write_psa +from ...helpers import populate_bone_group_list, get_nla_strips_in_timeframe def is_action_for_armature(armature: Armature, action: Action): diff --git a/io_scene_psk_psa/psk/reader.py b/io_scene_psk_psa/psk/reader.py index 7f9cb1f..6fa2da7 100644 --- a/io_scene_psk_psa/psk/reader.py +++ b/io_scene_psk_psa/psk/reader.py @@ -78,4 +78,16 @@ def read_psk(path: str) -> Psk: ''' psk.material_references = _read_material_references(path) + ''' + Tools like UEViewer and CUE4Parse write the point index as a 32-bit integer, exploiting the fact that due to struct + alignment, there were 16-bits of padding following the original 16-bit point index in the wedge struct. + However, this breaks compatibility with PSK files that were created with older tools that treated the + point index as a 16-bit integer and might have junk data written to the padding bits. + To work around this, we check if each point is still addressable using a 16-bit index, and if it is, assume the + point index is a 16-bit integer and truncate the high bits. + ''' + if len(psk.points) <= 65536: + for wedge in psk.wedges: + wedge.point_index &= 0xFFFF + return psk