#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 startPositions; [ReadOnly] public NativeArray positions; [WriteOnly] public NativeArray renderablePositions; [ReadOnly] public NativeArray startOrientations; [ReadOnly] public NativeArray orientations; [WriteOnly] public NativeArray 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