public static void Render(IFace2[] faces, Color color, double lineWidth, bool isSolid) { using (ModernOpenGl.SetColor(color, ShadingModel.Smooth, solidBody:isSolid)) using (ModernOpenGl.SetLineWidth(lineWidth)) { faces .ForEach(face => { var strips = FaceTriStrips.Unpack(face.GetTessTriStrips(true).CastArray<double>()); var norms = FaceTriStrips.Unpack(face.GetTessTriStripNorms().CastArray<double>()); Debug.Assert(norms.Length == strips.Length); Debug.Assert(norms.Zip(strips, (a, b) => a.Length == b.Length).All(x => x)); norms.Zip(strips, (normStrip, pointStrip) => normStrip.Zip(pointStrip, (norm, point) => new { norm, point })) .ForEach(strip => { using (ModernOpenGl.Begin(PrimitiveType.TriangleStrip)) { foreach (var vertex in strip) { GL.Normal3(vertex.norm); GL.Vertex3(vertex.point); } } }); }); } }