GetIntIndicesFromView return BufferAccessor

This commit is contained in:
ousttrue 2022-02-15 17:31:47 +09:00
parent 115ca18b51
commit dac2a5e19e

View File

@ -157,15 +157,16 @@ namespace UniGLTF
return segment.GetSubArray(view.byteOffset, view.byteLength);
}
NativeArray<T> GetTypedFromBufferView<T>(int count, int byteOffset, glTFBufferView view) where T : struct
NativeArray<byte> GetBytesFromBufferView(glTFBufferView view)
{
var segment = GetBytesFromBuffer(view.buffer);
return segment.GetSubArray(view.byteOffset + byteOffset, count * Marshal.SizeOf<T>()).Reinterpret<T>(1);
return segment.GetSubArray(view.byteOffset, view.byteLength);
}
NativeArray<T> GetTypedFromAccessor<T>(glTFAccessor accessor, glTFBufferView view) where T : struct
{
return GetTypedFromBufferView<T>(accessor.count, accessor.byteOffset, view);
var bytes = GetBytesFromBufferView(view);
return bytes.GetSubArray(accessor.byteOffset, bytes.Length - accessor.byteOffset).Reinterpret<T>(1).GetSubArray(0, accessor.count);
}
/// <summary>
@ -176,23 +177,27 @@ namespace UniGLTF
/// <param name="byteOffset"></param>
/// <param name="componentType"></param>
/// <returns></returns>
IEnumerable<int> 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<Byte>(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<UInt16>(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<UInt32>(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<T>(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<T>(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<ushort>(1);
for (int i = 0; i < sparse.count; ++i)
{
result[indices[i]] = values[i];
}
break;
}
case AccessorValueType.UNSIGNED_INT:
{
var indices = _indices.Bytes.Reinterpret<int>(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<float>(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<float>(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<ushort>(1);
for (int i = 0; i < sparse.count; ++i)
{
result[indices[i]] = values[i];
}
break;
}
case AccessorValueType.UNSIGNED_INT:
{
var indices = _indices.Bytes.Reinterpret<int>(1);
for (int i = 0; i < sparse.count; ++i)
{
result[indices[i]] = values[i];
}
break;
}
}
}
return result;