using Unity.Collections;
using Unity.Jobs;
#if ENABLE_VRM10_BURST
using Unity.Burst;
#endif
namespace UniVRM10
{
///
/// インデックス配列を、オフセットを加えながら複製するJob郡
/// MEMO: ushortを考慮することをやめればかなりシンプルに書ける
///
internal struct CopyIndicesJobs
{
///
/// unsigned int -> unsigned int
///
#if ENABLE_VRM10_BURST
[BurstCompile]
#endif
public struct UInt2UInt : IJobParallelFor
{
private readonly uint _vertexOffset;
[ReadOnly] private readonly NativeSlice _source;
[WriteOnly] private NativeSlice _destination;
public UInt2UInt(uint vertexOffset, NativeSlice source, NativeSlice destination)
{
_vertexOffset = vertexOffset;
_source = source;
_destination = destination;
}
public void Execute(int index)
{
_destination[index] = _source[index] + _vertexOffset;
}
}
///
/// unsigned short -> unsigned int
///
#if ENABLE_VRM10_BURST
[BurstCompile]
#endif
public struct Ushort2Uint : IJobParallelFor
{
private readonly uint _vertexOffset;
[ReadOnly] private readonly NativeSlice _source;
[WriteOnly] private NativeSlice _destination;
public Ushort2Uint(uint vertexOffset, NativeSlice source, NativeSlice destination)
{
_vertexOffset = vertexOffset;
_source = source;
_destination = destination;
}
public void Execute(int index)
{
_destination[index] = _source[index] + _vertexOffset;
}
}
///
/// unsigned short -> unsigned short
///
#if ENABLE_VRM10_BURST
[BurstCompile]
#endif
public struct Ushort2Ushort : IJobParallelFor
{
private readonly ushort _vertexOffset;
[ReadOnly] private readonly NativeSlice _source;
[WriteOnly] private NativeSlice _destination;
public Ushort2Ushort(ushort vertexOffset, NativeSlice source, NativeSlice destination)
{
_vertexOffset = vertexOffset;
_source = source;
_destination = destination;
}
public void Execute(int index)
{
_destination[index] = (ushort)(_source[index] + _vertexOffset);
}
}
///
/// unsigned int -> unsigned short
///
#if ENABLE_VRM10_BURST
[BurstCompile]
#endif
public struct Uint2Ushort : IJobParallelFor
{
private readonly ushort _vertexOffset;
[ReadOnly] private readonly NativeSlice _source;
[WriteOnly] private NativeSlice _destination;
public Uint2Ushort(ushort vertexOffset, NativeSlice source, NativeSlice destination)
{
_vertexOffset = vertexOffset;
_source = source;
_destination = destination;
}
public void Execute(int index)
{
_destination[index] = (ushort)(_source[index] + _vertexOffset);
}
}
}
}