#if (OBI_BURST && OBI_MATHEMATICS && OBI_COLLECTIONS) using UnityEngine; using Unity.Jobs; using Unity.Collections; using Unity.Mathematics; using Unity.Burst; using System; using System.Collections; namespace Obi { [BurstCompile] struct UpdateVelocitiesJob : IJobParallelFor { [ReadOnly] public NativeArray activeParticles; // linear/position properties: [ReadOnly] public NativeArray inverseMasses; [ReadOnly] public NativeArray previousPositions; [NativeDisableParallelForRestriction] public NativeArray positions; [NativeDisableParallelForRestriction] [WriteOnly] public NativeArray velocities; // angular/orientation properties: [ReadOnly] public NativeArray inverseRotationalMasses; [ReadOnly] public NativeArray previousOrientations; [NativeDisableParallelForRestriction] public NativeArray orientations; [NativeDisableParallelForRestriction] [WriteOnly] public NativeArray angularVelocities; [ReadOnly] public float deltaTime; [ReadOnly] public bool is2D; // The code actually running on the job public void Execute(int index) { int i = activeParticles[index]; // Project particles on the XY plane if we are in 2D mode: if (is2D) { // restrict position to the 2D plane float4 pos = positions[i]; pos[2] = previousPositions[i][2]; positions[i] = pos; } if (inverseMasses[i] > 0) velocities[i] = BurstIntegration.DifferentiateLinear(positions[i], previousPositions[i], deltaTime); else velocities[i] = float4.zero; if (inverseRotationalMasses[i] > 0) angularVelocities[i] = BurstIntegration.DifferentiateAngular(orientations[i], previousOrientations[i], deltaTime); else angularVelocities[i] = float4.zero; } } } #endif