Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
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);
        }
Ejemplo n.º 3
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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
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);
 }
Ejemplo n.º 8
0
 /// <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);
Ejemplo n.º 9
0
 /// <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);
Ejemplo n.º 10
0
 public override void RemoveEffects(VoxelWorldVolumetricLayerData layerData, ref JobHandleWrapper dependency)
 {
     // command buffer has no record of the effects it has had on the world
     return;
 }
Ejemplo n.º 11
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);
Ejemplo n.º 12
0
 public override bool ApplyEffectToLayer(DoubleBuffered <float> layerData, VoxelWorldVolumetricLayerData readonlyLayerData, float deltaTime, ref JobHandleWrapper dependecy)
 {
     UpdateDestructionFlags(layerData, readonlyLayerData, deltaTime, ref dependecy);
     return(true);
 }