Skip to content

Commit

Permalink
Implement interleaved vertex layout with byteStride
Browse files Browse the repository at this point in the history
  • Loading branch information
ousttrue committed Dec 5, 2022
1 parent fcb4f18 commit 3b73ba2
Showing 1 changed file with 22 additions and 1 deletion.
23 changes: 22 additions & 1 deletion Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,28 @@ NativeArray<byte> GetBytesFromBufferView(glTFBufferView view)
NativeArray<T> GetTypedFromAccessor<T>(glTFAccessor accessor, glTFBufferView view) where T : struct
{
var bytes = GetBytesFromBufferView(view);
return bytes.GetSubArray(accessor.byteOffset.GetValueOrDefault(), bytes.Length - accessor.byteOffset.GetValueOrDefault()).Reinterpret<T>(1).GetSubArray(0, accessor.count);
if (view.byteStride == 0 || view.byteStride == accessor.GetStride())
{
// planar layout
return bytes.GetSubArray(
accessor.byteOffset.GetValueOrDefault(),
accessor.CalcByteSize()).Reinterpret<T>(1);
}
else
{
// interleaved layout
// copy interleaved vertex to planar array
var src = GetBytesFromBufferView(view);
var dst = NativeArrayManager.CreateNativeArray<T>(accessor.count);
var offset = accessor.byteOffset.GetValueOrDefault();
var size = Marshal.SizeOf<T>();
for (int i = 0; i < accessor.count; ++i, offset += view.byteStride)
{
var values = src.GetSubArray(offset, size).Reinterpret<T>(1);
dst[i] = values[0];
}
return dst;
}
}

/// <summary>
Expand Down

0 comments on commit 3b73ba2

Please sign in to comment.