diff --git a/Assets/VRM10/Runtime/IO/Vrm10ImportData.cs b/Assets/VRM10/Runtime/IO/Vrm10ImportData.cs index ead32ffbe..c7e395b00 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10ImportData.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10ImportData.cs @@ -77,6 +77,27 @@ namespace UniVRM10 return GetBufferBytes(Gltf.buffers[bufferViewBufferIndex]); } + static NativeArray RestoreSparseAccessorUInt8(INativeArrayManager arrayManager, NativeArray bytes, int accessorCount, NativeArray indices, NativeArray valuesBytes) + where T : struct + { + var stride = Marshal.SizeOf(typeof(T)); + if (bytes.Length == 0) + { + bytes = arrayManager.CreateNativeArray(accessorCount * stride); + } + var dst = bytes.Reinterpret(1); + var values = valuesBytes.Reinterpret(1); + + for (int i = 0; i < indices.Length; ++i) + { + var index = indices[i]; + var value = values[i]; + dst[index] = value; + } + + return bytes; + } + static NativeArray RestoreSparseAccessorUInt16(INativeArrayManager arrayManager, NativeArray bytes, int accessorCount, NativeArray indicesBytes, NativeArray valuesBytes) where T : struct { @@ -165,6 +186,12 @@ namespace UniVRM10 .GetSubArray(sparse.values.byteOffset, accessor.GetStride() * sparse.count); ; + if (sparse.indices.componentType == (UniGLTF.glComponentType)AccessorValueType.UNSIGNED_BYTE + && accessor.componentType == (UniGLTF.glComponentType)AccessorValueType.FLOAT + && accessor.type == "VEC3") + { + return RestoreSparseAccessorUInt8(m_data.NativeArrayManager, bytes, accessor.count, sparseIndexBytes, sparseValueBytes); + } if (sparse.indices.componentType == (UniGLTF.glComponentType)AccessorValueType.UNSIGNED_SHORT && accessor.componentType == (UniGLTF.glComponentType)AccessorValueType.FLOAT && accessor.type == "VEC3")