Пример #1
0
        /// <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);
        }
Пример #2
0
        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();
            }
        }