private void DrawOn2DControlTopDownViewWithUnits(float?minHeight, float?maxHeight, Color color) { List <TriangleDataModel> triangles = GetFilteredTriangles(); List <(int x, int z)> unitPoints = triangles.ConvertAll(triangle => { int xMin = (int)Math.Max(triangle.GetMinX(), Config.MapGraphics.MapViewXMin - 1); int xMax = (int)Math.Min(triangle.GetMaxX(), Config.MapGraphics.MapViewXMax + 1); int zMin = (int)Math.Max(triangle.GetMinZ(), Config.MapGraphics.MapViewZMin - 1); int zMax = (int)Math.Min(triangle.GetMaxZ(), Config.MapGraphics.MapViewZMax + 1); List <(int x, int z)> points = new List <(int x, int z)>(); for (int x = xMin; x <= xMax; x++) { for (int z = zMin; z <= zMax; z++) { float?y = triangle.GetTruncatedHeightOnTriangleIfInsideTriangle(x, z); if (y.HasValue && (!minHeight.HasValue || y.Value >= minHeight.Value) && (!maxHeight.HasValue || y.Value <= maxHeight.Value)) { points.Add((x, z)); } } } return(points); }).SelectMany(points => points).Distinct().ToList(); List <List <(float x, float y, float z)> > quadList = MapUtilities.ConvertUnitPointsToQuads(unitPoints); List <List <(float x, float z)> > quadListForControl = quadList.ConvertAll(quad => quad.ConvertAll( vertex => MapUtilities.ConvertCoordsForControlTopDownView(vertex.x, vertex.z))); GL.BindTexture(TextureTarget.Texture2D, -1); GL.MatrixMode(MatrixMode.Modelview); GL.LoadIdentity(); // Draw quad GL.Color4(color.R, color.G, color.B, OpacityByte); GL.Begin(PrimitiveType.Quads); foreach (List <(float x, float z)> quad in quadListForControl) { foreach ((float x, float z) in quad) { GL.Vertex2(x, z); } } GL.End(); // Draw outline if (OutlineWidth != 0) { GL.Color4(OutlineColor.R, OutlineColor.G, OutlineColor.B, (byte)255); GL.LineWidth(OutlineWidth); foreach (List <(float x, float z)> quad in quadListForControl) { GL.Begin(PrimitiveType.LineLoop); foreach ((float x, float z) in quad) { GL.Vertex2(x, z); } GL.End(); } } GL.Color4(1, 1, 1, 1.0f); }