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); }
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); }
/// <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); }
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); }
public Map() { InitializeComponent(); DoubleBuffered.Equals(true); }
/// <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);
public override bool ApplyEffectToLayer(DoubleBuffered <float> layerData, VoxelWorldVolumetricLayerData readonlyLayerData, float deltaTime, ref JobHandleWrapper dependecy) { UpdateDestructionFlags(layerData, readonlyLayerData, deltaTime, ref dependecy); return(true); }