static TwoWayLookup CreateLookupTable(int capacity, byte[,] configurations) { var lookupTable = new TwoWayLookup(capacity); int length = configurations.GetLength(0); int width = configurations.GetLength(1); for (int y = 0; y < width; y++) { for (int x = 0; x < length; x++) { byte[] outlineData = outlineTable[configurations[x, y]]; for (int i = 0; i < outlineData.Length; i += 2) { var a = new XLocalPosition(x, y, outlineData[i]); var b = new XLocalPosition(x, y, outlineData[i + 1]); lookupTable.AddPair(a, b); } } } return(lookupTable); }
public static List <Vector3[]> Generate(OIGrid grid, Vector3 basePos, int squareSize) { byte[,] configurations = XMarchingSquares.ComputeConfigurations(grid); int numOutlineEdges = CountOutlineEdges(configurations); TwoWayLookup outlineLookup = CreateLookupTable(numOutlineEdges, configurations); var outlines = new List <Vector3[]>(); var visited = new HashSet <XLocalPosition>(); foreach (var pair in outlineLookup.EnumerateBackwards()) { if (!visited.Contains(pair.Key)) { XLocalPosition start = pair.Key; XLocalPosition next = pair.Value; var outline = new List <XLocalPosition>(); AddToOutline(outline, start, visited); AddToOutline(outline, next, visited); // first do a backward pass until looping or running out of connected outline edges while (start != next && outlineLookup.TryGetBackwardValue(next, out next)) { AddToOutline(outline, next, visited); } outline.Reverse(); // if no loop, then do a forward pass from the starting point if (start != next) { next = start; while (outlineLookup.TryGetForwardValue(next, out next)) { AddToOutline(outline, next, visited); } } outlines.Add(ToGlobalPositions(outline, squareSize, basePos)); } } return(outlines); }
static void AddToOutline(List <XLocalPosition> outline, XLocalPosition item, HashSet <XLocalPosition> visited) { visited.Add(item); outline.Add(item); }
public bool TryGetBackwardValue(XLocalPosition key, out XLocalPosition value) { return(backwardLookup.TryGetValue(key, out value)); }
public void AddPair(XLocalPosition start, XLocalPosition end) { forwardLookup[start] = end; backwardLookup[end] = start; }