/// <summary> /// Processes the grid southwards and assigns all distances per tile in the southward direction. /// </summary> private void ProcessGridSouthwards(NavTileSurfaceData inData) { int currentDistance = 0; RectInt gridBounds = inData.GridBounds.AsRect(); Vector2Int coordinate = new Vector2Int(); for (coordinate.x = gridBounds.xMin; coordinate.x <= gridBounds.xMax; coordinate.x++) { for (coordinate.y = gridBounds.yMin; coordinate.y <= gridBounds.yMax; coordinate.y++) { TileData tile = inData.GetTileData(coordinate); if (tile == null) { continue; } AdditionalJPSPlusData addedData = tile.AdditionalData; if (coordinate.y == gridBounds.yMin || !inData.IsTileWalkable(coordinate + new Vector2Int(0, -1), 1)) { addedData.SetJumpDistance(JumpPointDirection.South, 0); } else if (inData.IsTileWalkable(coordinate + new Vector2Int(0, -1), 1) && (inData.GetTileData(coordinate + new Vector2Int(0, -1))?.AdditionalData.GetJumpDistance(JumpPointDirection.West) > 0 || inData.GetTileData(coordinate + new Vector2Int(0, -1))?.AdditionalData.GetJumpDistance(JumpPointDirection.East) > 0)) { addedData.SetJumpDistance(JumpPointDirection.South, 1); } else { currentDistance = inData.GetTileData(coordinate + new Vector2Int(0, -1)).AdditionalData.GetJumpDistance(JumpPointDirection.South); if (currentDistance > 0) { addedData.SetJumpDistance(JumpPointDirection.South, currentDistance + 1); } else { addedData.SetJumpDistance(JumpPointDirection.South, currentDistance - 1); } } } } }
/// <summary> /// Processes the grid westwards and assigns all distances per tile in the westward direction. /// </summary> private void ProcessGridWestwards(NavTileSurfaceData inData) { int currentDistance = 0; TileData relevantTile = null; RectInt gridBounds = inData.GridBounds.AsRect(); Vector2Int coordinate = new Vector2Int(); for (coordinate.x = gridBounds.xMin, coordinate.y = gridBounds.yMin; coordinate.x < gridBounds.xMax && coordinate.y < gridBounds.yMax; coordinate.y++) { for (; coordinate.x < gridBounds.xMax; coordinate.x++) { TileData currentTile = inData.GetTileData(coordinate); SetDistance(JumpPointDirection.West, currentTile, ref relevantTile, ref currentDistance); } coordinate.x = gridBounds.xMin; relevantTile = null; currentDistance = 0; } }
/// <summary> /// Checks the grid and marks any jump point. /// </summary> private void IdentifyJumpPoint(KeyValuePair <Vector2Int, TileData> inTile, NavTileSurfaceData inData) { JumpPointDirection jumpPointFlag = JumpPointDirection.None; if (inTile.Value == null || !inTile.Value.IsWalkable(1)) { return; } // Hard coded 0 to 3 as there are only 4 cardinal directions. for (int i = 0; i <= 3; i++) { JumpPointDirection parentDirection = (JumpPointDirection)(1 << i); Vector2Int parentPosition = GetNextPositionInDirection(inTile.Key, parentDirection); TileData parentTile = inData.GetTileData(parentPosition); if (parentTile == null || !parentTile.IsWalkable(1)) { continue; } JumpPointDirection firstPerpendicularDirection; JumpPointDirection secondPerpendicularDirection; GetPerpendicularDirections(parentDirection, out firstPerpendicularDirection, out secondPerpendicularDirection); if ((HasAdjacentTraverseNode(inTile.Key, firstPerpendicularDirection, inData) && !HasAdjacentTraverseNode(parentPosition, firstPerpendicularDirection, inData)) || HasAdjacentTraverseNode(inTile.Key, secondPerpendicularDirection, inData) && !HasAdjacentTraverseNode(parentPosition, secondPerpendicularDirection, inData)) { jumpPointFlag |= GetOppositeDirection(parentDirection); } } (inTile.Value.AdditionalData as AdditionalJPSPlusData).JumpPointDirections = jumpPointFlag; }