diff --git a/Assets/VRM10/Runtime/IO/Vrm10ImportData.cs b/Assets/VRM10/Runtime/IO/Vrm10ImportData.cs
index e85266bea..8c1fab866 100644
--- a/Assets/VRM10/Runtime/IO/Vrm10ImportData.cs
+++ b/Assets/VRM10/Runtime/IO/Vrm10ImportData.cs
@@ -5,6 +5,7 @@ using System.Numerics;
using UniGLTF;
using VrmLib;
using System.Collections.Generic;
+using Unity.Collections;
namespace UniVRM10
{
@@ -33,8 +34,6 @@ namespace UniVRM10
public UniGLTF.Extensions.VRMC_springBone.VRMC_springBone gltfVrmSpringBone;
- byte[] _bin;
-
///
/// for import
///
@@ -55,11 +54,19 @@ namespace UniVRM10
{
gltfVrmSpringBone = springBone;
}
-
- _bin = m_data.Bin.ToArray();
}
- public ArraySegment GetBufferBytes(UniGLTF.glTFBufferView bufferView)
+ public NativeArray GetBufferBytes(UniGLTF.glTFBuffer buffer)
+ {
+ int index = Gltf.buffers.IndexOf(buffer);
+ if (index != 0)
+ {
+ throw new NotImplementedException();
+ }
+ return m_data.Bin;
+ }
+
+ public NativeArray GetBufferBytes(UniGLTF.glTFBufferView bufferView)
{
if (!bufferView.buffer.TryGetValidIndex(Gltf.buffers.Count, out int bufferViewBufferIndex))
{
@@ -68,28 +75,18 @@ namespace UniVRM10
return GetBufferBytes(Gltf.buffers[bufferViewBufferIndex]);
}
- public ArraySegment GetBufferBytes(UniGLTF.glTFBuffer buffer)
- {
- int index = Gltf.buffers.IndexOf(buffer);
- if (index != 0)
- {
- throw new NotImplementedException();
- }
- return new ArraySegment(_bin);
- }
-
- static ArraySegment RestoreSparseAccessorUInt16(ArraySegment bytes, int accessorCount, ArraySegment indicesBytes, ArraySegment valuesBytes)
+ static NativeArray RestoreSparseAccessorUInt16(NativeArrayManager arrayManager, NativeArray bytes, int accessorCount, NativeArray indicesBytes, NativeArray valuesBytes)
where T : struct
{
var stride = Marshal.SizeOf(typeof(T));
- if (bytes.Count == 0)
+ if (bytes.Length == 0)
{
- bytes = new ArraySegment(new byte[accessorCount * stride]);
+ bytes = arrayManager.CreateNativeArray(accessorCount * stride);
}
- var dst = SpanLike.Wrap(bytes);
+ var dst = bytes.Reinterpret(1);
- var indices = SpanLike.Wrap(indicesBytes);
- var values = SpanLike.Wrap(valuesBytes);
+ var indices = indicesBytes.Reinterpret(1);
+ var values = valuesBytes.Reinterpret(1);
for (int i = 0; i < indices.Length; ++i)
{
@@ -101,18 +98,18 @@ namespace UniVRM10
return bytes;
}
- static ArraySegment RestoreSparseAccessorUInt32(ArraySegment bytes, int accessorCount, ArraySegment indicesBytes, ArraySegment valuesBytes)
+ static NativeArray RestoreSparseAccessorUInt32(NativeArrayManager arrayManager, NativeArray bytes, int accessorCount, NativeArray indicesBytes, NativeArray valuesBytes)
where T : struct
{
var stride = Marshal.SizeOf(typeof(T));
- if (bytes.Count == 0)
+ if (bytes.Length == 0)
{
- bytes = new ArraySegment(new byte[accessorCount * stride]);
+ bytes = arrayManager.CreateNativeArray(accessorCount * stride);
}
- var dst = SpanLike.Wrap(bytes);
+ var dst = bytes.Reinterpret(1);
- var indices = SpanLike.Wrap(indicesBytes);
- var values = SpanLike.Wrap(valuesBytes);
+ var indices = indicesBytes.Reinterpret(1);
+ var values = valuesBytes.Reinterpret(1);
for (int i = 0; i < indices.Length; ++i)
{
@@ -124,12 +121,12 @@ namespace UniVRM10
return bytes;
}
- public ArraySegment GetAccessorBytes(int accessorIndex)
+ public NativeArray GetAccessorBytes(int accessorIndex)
{
var accessor = Gltf.accessors[accessorIndex];
var sparse = accessor.sparse;
- ArraySegment bytes = default(ArraySegment);
+ NativeArray bytes = default;
if (accessor.bufferView.TryGetValidIndex(Gltf.bufferViews.Count, out int bufferViewIndex))
{
@@ -138,7 +135,7 @@ namespace UniVRM10
{
var buffer = m_data.Bin;
var byteSize = accessor.CalcByteSize();
- bytes = new ArraySegment(_bin).Slice(view.byteOffset, view.byteLength).Slice(accessor.byteOffset, byteSize);
+ bytes = m_data.Bin.GetSubArray(view.byteOffset, view.byteLength).GetSubArray(accessor.byteOffset, byteSize);
}
}
@@ -151,8 +148,8 @@ namespace UniVRM10
var sparseIndexView = Gltf.bufferViews[sparseIndicesBufferViewIndex];
var sparseIndexBin = GetBufferBytes(sparseIndexView);
var sparseIndexBytes = sparseIndexBin
- .Slice(sparseIndexView.byteOffset, sparseIndexView.byteLength)
- .Slice(sparse.indices.byteOffset, ((AccessorValueType)sparse.indices.componentType).ByteSize() * sparse.count)
+ .GetSubArray(sparseIndexView.byteOffset, sparseIndexView.byteLength)
+ .GetSubArray(sparse.indices.byteOffset, ((AccessorValueType)sparse.indices.componentType).ByteSize() * sparse.count)
;
if (!sparse.values.bufferView.TryGetValidIndex(Gltf.bufferViews.Count, out int sparseValuesBufferViewIndex))
@@ -162,21 +159,21 @@ namespace UniVRM10
var sparseValueView = Gltf.bufferViews[sparseValuesBufferViewIndex];
var sparseValueBin = GetBufferBytes(sparseValueView);
var sparseValueBytes = sparseValueBin
- .Slice(sparseValueView.byteOffset, sparseValueView.byteLength)
- .Slice(sparse.values.byteOffset, accessor.GetStride() * sparse.count);
+ .GetSubArray(sparseValueView.byteOffset, sparseValueView.byteLength)
+ .GetSubArray(sparse.values.byteOffset, accessor.GetStride() * sparse.count);
;
if (sparse.indices.componentType == (UniGLTF.glComponentType)AccessorValueType.UNSIGNED_SHORT
&& accessor.componentType == (UniGLTF.glComponentType)AccessorValueType.FLOAT
&& accessor.type == "VEC3")
{
- return RestoreSparseAccessorUInt16(bytes, accessor.count, sparseIndexBytes, sparseValueBytes);
+ return RestoreSparseAccessorUInt16(m_data.NativeArrayManager, bytes, accessor.count, sparseIndexBytes, sparseValueBytes);
}
if (sparse.indices.componentType == (UniGLTF.glComponentType)AccessorValueType.UNSIGNED_INT
&& accessor.componentType == (UniGLTF.glComponentType)AccessorValueType.FLOAT
&& accessor.type == "VEC3")
{
- return RestoreSparseAccessorUInt32(bytes, accessor.count, sparseIndexBytes, sparseValueBytes);
+ return RestoreSparseAccessorUInt32(m_data.NativeArrayManager, bytes, accessor.count, sparseIndexBytes, sparseValueBytes);
}
else
{
@@ -185,10 +182,10 @@ namespace UniVRM10
}
else
{
- if (bytes.Count == 0)
+ if (bytes.Length == 0)
{
// sparse and all value is zero
- return new ArraySegment(new byte[accessor.GetStride() * accessor.count]);
+ return m_data.NativeArrayManager.CreateNativeArray(accessor.GetStride() * accessor.count);
}
return bytes;
@@ -205,7 +202,7 @@ namespace UniVRM10
var accessor = Gltf.accessors[accessorIndex];
var bytes = GetAccessorBytes(accessorIndex);
var vectorType = EnumUtil.Parse(accessor.type);
- ba = new BufferAccessor(bytes,
+ ba = new BufferAccessor(new ArraySegment(bytes.ToArray()),
(AccessorValueType)accessor.componentType, vectorType, accessor.count);
return true;
}
@@ -277,8 +274,8 @@ namespace UniVRM10
}
var buffer = Gltf.buffers[firstViewBufferIndex];
var bin = GetBufferBytes(buffer);
- var bytes = bin.Slice(start, totalCount * firstAccessor.GetStride());
- return new BufferAccessor(bytes,
+ var bytes = bin.GetSubArray(start, totalCount * firstAccessor.GetStride());
+ return new BufferAccessor(new ArraySegment(bytes.ToArray()),
(AccessorValueType)firstAccessor.componentType,
EnumUtil.Parse(firstAccessor.type),
totalCount);
@@ -286,62 +283,64 @@ namespace UniVRM10
else
{
// IndexBufferが連続して格納されていない => Int[] を作り直す
- var indices = new byte[totalCount * Marshal.SizeOf(typeof(int))];
- var span = SpanLike.Wrap(new ArraySegment(indices));
- var offset = 0;
- foreach (var accessorIndex in accessorIndices)
+ using (var indices = new NativeArray(totalCount * Marshal.SizeOf(typeof(int)), Allocator.Persistent))
{
- var accessor = Gltf.accessors[accessorIndex];
- if (accessor.type != "SCALAR")
+ var span = indices.Reinterpret(1);
+ var offset = 0;
+ foreach (var accessorIndex in accessorIndices)
{
- throw new ArgumentException($"accessor.type: {accessor.type}");
- }
- var view = Gltf.bufferViews[accessor.bufferView];
- if (!view.buffer.TryGetValidIndex(Gltf.buffers.Count, out int viewBufferIndex))
- {
- throw new Exception();
- }
- var buffer = Gltf.buffers[viewBufferIndex];
- var bin = GetBufferBytes(buffer);
- var start = view.byteOffset + accessor.byteOffset;
- var bytes = bin.Slice(start, accessor.count * accessor.GetStride());
- var dst = SpanLike.Wrap(new ArraySegment(indices)).Slice(offset, accessor.count);
- offset += accessor.count;
- switch ((AccessorValueType)accessor.componentType)
- {
- case AccessorValueType.UNSIGNED_BYTE:
- {
- var src = SpanLike.Wrap(bytes);
- for (int i = 0; i < src.Length; ++i)
+ var accessor = Gltf.accessors[accessorIndex];
+ if (accessor.type != "SCALAR")
+ {
+ throw new ArgumentException($"accessor.type: {accessor.type}");
+ }
+ var view = Gltf.bufferViews[accessor.bufferView];
+ if (!view.buffer.TryGetValidIndex(Gltf.buffers.Count, out int viewBufferIndex))
+ {
+ throw new Exception();
+ }
+ var buffer = Gltf.buffers[viewBufferIndex];
+ var bin = GetBufferBytes(buffer);
+ var start = view.byteOffset + accessor.byteOffset;
+ var bytes = bin.GetSubArray(start, accessor.count * accessor.GetStride());
+ var dst = indices.Reinterpret(1).GetSubArray(offset, accessor.count);
+ offset += accessor.count;
+ switch ((AccessorValueType)accessor.componentType)
+ {
+ case AccessorValueType.UNSIGNED_BYTE:
{
- // byte to int
- dst[i] = src[i];
+ var src = bytes;
+ for (int i = 0; i < src.Length; ++i)
+ {
+ // byte to int
+ dst[i] = src[i];
+ }
}
- }
- break;
+ break;
- case AccessorValueType.UNSIGNED_SHORT:
- {
- var src = SpanLike.Wrap(bytes);
- for (int i = 0; i < src.Length; ++i)
+ case AccessorValueType.UNSIGNED_SHORT:
{
- // ushort to int
- dst[i] = src[i];
+ var src = bytes.Reinterpret(1);
+ for (int i = 0; i < src.Length; ++i)
+ {
+ // ushort to int
+ dst[i] = src[i];
+ }
}
- }
- break;
+ break;
- case AccessorValueType.UNSIGNED_INT:
- {
- Buffer.BlockCopy(bytes.Array, bytes.Offset, dst.Bytes.Array, dst.Bytes.Offset, bytes.Count);
- }
- break;
+ case AccessorValueType.UNSIGNED_INT:
+ {
+ NativeArray.Copy(bytes, dst.Reinterpret(Marshal.SizeOf()));
+ }
+ break;
- default:
- throw new NotImplementedException($"accessor.componentType: {accessor.componentType}");
+ default:
+ throw new NotImplementedException($"accessor.componentType: {accessor.componentType}");
+ }
}
+ return new BufferAccessor(new ArraySegment(indices.ToArray()), AccessorValueType.UNSIGNED_INT, AccessorVectorType.SCALAR, totalCount);
}
- return new BufferAccessor(new ArraySegment(indices), AccessorValueType.UNSIGNED_INT, AccessorVectorType.SCALAR, totalCount);
}
}