42 lines
1.5 KiB
C#
42 lines
1.5 KiB
C#
#if (OBI_BURST && OBI_MATHEMATICS && OBI_COLLECTIONS)
|
|
using Unity.Jobs;
|
|
using Unity.Collections;
|
|
using Unity.Mathematics;
|
|
using Unity.Burst;
|
|
|
|
namespace Obi
|
|
{
|
|
[BurstCompile]
|
|
struct InterpolationJob : IJobParallelFor
|
|
{
|
|
[ReadOnly] public NativeArray<float4> startPositions;
|
|
[ReadOnly] public NativeArray<float4> positions;
|
|
[WriteOnly] public NativeArray<float4> renderablePositions;
|
|
|
|
[ReadOnly] public NativeArray<quaternion> startOrientations;
|
|
[ReadOnly] public NativeArray<quaternion> orientations;
|
|
[WriteOnly] public NativeArray<quaternion> renderableOrientations;
|
|
|
|
[ReadOnly] public float deltaTime;
|
|
[ReadOnly] public float unsimulatedTime;
|
|
[ReadOnly] public Oni.SolverParameters.Interpolation interpolationMode;
|
|
|
|
// The code actually running on the job
|
|
public void Execute(int i)
|
|
{
|
|
if (interpolationMode == Oni.SolverParameters.Interpolation.Interpolate && deltaTime > 0)
|
|
{
|
|
float alpha = unsimulatedTime / deltaTime;
|
|
|
|
renderablePositions[i] = math.lerp(startPositions[i], positions[i], alpha);
|
|
renderableOrientations[i] = math.normalize(math.slerp(startOrientations[i], orientations[i], alpha));
|
|
}
|
|
else
|
|
{
|
|
renderablePositions[i] = positions[i];
|
|
renderableOrientations[i] = math.normalize(orientations[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif |