public static OffsetCoords ConvertToOffset(CubeCoords cube) { var col = cube.X + (cube.Z - (cube.Z & 1)) / 2; var row = cube.Z; return(new OffsetCoords(col, row)); }
public IEnumerable <ITerrainNode> GetNeighborNodes(ITerrainNode node) { var offsetCoords = node.Offset; var segmentX = offsetCoords.X / _segmentSize; if (offsetCoords.X < 0) { segmentX--; } var segmentY = offsetCoords.Y / _segmentSize; if (offsetCoords.Y < 0) { segmentY--; } var localOffsetX = NormalizeNeighborCoord(offsetCoords.X % _segmentSize); var localOffsetY = NormalizeNeighborCoord(offsetCoords.Y % _segmentSize); var segmentKey = new SegmentKey(segmentX, segmentY); var matrix = _segmentDict[segmentKey]; var directions = HexHelper.GetOffsetClockwise(); var currentCubeCoords = HexHelper.ConvertToCube(localOffsetX, localOffsetY); for (var i = 0; i < 6; i++) { var dir = directions[i]; var neighborLocalCube = new CubeCoords(dir.X + currentCubeCoords.X, dir.Y + currentCubeCoords.Y, dir.Z + currentCubeCoords.Z); var neighborLocalOffset = HexHelper.ConvertToOffset(neighborLocalCube); var neighborSegmentX = segmentX; var neighborSegmentY = segmentY; if (neighborLocalOffset.X < 0) { neighborSegmentX--; } else if (neighborLocalOffset.X >= _segmentSize) { neighborSegmentX++; } if (neighborLocalOffset.Y < 0) { neighborSegmentY--; } else if (neighborLocalOffset.Y >= _segmentSize) { neighborSegmentY++; } if (neighborSegmentX == segmentX && neighborSegmentY == segmentY) { yield return(matrix[neighborLocalOffset.X, neighborLocalOffset.Y]); } else { var segmentMatrix = CreateSegment(neighborSegmentX, neighborSegmentY); var neighborX = NormalizeNeighborCoord(neighborLocalOffset.X); var neighborY = NormalizeNeighborCoord(neighborLocalOffset.Y); yield return(segmentMatrix[neighborX, neighborY]); } } }