From 6af5585eaeaa6831f204bec08f226c8144f490c6 Mon Sep 17 00:00:00 2001 From: Den <31878959+dv1x3r@users.noreply.github.com> Date: Thu, 19 Feb 2026 17:11:46 +0200 Subject: [PATCH] fix: skip read_vertex_data when VertexData is empty fix: correct channelMask bit parsing in get_channels --- UnityPy/helpers/MeshHelper.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/UnityPy/helpers/MeshHelper.py b/UnityPy/helpers/MeshHelper.py index 848f9a99..bbcde5dd 100644 --- a/UnityPy/helpers/MeshHelper.py +++ b/UnityPy/helpers/MeshHelper.py @@ -159,11 +159,10 @@ def process(self): if mesh.m_Use16BitIndices is not None: self.m_Use16BitIndices = bool(mesh.m_Use16BitIndices) elif ( - self.version >= (2017, 4) + (self.version >= (2017, 4)) or # version == (2017, 3, 1) & patched - px string - self.version[:2] == (2017, 3) - and mesh.m_MeshCompression == 0 + (self.version[:2] == (2017, 3) and mesh.m_MeshCompression == 0) ): self.m_Use16BitIndices = mesh.m_IndexFormat == 0 self.copy_from_mesh() @@ -292,10 +291,10 @@ def get_channels(self, m_Streams: list[StreamInfo]) -> list[ChannelInfo]: for _ in range(6) ] for s, m_Stream in enumerate(m_Streams): - channelMask = bytearray(m_Stream.channelMask) # BitArray + channelMask = m_Stream.channelMask # uint offset = 0 for i in range(6): - if channelMask[i]: + if channelMask & (1 << i): m_Channel = m_Channels[i] m_Channel.stream = s m_Channel.offset = offset @@ -326,6 +325,12 @@ def read_vertex_data(self, m_Channels: list[ChannelInfo], m_Streams: list[Stream if m_VertexData is None: return + # could be empty for fully compressed meshes + # in that case data will be read from CompressedMesh via decompress_compressed_mesh + # also avoids a crash in UnityPyBoost.unpack_vertexdata with empty data + if m_VertexData.m_VertexCount == 0 or not m_VertexData.m_DataSize: + return + self.m_VertexCount = m_VertexCount = m_VertexData.m_VertexCount # m_VertexDataRaw = m_VertexData.m_DataSize