#if (OBI_BURST && OBI_MATHEMATICS && OBI_COLLECTIONS) using Unity.Jobs; using Unity.Collections; using Unity.Mathematics; using Unity.Burst; using UnityEngine; namespace Obi { [BurstCompile] struct InterpolationJob : IJobParallelFor { [ReadOnly] public NativeArray positions; [ReadOnly] public NativeArray startPositions; [ReadOnly] public NativeArray endPositions; [WriteOnly] public NativeArray renderablePositions; [ReadOnly] public NativeArray orientations; [ReadOnly] public NativeArray startOrientations; [ReadOnly] public NativeArray endOrientations; [WriteOnly] public NativeArray renderableOrientations; [ReadOnly] public NativeArray principalRadii; [WriteOnly] public NativeArray renderableRadii; [ReadOnly] public float blendFactor; [ReadOnly] public Oni.SolverParameters.Interpolation interpolationMode; // The code actually running on the job public void Execute(int i) { if (interpolationMode == Oni.SolverParameters.Interpolation.Interpolate) { renderablePositions[i] = math.lerp(startPositions[i], endPositions[i], blendFactor); renderableOrientations[i] = math.normalize(math.slerp(startOrientations[i], endOrientations[i], blendFactor)); renderableRadii[i] = principalRadii[i]; } else if (interpolationMode == Oni.SolverParameters.Interpolation.Extrapolate) { renderablePositions[i] = math.lerp(endPositions[i], positions[i], blendFactor); renderableOrientations[i] = math.normalize(math.slerp(endOrientations[i], orientations[i], blendFactor)); renderableRadii[i] = principalRadii[i]; } else { renderablePositions[i] = endPositions[i]; renderableOrientations[i] = math.normalize(endOrientations[i]); renderableRadii[i] = principalRadii[i]; } } } } #endif