51 lines
2.0 KiB
C#
51 lines
2.0 KiB
C#
using UnityEngine;
|
|
using Unity.Burst;
|
|
using Unity.Collections;
|
|
using Unity.Jobs;
|
|
using Unity.Mathematics;
|
|
using Pathfinding.Jobs;
|
|
using UnityEngine.Assertions;
|
|
|
|
namespace Pathfinding.Graphs.Grid.Jobs {
|
|
/// <summary>
|
|
/// Copies 3D arrays with grid data from one shape to another.
|
|
///
|
|
/// Only the data for the nodes that exist in both buffers will be copied.
|
|
///
|
|
/// This essentially is several <see cref="JobCopyRectangle"/> jobs in one (to avoid scheduling overhead).
|
|
/// See that job for more documentation.
|
|
/// </summary>
|
|
[BurstCompile]
|
|
public struct JobCopyBuffers : IJob {
|
|
[ReadOnly]
|
|
[DisableUninitializedReadCheck]
|
|
public GridGraphNodeData input;
|
|
|
|
[WriteOnly]
|
|
public GridGraphNodeData output;
|
|
public IntBounds bounds;
|
|
|
|
public bool copyPenaltyAndTags;
|
|
|
|
public void Execute () {
|
|
#if ENABLE_UNITY_COLLECTIONS_CHECKS
|
|
if (!input.bounds.Contains(bounds)) throw new System.ArgumentException("Bounds are outside the source buffer");
|
|
if (!output.bounds.Contains(bounds)) throw new System.ArgumentException("Bounds are outside the destination buffer");
|
|
#endif
|
|
var inputSlice = new Slice3D(input.bounds, bounds);
|
|
var outputSlice = new Slice3D(output.bounds, bounds);
|
|
// Note: Having a single job that copies all of the buffers avoids a lot of scheduling overhead.
|
|
// We do miss out on parallelization, however for this job it is not that significant.
|
|
JobCopyRectangle<Vector3>.Copy(input.positions, output.positions, inputSlice, outputSlice);
|
|
JobCopyRectangle<float4>.Copy(input.normals, output.normals, inputSlice, outputSlice);
|
|
JobCopyRectangle<ulong>.Copy(input.connections, output.connections, inputSlice, outputSlice);
|
|
if (copyPenaltyAndTags) {
|
|
JobCopyRectangle<uint>.Copy(input.penalties, output.penalties, inputSlice, outputSlice);
|
|
JobCopyRectangle<int>.Copy(input.tags, output.tags, inputSlice, outputSlice);
|
|
}
|
|
JobCopyRectangle<bool>.Copy(input.walkable, output.walkable, inputSlice, outputSlice);
|
|
JobCopyRectangle<bool>.Copy(input.walkableWithErosion, output.walkableWithErosion, inputSlice, outputSlice);
|
|
}
|
|
}
|
|
}
|