public static void SetGeometryData(string data, GeometryBuffer buffer) { var lines = data.Split("\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); for (var i = 0; i < lines.Length; i++) { var l = lines[i].Trim(); if (l.IndexOf("#") != -1) l = l.Substring(0, l.IndexOf("#")); var p = l.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (p.Length > 1) { switch (p[0]) { case O: buffer.PushObject(p[1].Trim()); break; case G: buffer.PushGroup(p[1].Trim()); break; case V: buffer.PushVertex(new Vector3( Cf(p[1]), Cf(p[2]), Cf(p[3])) ); break; case Vt: buffer.PushUv(new Vector2(Cf(p[1]), Cf(p[2]))); break; case Vn: buffer.PushNormal(new Vector3(Cf(p[1]), Cf(p[2]), Cf(p[3]))); break; case F: for (var j = 1; j < p.Length; j++) { var c = p[j].Trim().Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); var fi = new FaceIndices(); fi.Vi = Ci(c[0]) - 1; if (c.Length > 1) { fi.Vu = Ci(c[1]) - 1; } if (c.Length > 2) { fi.Vn = Ci(c[2]) - 1; } buffer.PushFace(fi); } break; case Mtl: // mtllib = p[1].Trim(); break; case Uml: buffer.PushMaterialName(p[1].Trim()); break; } } } // buffer.Trace(); }