internal int[][] GenerateFacesInternal(MeshGenerator g) { if (IsEdge) { return(new int[0][]); } // Normal case { var below = g.Allocated[RelativeId(0, 1)]; var right = g.Allocated[RelativeId(1, 0)]; var diagonal = g.Allocated[RelativeId(1, 1)]; var edges = new List <int[]>(); // Simple case for (var row = 0; row < Size; row += Zoom) { for (var col = 0; col < Size; col += Zoom) { var v1 = VertexIndex(col, row); if (col + Zoom == Size) { // to right if (row + Zoom == Size) { // diagonal if (DrawDiagonal) { if (false) // (Zoom == right.Zoom && Zoom == below.Zoom) { var right_row = right.Zoom * (row / right.Zoom); var v2 = right.VertexIndex(0, right_row); var below_col = below.Zoom * (col / below.Zoom); var v3 = below.VertexIndex(below_col, 0); var v4 = diagonal.VertexIndex(0, 0); edges.Add(new[] { v1, v3, v2 }); edges.Add(new[] { v2, v3, v4 }); } else { // Compare right if (Zoom == right.Zoom) { edges.Add(new[] { v1, diagonal.VertexIndex(0, 0), right.VertexIndex(0, Size - right.Zoom) }); } else if (Zoom < right.Zoom && below.IsVertexIndex(col, 0)) { var v2 = below.VertexIndex(col, 0); var v3 = diagonal.VertexIndex(0, 0); edges.Add(new[] { v1, v2, v3 }); } else if (Zoom > right.Zoom) { for (var right_row = row; right_row < Size - right.Zoom; right_row += right.Zoom) { edges.Add(new[] { v1, right.VertexIndex(0, right_row + right.Zoom), right.VertexIndex(0, right_row) }); } edges.Add(new[] { v1, diagonal.VertexIndex(0, 0), right.VertexIndex(0, Size - right.Zoom) }); } // Compare below if (Zoom == below.Zoom) { edges.Add(new[] { v1, below.VertexIndex(Size - below.Zoom, 0), diagonal.VertexIndex(0, 0) }); } else if (Zoom < below.Zoom && right.IsVertexIndex(0, row)) { var v2 = right.VertexIndex(0, row); var v3 = diagonal.VertexIndex(0, 0); edges.Add(new[] { v1, v3, v2 }); } else if (Zoom > below.Zoom) { for (var below_col = col; below_col < Size - below.Zoom; below_col += below.Zoom) { edges.Add(new[] { v1, below.VertexIndex(below_col, 0), below.VertexIndex(below_col + below.Zoom, 0) }); } edges.Add(new[] { v1, below.VertexIndex(Size - below.Zoom, 0), diagonal.VertexIndex(0, 0) }); } } } } else { // to right only, same zoom if (Zoom == right.Zoom) { if (DrawRight1) { var v2 = right.VertexIndex(0, row); var v3 = VertexIndex(col, row + Zoom); var v4 = right.VertexIndex(0, row + Zoom); edges.Add(new[] { v1, v3, v2 }); edges.Add(new[] { v2, v3, v4 }); } } else if (Zoom > right.Zoom) { // right only, spacing getting tighter if (DrawRight2) { var v2 = VertexIndex(col, row + Zoom); var other_vertices = new List <int>(Zoom / right.Zoom + 1); for (var i = row; i < row + Zoom; i += right.Zoom) { other_vertices.Add(right.VertexIndex(0, i)); } other_vertices.Add(row + Zoom == Size ? diagonal.VertexIndex(0, 0) : right.VertexIndex(0, row + Zoom)); for (var i = 0; i < other_vertices.Count - 1; i++) { edges.Add(new[] { v1, other_vertices[i + 1], other_vertices[i] }); } edges.Add(new[] { v1, v2, other_vertices[other_vertices.Count - 1] }); } } else if (Zoom < right.Zoom) { // right only, spacing getting looser if (DrawRight3) { var v2 = VertexIndex(col, row + Zoom); var other_row = right.Zoom * (row / right.Zoom); if (row == other_row) { var v3 = right.VertexIndex(0, row); var v4 = other_row + right.Zoom == Size?diagonal.VertexIndex(0, 0) : right.VertexIndex(0, other_row + right.Zoom); edges.Add(new[] { v1, v4, v3 }); edges.Add(new[] { v1, v2, v4 }); } else { var v3 = other_row + right.Zoom == Size?diagonal.VertexIndex(0, 0) : right.VertexIndex(0, other_row + right.Zoom); edges.Add(new[] { v1, v2, v3 }); } } } else { System.Diagnostics.Debug.Assert(false, $"invalid pair of zooms: {Zoom} vs {right.Zoom}"); } } } else { // Below if (row + Zoom == Size) { // below only, same zoom if (Zoom == below.Zoom) { if (DrawDown1) { var v2 = VertexIndex(col + Zoom, row); var v3 = below.VertexIndex(col, 0); var v4 = below.VertexIndex(col + Zoom, 0); edges.Add(new[] { v1, v3, v2 }); edges.Add(new[] { v2, v3, v4 }); } } else if (Zoom > below.Zoom) { // below only, spacing getting tighter if (DrawDown2) { var v2 = VertexIndex(col + Zoom, row); var other_vertices = new List <int>(Zoom / below.Zoom + 1); for (var i = col; i < col + Zoom; i += below.Zoom) { other_vertices.Add(below.VertexIndex(i, 0)); } other_vertices.Add(col + Zoom == Size ? diagonal.VertexIndex(0, 0) : below.VertexIndex(col + Zoom, 0)); for (var i = 0; i < other_vertices.Count - 1; i++) { edges.Add(new[] { v1, other_vertices[i], other_vertices[i + 1] }); } edges.Add(new[] { v1, other_vertices[other_vertices.Count - 1], v2 }); } } else if (Zoom < below.Zoom) { // below only, spacing getting looser if (DrawDown3) { var v2 = VertexIndex(col + Zoom, row); var other_col = below.Zoom * (col / below.Zoom); if (col == other_col) { var v3 = below.VertexIndex(col, 0); var v4 = other_col + below.Zoom == Size?diagonal.VertexIndex(0, 0) : below.VertexIndex(other_col + below.Zoom, 0); edges.Add(new[] { v1, v3, v4 }); edges.Add(new[] { v1, v4, v2 }); } else { var v3 = other_col + below.Zoom == Size?diagonal.VertexIndex(0, 0) : below.VertexIndex(other_col + below.Zoom, 0); edges.Add(new[] { v1, v3, v2 }); } } } else { System.Diagnostics.Debug.Assert(false, $"invalid pair of zooms: {Zoom} vs {below.Zoom}"); } } else { // inside center patch if (DrawCenter) { var v2 = VertexIndex(col + Zoom, row); var v3 = VertexIndex(col, row + Zoom); var v4 = VertexIndex(col + Zoom, row + Zoom); edges.Add(new[] { v1, v3, v2 }); edges.Add(new[] { v2, v3, v4 }); } } } } } return(edges.ToArray()); } }