/// <summary> /// takes in a by-voxel data array. returns another array of the same format with the diffused results. /// may modify the values in the input array. may return the input array. will handle disposing the input /// array if not returned. /// </summary> public static void ComputeDiffusion( VolumetricWorldVoxelLayout voxelLayout, DoubleBuffered <float> layerData, NativeArray <float> diffusionConstantMultipliers, float minimumDiffusionConstantMultiplier, float deltaTime, float diffusionConstant, ref JobHandleWrapper dependecy) { var combinedDiffusionFactor = deltaTime * diffusionConstant; if (combinedDiffusionFactor >= 1f / 6) { throw new System.ArgumentException("diffusion factor cannot exceed the connectivity of each node"); } var adjacencyVectors = new NativeArray <Vector3Int>(new[] { new Vector3Int(1, 0, 0), new Vector3Int(-1, 0, 0), new Vector3Int(0, 1, 0), new Vector3Int(0, -1, 0), new Vector3Int(0, 0, 1), new Vector3Int(0, 0, -1), }, Allocator.TempJob); var diffuseJob = new VoxelAdjacencyResourceConservingBoundaryComputeJob { sourceDiffusionValues = layerData.CurrentData, targetDiffusionValues = layerData.NextData, diffusionConstantAdjusters = diffusionConstantMultipliers, minimumDiffusionConstantMultiplier = minimumDiffusionConstantMultiplier, maximumDiffsuionConstant = 1 / 7f, adjacencyVectors = adjacencyVectors, voxelLayout = voxelLayout, diffusionConstant = combinedDiffusionFactor }; dependecy = diffuseJob.Schedule(layerData.CurrentData.Length, 1000, dependecy); layerData.Swap(); adjacencyVectors.Dispose(dependecy); }
public override void Update(GameTime gameTime) { if (processDuringPause || Environment?.IsPaused == false) { foreach (var @object in objects.Current) { @object.Update(gameTime); if (@object.IsAlive) { objects.Other.Add(@object); } } objects.Current.Clear(); objects.Swap(); } }