public void SortVerticesCW() { // calculate center of polygon Vec3 center = Vec3.zero; for (int i = 0; i < NumberOfVertices; i++) { center += Verts[i].P; } center /= NumberOfVertices; // sort vertices for (int i = 0; i < NumberOfVertices - 2; i++) { Vec3 a = Vec3.zero; Plane p; float smallestAngle = -1; int smallest = -1; a = Verts[i].P - center; a.Normalize(); p = new Plane(Verts[i].P, center, center + P.Normal); for (int j = i + 1; j < NumberOfVertices; j++) { if (p.ClassifyPoint(Verts[j].P) != PointClassification.BACK) { Vec3 b = Vec3.zero; float angle; b = Verts[j].P - center; b.Normalize(); angle = Vec3.Dot(a, b); if (angle > smallestAngle) { smallestAngle = angle; smallest = j; } } } if (smallest == -1) { //throw new MalformedPolyException("Polygon has less than 3 vertices!"); return; } Vertex t = Verts[smallest]; Verts[smallest] = Verts[i + 1]; Verts[i + 1] = t; } // check if vertex order needs to be reversed for back-facing polygon Plane oldPlane = P; CalculatePlane(); if (Vec3.Dot(P.Normal, oldPlane.Normal) < 0) { int j = NumberOfVertices; for (int i = 0; i < j / 2; i++) { Vertex v = Verts[i]; Verts[i] = Verts[j - i]; Verts[j - i] = v; } } }