From 9bf6f45efc2f500532f1945618ddc95e2d2e5e03 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 13 Jan 2022 19:26:08 +0900 Subject: [PATCH 1/2] fix UNSIGNED_BYTE size --- Assets/VRM10/vrmlib/Runtime/BufferAccessor.cs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Assets/VRM10/vrmlib/Runtime/BufferAccessor.cs b/Assets/VRM10/vrmlib/Runtime/BufferAccessor.cs index b37fd8ac3..47a4ed3d1 100644 --- a/Assets/VRM10/vrmlib/Runtime/BufferAccessor.cs +++ b/Assets/VRM10/vrmlib/Runtime/BufferAccessor.cs @@ -66,7 +66,7 @@ namespace VrmLib switch (t) { case AccessorValueType.BYTE: return 1; - case AccessorValueType.UNSIGNED_BYTE: return 4; + case AccessorValueType.UNSIGNED_BYTE: return 1; case AccessorValueType.SHORT: return 2; case AccessorValueType.UNSIGNED_SHORT: return 2; case AccessorValueType.UNSIGNED_INT: return 4; @@ -111,11 +111,18 @@ namespace VrmLib /// public unsafe NativeArray AsNativeArray(Allocator allocator) where T : struct { - fixed (byte* byteArray = Bytes.Array) + if (Stride == Marshal.SizeOf(typeof(T))) { - var nativeArray = new NativeArray(Bytes.Count / Marshal.SizeOf(), allocator); - UnsafeUtility.MemCpy(nativeArray.GetUnsafePtr(), byteArray + Bytes.Offset, Bytes.Count); - return nativeArray; + fixed (byte* byteArray = Bytes.Array) + { + var nativeArray = new NativeArray(Bytes.Count / Marshal.SizeOf(), allocator); + UnsafeUtility.MemCpy(nativeArray.GetUnsafePtr(), byteArray + Bytes.Offset, Bytes.Count); + return nativeArray; + } + } + else + { + throw new Exception($"Stride:{Stride}!= sizeof({typeof(T).Name}:{Marshal.SizeOf(typeof(T))}"); } } From 85fb330c8bdc253169f2abf757126e08844f4a87 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 13 Jan 2022 19:35:03 +0900 Subject: [PATCH 2/2] fix UNSIGNED_BYTE4 joints --- Assets/VRM10/vrmlib/Runtime/BufferAccessor.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Assets/VRM10/vrmlib/Runtime/BufferAccessor.cs b/Assets/VRM10/vrmlib/Runtime/BufferAccessor.cs index 47a4ed3d1..f85e8553d 100644 --- a/Assets/VRM10/vrmlib/Runtime/BufferAccessor.cs +++ b/Assets/VRM10/vrmlib/Runtime/BufferAccessor.cs @@ -122,7 +122,20 @@ namespace VrmLib } else { - throw new Exception($"Stride:{Stride}!= sizeof({typeof(T).Name}:{Marshal.SizeOf(typeof(T))}"); + if (typeof(T) == typeof(SkinJoints) && Stride == 4) + { + // 例えば SkinJoints を使う JOINTS_0 は UNSIGNED_BYTE と UNSIGNED_SHORT の2種類がありえる。 + fixed (UShort4* p = GetAsUShort4()) + { + var nativeArray = new NativeArray(Count, allocator); + UnsafeUtility.MemCpy(nativeArray.GetUnsafePtr(), p, Bytes.Count); + return nativeArray; + } + } + else + { + throw new Exception($"Stride:{Stride}!= sizeof({typeof(T).Name}:{Marshal.SizeOf(typeof(T))}"); + } } }