#if (OBI_BURST && OBI_MATHEMATICS && OBI_COLLECTIONS) using UnityEngine; using Unity.Jobs; using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; using Unity.Mathematics; using Unity.Burst; using System; using System.Collections; using System.Threading; namespace Obi { [BurstCompile] unsafe struct UpdateParticleLifetimesJob : IJobParallelFor { [ReadOnly] public NativeArray activeParticles; [NativeDisableParallelForRestriction] public NativeArray life; [NativeDisableParallelForRestriction] public NativeArray deadParticles; [NativeDisableContainerSafetyRestriction] public NativeReference deadParticleCount; [ReadOnly] public float dt; public void Execute(int i) { int p = activeParticles[i]; life[p] -= dt; if (life[p] <= 0) { int* countRef = (int*)deadParticleCount.GetUnsafePtr(); int count = Interlocked.Increment(ref countRef[0]) - 1; deadParticles[count] = p; life[p] = 0; } } } } #endif