/** Calculates the grid connections for a single node */ public virtual void CalculateConnections (GridNode[] graphNodes, int x, int z, GridNode node) { //Reset all connections node.flags = node.flags & -256; //All connections are disabled if the node is not walkable if (!node.walkable) { return; } int index = node.GetIndex (); if (corners == null) { corners = new int[4]; } else { for (int i = 0;i<4;i++) { corners[i] = 0; } } for (int i=0, j = 3; i<4; j = i, i++) { int nx = x + neighbourXOffsets[i]; int nz = z + neighbourZOffsets[i]; if (nx < 0 || nz < 0 || nx >= width || nz >= depth) { continue; } GridNode other = graphNodes[index+neighbourOffsets[i]]; if (IsValidConnection (node, other)) { node.SetConnectionRaw (i,1); corners[i]++; corners[j]++; } } if (neighbours == NumNeighbours.Eight) { if (cutCorners) { for (int i=0; i<4; i++) { if (corners[i] >= 1) { int nx = x + neighbourXOffsets[i+4]; int nz = z + neighbourZOffsets[i+4]; if (nx < 0 || nz < 0 || nx >= width || nz >= depth) { continue; } GridNode other = graphNodes[index+neighbourOffsets[i+4]]; if (IsValidConnection (node,other)) { node.SetConnectionRaw (i+4,1); } } } } else { for (int i=0; i<4; i++) { //We don't need to check if it is out of bounds because if both of the other neighbours are inside the bounds this one must be too if (corners[i] == 2) { GridNode other = graphNodes[index+neighbourOffsets[i+4]]; if (IsValidConnection (node,other)) { node.SetConnectionRaw (i+4,1); } } } } } }