Exemple #1
0
            public int WalkPathDistance(CartesianGridCoordinates sourcePosition, CartesianGridOnCubeFace sourceCubeFace, CartesianGridCoordinates targetPosition, CartesianGridOnCubeFace targetCubeFace)
            {
                var directionsRowStride = (RowCount + 1) / 2;
                var directionsSize      = 6 * RowCount * directionsRowStride;
                var distancesSize       = RowCount * RowCount * 6;

                var targetDirections = new NativeArray <byte>(directionsSize, Allocator.Temp);
                var sourceDirections = new NativeArray <byte>(directionsSize, Allocator.Temp);
                var targetDistances  = new NativeArray <int>(distancesSize, Allocator.Temp);
                var sourceDistances  = new NativeArray <int>(distancesSize, Allocator.Temp);

                // For testing purposes, recalculate paths every time.
                CartesianGridOnCubeShortestPath.CalculateShortestPathsToTarget(targetDirections, targetDistances, RowCount, targetPosition, targetCubeFace, Walls, FaceLocalToLocal);
                CartesianGridOnCubeShortestPath.CalculateShortestPathsToTarget(sourceDirections, sourceDistances, RowCount, sourcePosition, sourceCubeFace, Walls, FaceLocalToLocal);

                // Test distance form source->target is same as target->source
                var sourceCellIndex = CartesianGridOnCubeUtility.CellIndex(sourcePosition, sourceCubeFace, RowCount);
                var targetCellIndex = CartesianGridOnCubeUtility.CellIndex(targetPosition, targetCubeFace, RowCount);

                var sourceToTargetDistance = WalkPath(sourceCellIndex, targetDirections, 0);
                var targetToSourceDistance = WalkPath(targetCellIndex, sourceDirections, 0);

                Assert.AreEqual(sourceToTargetDistance, targetToSourceDistance);

                var expectedDistance = sourceToTargetDistance;

                // No surprises on stored distances
                Assert.AreEqual(sourceToTargetDistance, sourceDistances[targetCellIndex]);
                Assert.AreEqual(sourceToTargetDistance, targetDistances[sourceCellIndex]);

                // Sample path variations (not exhaustive, always follow the variation path option)
                for (int i = 1; i < 4; i++)
                {
                    // Test distance form source->target is same as target->source
                    // Test distance is same for all variations
                    sourceToTargetDistance = WalkPath(sourceCellIndex, targetDirections, i);
                    Assert.AreEqual(expectedDistance, sourceToTargetDistance);

                    targetToSourceDistance = WalkPath(targetCellIndex, sourceDirections, i);
                    Assert.AreEqual(expectedDistance, targetToSourceDistance);
                }

                targetDirections.Dispose();
                sourceDirections.Dispose();
                targetDistances.Dispose();
                sourceDistances.Dispose();

                return(expectedDistance);
            }
Exemple #2
0
    protected override JobHandle OnUpdate(JobHandle lastJobHandle)
    {
        // Get component data from the GridPlane
        var cartesianGridCube = GetSingleton <CartesianGridOnCube>();
        var rowCount          = cartesianGridCube.Blob.Value.RowCount;
        var targetDirectionsBufferCapacity = 6 * (((rowCount + 1) / 2) * rowCount);
        var targetDistancesBufferCapacity  = 6 * (rowCount * rowCount);
        var gridWalls        = (byte *)cartesianGridCube.Blob.Value.Walls.GetUnsafePtr();
        var faceLocalToLocal = (float4x4 *)cartesianGridCube.Blob.Value.FaceLocalToLocal.GetUnsafePtr();

        Entities
        .WithName("InitializeTargets")
        .WithAll <CartesianGridTarget>()
        .WithAll <CartesianGridOnCubeFace>()
        .WithNone <CartesianGridTargetDirection>()
        .WithNone <CartesianGridTargetDistance>()
        .WithStructuralChanges()
        .ForEach((Entity entity) =>
        {
            var directionBuffer = EntityManager.AddBuffer <CartesianGridTargetDirection>(entity);
            directionBuffer.ResizeUninitialized(targetDirectionsBufferCapacity);

            var distanceBuffer = EntityManager.AddBuffer <CartesianGridTargetDistance>(entity);
            distanceBuffer.ResizeUninitialized(targetDistancesBufferCapacity);
        }).Run();

        // Rebuild all the paths to the target *only* when the target's grid position changes.
        Entities
        .WithName("UpdateTargetPaths")
        .WithNativeDisableUnsafePtrRestriction(faceLocalToLocal)
        .WithAll <CartesianGridTarget>()
        .ForEach((Entity entity, ref CartesianGridTargetCoordinates prevTargetPosition, in CartesianGridOnCubeFace cubeFace, in CartesianGridCoordinates targetPosition, in DynamicBuffer <CartesianGridTargetDirection> targetDirections, in DynamicBuffer <CartesianGridTargetDistance> targetDistances) =>
        {
            if (prevTargetPosition.Equals(targetPosition))
            {
                return;
            }

            if (targetPosition.OnGrid(rowCount, rowCount))
            {
                prevTargetPosition = new CartesianGridTargetCoordinates(targetPosition);
                CartesianGridOnCubeShortestPath.CalculateShortestPathsToTarget(targetDirections.Reinterpret <byte>().AsNativeArray(), targetDistances.Reinterpret <int>().AsNativeArray(), rowCount, targetPosition, cubeFace, gridWalls, faceLocalToLocal);
            }
        }).Run();