public override void RemoveEffects(VoxelWorldVolumetricLayerData layerData, ref JobHandleWrapper dependency) { var layout = layerData.VoxelLayout; var subtractCleanupJob = new NativeArrayAdditionNegativeProtection { allBaseMarkers = layerData, layerToAdd = newValues, layerMultiplier = -1, markerLayerIndex = doubleBufferedLayerIndex, totalLayersInBase = layout.dataLayerCount }; dependency = subtractCleanupJob.Schedule(layout.totalVoxels, 1000, dependency + writeDependency); }
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); }
public override bool ConsolidateChanges(VoxelWorldVolumetricLayerData layerData, ref JobHandleWrapper dependency) { if (!newDataIsAvailable) { return(false); } var commandPlaybackJob = new LayerModificationCommandPlaybackJob { commands = modificationCommands, dataArray = layerData, voxelLayout = voxelLayout }; dependency = commandPlaybackJob.Schedule(dependency + writeDependency); RegisterReadDependency(dependency); newDataIsAvailable = false; return(true); }
public override bool ConsolidateChanges(VoxelWorldVolumetricLayerData layerData, ref JobHandleWrapper dependency) { // TODO: consider skipping if writeDependency is not complete yet. should the job chain keep extending, or should // consolidation be deffered? if (!newDataIsAvailable) { return(false); } var consolidationJob = new VoxelMarkerConsolidation { allBaseMarkers = layerData, oldMarkerLevels = oldValues, newMarkerLevels = newValues, markerLayerIndex = doubleBufferedLayerIndex, }; dependency = consolidationJob.Schedule(newValues.Length, 1000, dependency + writeDependency); RegisterReadDependency(dependency); newDataIsAvailable = false; return(true); }
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); }
/// <summary> /// remove any persistent effects this handle has on the world. <br/> /// For a double buffered handle, this means subtracting the total sum which this /// handle has contributed to the volume world /// </summary> public abstract void RemoveEffects(VoxelWorldVolumetricLayerData layerData, ref JobHandleWrapper dependency);
/// <summary> /// Plays back any changes that have been cached inside this modification handle /// </summary> /// <param name="layerData">the layer data to apply changes to</param> /// <param name="dependency">job handle</param> /// <returns>true if any changes were available to be applied, false otherwise</returns> public abstract bool ConsolidateChanges(VoxelWorldVolumetricLayerData layerData, ref JobHandleWrapper dependency);
public override void RemoveEffects(VoxelWorldVolumetricLayerData layerData, ref JobHandleWrapper dependency) { // command buffer has no record of the effects it has had on the world return; }
/// <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); }