diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs index 2a37c94b7b..1a81031782 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs @@ -166,7 +166,28 @@ NativeArray GetBytesFromBufferView(glTFBufferView view) NativeArray GetTypedFromAccessor(glTFAccessor accessor, glTFBufferView view) where T : struct { var bytes = GetBytesFromBufferView(view); - return bytes.GetSubArray(accessor.byteOffset.GetValueOrDefault(), bytes.Length - accessor.byteOffset.GetValueOrDefault()).Reinterpret(1).GetSubArray(0, accessor.count); + if (view.byteStride == 0 || view.byteStride == accessor.GetStride()) + { + // planar layout + return bytes.GetSubArray( + accessor.byteOffset.GetValueOrDefault(), + accessor.CalcByteSize()).Reinterpret(1); + } + else + { + // interleaved layout + // copy interleaved vertex to planar array + var src = GetBytesFromBufferView(view); + var dst = NativeArrayManager.CreateNativeArray(accessor.count); + var offset = accessor.byteOffset.GetValueOrDefault(); + var size = Marshal.SizeOf(); + for (int i = 0; i < accessor.count; ++i, offset += view.byteStride) + { + var values = src.GetSubArray(offset, size).Reinterpret(1); + dst[i] = values[0]; + } + return dst; + } } ///