From dac2a5e19e4c6987b8cd6893bd211be4752e88bf Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 15 Feb 2022 17:31:47 +0900 Subject: [PATCH] GetIntIndicesFromView return BufferAccessor --- Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs | 93 +++++++++++++++---- 1 file changed, 74 insertions(+), 19 deletions(-) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs index ff35786c3..1d4d24ac4 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs @@ -157,15 +157,16 @@ namespace UniGLTF return segment.GetSubArray(view.byteOffset, view.byteLength); } - NativeArray GetTypedFromBufferView(int count, int byteOffset, glTFBufferView view) where T : struct + NativeArray GetBytesFromBufferView(glTFBufferView view) { var segment = GetBytesFromBuffer(view.buffer); - return segment.GetSubArray(view.byteOffset + byteOffset, count * Marshal.SizeOf()).Reinterpret(1); + return segment.GetSubArray(view.byteOffset, view.byteLength); } NativeArray GetTypedFromAccessor(glTFAccessor accessor, glTFBufferView view) where T : struct { - return GetTypedFromBufferView(accessor.count, accessor.byteOffset, view); + var bytes = GetBytesFromBufferView(view); + return bytes.GetSubArray(accessor.byteOffset, bytes.Length - accessor.byteOffset).Reinterpret(1).GetSubArray(0, accessor.count); } /// @@ -176,23 +177,27 @@ namespace UniGLTF /// /// /// - IEnumerable GetIntIndicesFromView(glTFBufferView view, int count, int byteOffset, glComponentType componentType) + BufferAccessor GetIntIndicesFromView(glTFBufferView view, int count, int byteOffset, glComponentType componentType) { + var bytes = GetBytesFromBufferView(view); switch (componentType) { case glComponentType.UNSIGNED_BYTE: { - return GetTypedFromBufferView(count, byteOffset, view).Select(x => (int)(x)); + return new BufferAccessor(NativeArrayManager, bytes.GetSubArray(byteOffset, bytes.Length - byteOffset), + AccessorValueType.UNSIGNED_BYTE, AccessorVectorType.SCALAR, count); } case glComponentType.UNSIGNED_SHORT: { - return GetTypedFromBufferView(count, byteOffset, view).Select(x => (int)(x)); + return new BufferAccessor(NativeArrayManager, bytes.GetSubArray(byteOffset, bytes.Length - byteOffset), + AccessorValueType.UNSIGNED_SHORT, AccessorVectorType.SCALAR, count); } case glComponentType.UNSIGNED_INT: { - return GetTypedFromBufferView(count, byteOffset, view).Select(x => (int)(x)); + return new BufferAccessor(NativeArrayManager, bytes.GetSubArray(byteOffset, bytes.Length - byteOffset), + AccessorValueType.UNSIGNED_INT, AccessorVectorType.SCALAR, count); } } throw new NotImplementedException("GetIndices: unknown componenttype: " + componentType); @@ -263,14 +268,39 @@ namespace UniGLTF if (sparse != null && sparse.count > 0) { // override sparse values - var indices = GetIntIndicesFromView(GLTF.bufferViews[sparse.indices.bufferView], sparse.count, sparse.indices.byteOffset, sparse.indices.componentType); - var values = GetTypedFromBufferView(sparse.count, sparse.values.byteOffset, GLTF.bufferViews[sparse.values.bufferView]); + var _indices = GetIntIndicesFromView(GLTF.bufferViews[sparse.indices.bufferView], sparse.count, sparse.indices.byteOffset, sparse.indices.componentType); + var bytes = GetBytesFromBufferView(GLTF.bufferViews[sparse.values.bufferView]); + var values = bytes.GetSubArray(sparse.values.byteOffset, bytes.Length - sparse.values.byteOffset).Reinterpret(1).GetSubArray(0, sparse.count); - var it = indices.GetEnumerator(); - for (int i = 0; i < sparse.count; ++i) + switch (_indices.ComponentType) { - it.MoveNext(); - result[it.Current] = values[i]; + case AccessorValueType.UNSIGNED_BYTE: + { + var indices = _indices.Bytes; + for (int i = 0; i < sparse.count; ++i) + { + result[indices[i]] = values[i]; + } + break; + } + case AccessorValueType.UNSIGNED_SHORT: + { + var indices = _indices.Bytes.Reinterpret(1); + for (int i = 0; i < sparse.count; ++i) + { + result[indices[i]] = values[i]; + } + break; + } + case AccessorValueType.UNSIGNED_INT: + { + var indices = _indices.Bytes.Reinterpret(1); + for (int i = 0; i < sparse.count; ++i) + { + result[indices[i]] = values[i]; + } + break; + } } } return result; @@ -300,14 +330,39 @@ namespace UniGLTF if (sparse != null && sparse.count > 0) { // override sparse values - var indices = GetIntIndicesFromView(GLTF.bufferViews[sparse.indices.bufferView], sparse.count, sparse.indices.byteOffset, sparse.indices.componentType); - var values = GetTypedFromBufferView(sparse.count * vertexAccessor.TypeCount, sparse.values.byteOffset, GLTF.bufferViews[sparse.values.bufferView]); + var _indices = GetIntIndicesFromView(GLTF.bufferViews[sparse.indices.bufferView], sparse.count, sparse.indices.byteOffset, sparse.indices.componentType); + var bytes = GetBytesFromBufferView(GLTF.bufferViews[sparse.values.bufferView]); + var values = bytes.GetSubArray(sparse.values.byteOffset, bytes.Length - sparse.values.byteOffset).Reinterpret(1).GetSubArray(0, sparse.count * vertexAccessor.TypeCount); - var it = indices.GetEnumerator(); - for (int i = 0; i < sparse.count; ++i) + switch (_indices.ComponentType) { - it.MoveNext(); - result[it.Current] = values[i]; + case AccessorValueType.UNSIGNED_BYTE: + { + var indices = _indices.Bytes; + for (int i = 0; i < sparse.count; ++i) + { + result[indices[i]] = values[i]; + } + break; + } + case AccessorValueType.UNSIGNED_SHORT: + { + var indices = _indices.Bytes.Reinterpret(1); + for (int i = 0; i < sparse.count; ++i) + { + result[indices[i]] = values[i]; + } + break; + } + case AccessorValueType.UNSIGNED_INT: + { + var indices = _indices.Bytes.Reinterpret(1); + for (int i = 0; i < sparse.count; ++i) + { + result[indices[i]] = values[i]; + } + break; + } } } return result;