示例#1
0
    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);
    }
示例#2
0
    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);
    }
示例#3
0
 static void AddToOutline(List <XLocalPosition> outline, XLocalPosition item, HashSet <XLocalPosition> visited)
 {
     visited.Add(item);
     outline.Add(item);
 }
示例#4
0
 public bool TryGetBackwardValue(XLocalPosition key, out XLocalPosition value)
 {
     return(backwardLookup.TryGetValue(key, out value));
 }
示例#5
0
 public void AddPair(XLocalPosition start, XLocalPosition end)
 {
     forwardLookup[start] = end;
     backwardLookup[end]  = start;
 }