mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-05-21 10:18:01 -05:00
GetIntIndicesFromView return BufferAccessor
This commit is contained in:
parent
115ca18b51
commit
dac2a5e19e
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user