From e9db99e07e56bbcffbc40e34aa989c61186db528 Mon Sep 17 00:00:00 2001 From: ds5678 <49847914+ds5678@users.noreply.github.com> Date: Tue, 15 Jul 2025 18:13:50 -0700 Subject: [PATCH] Gracefully handle integer UV channels during GLB export * Resolves #1811 --- .../MeshData.cs | 2 +- Source/AssetRipper.Tests/MeshDataTests.cs | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 Source/AssetRipper.Tests/MeshDataTests.cs diff --git a/Source/AssetRipper.SourceGenerated.Extensions/MeshData.cs b/Source/AssetRipper.SourceGenerated.Extensions/MeshData.cs index 1337e918c..ab4c60a7c 100644 --- a/Source/AssetRipper.SourceGenerated.Extensions/MeshData.cs +++ b/Source/AssetRipper.SourceGenerated.Extensions/MeshData.cs @@ -185,6 +185,6 @@ public readonly record struct MeshData( [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] private static T TryGetAtIndex(T[]? array, uint index) where T : struct { - return array is null ? default : array[index]; + return array is null or { Length: 0 } ? default : array[index]; } } diff --git a/Source/AssetRipper.Tests/MeshDataTests.cs b/Source/AssetRipper.Tests/MeshDataTests.cs new file mode 100644 index 000000000..1d0e93563 --- /dev/null +++ b/Source/AssetRipper.Tests/MeshDataTests.cs @@ -0,0 +1,32 @@ +using AssetRipper.SourceGenerated.Extensions; + +namespace AssetRipper.Tests; + +internal class MeshDataTests +{ + [Test] + public void AccessingNullUV2DoesNotThrow() + { + MeshData meshData = MeshData.CreateTriangleMesh() with + { + UV2 = null + }; + Assert.DoesNotThrow(() => + { + meshData.TryGetUV2AtIndex(0); + }); + } + + [Test] + public void AccessingEmptyUV2DoesNotThrow() + { + MeshData meshData = MeshData.CreateTriangleMesh() with + { + UV2 = [] + }; + Assert.DoesNotThrow(() => + { + meshData.TryGetUV2AtIndex(0); + }); + } +}