Пример #1
0
        private void RepairDamage(DoubleBuffered <float> layerData, VoxelWorldVolumetricLayerData readonlyLayerData, float deltaTime, ref JobHandleWrapper dependency)
        {
            damageDataUpdateDependency?.Complete();
            var voxelLayers  = readonlyLayerData;
            var damageValues = layerData.CurrentData; // this is not a parallized job, so edits are made in-place
            var dampenDamage = new DampenDamageJob
            {
                voxelLayerData               = voxelLayers,
                voxelLayout                  = voxelLayers.VoxelLayout,
                volumetricDamageValues       = damageValues,
                durabilityRegenerationFactor = Mathf.Exp(regenerationPerSecondAsPercentOfDurability * Time.deltaTime) - 1
            };

            dependency = JobHandle.CombineDependencies(destructionFlagReadDependencies, dependency);
            dependency = dampenDamage.Schedule(damageValues.Length, 1000, dependency);
        }
Пример #2
0
        public virtual bool ApplyLayerWideUpdate(VoxelWorldVolumetricLayerData data, float deltaTime, ref JobHandleWrapper dependecy)
        {
            if (effects.Length <= 0)
            {
                return(false);
            }


            var voxelLayout = data.VoxelLayout;
            var copyInData  = new NativeArray <float>(voxelLayout.totalVoxels, Allocator.TempJob);

            var copyInJob = new CopyVoxelToWorkingDataJob
            {
                layerData  = data,
                targetData = copyInData,
                layerId    = voxelLayerId
            };

            dependecy = copyInJob.Schedule(copyInData.Length, 1000, dependecy);

            var swapSpace   = new NativeArray <float>(voxelLayout.totalVoxels, Allocator.TempJob);
            var workingData = new DoubleBuffered <float>(copyInData, swapSpace);

            var changed = false;

            foreach (var effect in effects)
            {
                if (effect.ApplyEffectToLayer(workingData, data, deltaTime, ref dependecy))
                {
                    changed = true;
                }
            }

            if (changed)
            {
                var copyBackJob = new CopyWorkingDataToVoxels
                {
                    layerData  = data,
                    sourceData = workingData.CurrentData,
                    layerId    = this.voxelLayerId
                };
                dependecy = copyBackJob.Schedule(workingData.CurrentData.Length, 1000, dependecy);
                workingData.Dispose(dependecy);
            }

            return(changed);
        }
Пример #3
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);
        }
Пример #4
0
        private void UpdateDestructionFlags(DoubleBuffered <float> layerData, VoxelWorldVolumetricLayerData readonlyLayerData, float deltaTime, ref JobHandleWrapper dependency)
        {
            damageDataUpdateDependency?.Complete();

            var damageValues = layerData.CurrentData; // this is not a parallized job, so edits are made in-place

            var voxelLayers = readonlyLayerData;
            var updateJob   = new UpdatePlantDestructionFlags
            {
                voxelLayerData    = voxelLayers,
                flagCapLayerIndex = voxelResourceCapLayerId,
                voxelLayout       = voxelLayers.VoxelLayout,

                volumetricDamageValues          = damageValues,
                volumetricDestructionTimestamps = volumetricDestructionTimestamps,
                currentTime = Time.time,
                durabilityRegenerationFactor = Mathf.Exp(regenerationPerSecondAsPercentOfDurability * deltaTime) - 1
            };

            dependency = JobHandle.CombineDependencies(destructionFlagReadDependencies, dependency);

            damageDataUpdateDependency = dependency = updateJob.Schedule(damageValues.Length, 1000, dependency);
        }
 public override bool ApplyEffectToLayer(DoubleBuffered <float> layerData, VoxelWorldVolumetricLayerData readonlyLayerData, float deltaTime, ref JobHandleWrapper dependecy)
 {
     ComputeDiffusion(layerData, readonlyLayerData.VoxelLayout, deltaTime, globalDiffusionConstant, ref dependecy);
     return(true);
 }
Пример #6
0
 public Map()
 {
     InitializeComponent();
     DoubleBuffered.Equals(true);
 }
Пример #7
0
 /// <summary>
 /// apply whatever effect this transform applies to the layer.
 ///
 /// </summary>
 /// <param name="data"></param>
 /// <param name="deltaTime"></param>
 /// <param name="dependecy"></param>
 /// <returns>true if any changes were applied</returns>
 public abstract bool ApplyEffectToLayer(DoubleBuffered <float> layerData, VoxelWorldVolumetricLayerData readonlyLayerData, float deltaTime, ref JobHandleWrapper dependecy);
Пример #8
0
 public override bool ApplyEffectToLayer(DoubleBuffered <float> layerData, VoxelWorldVolumetricLayerData readonlyLayerData, float deltaTime, ref JobHandleWrapper dependecy)
 {
     UpdateDestructionFlags(layerData, readonlyLayerData, deltaTime, ref dependecy);
     return(true);
 }