void Poly::SortVerticesCW ( ) { // // Calculate center of polygon // Vector3 center; for ( int i = 0; i < GetNumberOfVertices ( ); i++ ) { center = center + verts[ i ].p; } center = center / GetNumberOfVertices ( ); // // Sort vertices // for ( i = 0; i < GetNumberOfVertices ( ) - 2; i++ ) { Vector3 a; Plane p; double SmallestAngle = -1; int Smallest = -1; a = verts[ i ].p - center; a.Normalize ( ); p.PointsToPlane ( verts[ i ].p, center, center + plane.n ); for ( int j = i + 1; j < GetNumberOfVertices ( ); j++ ) { if ( p.ClassifyPoint ( verts[ j ].p ) != Plane::eCP::BACK ) { Vector3 b; double Angle; b = verts[ j ].p - center; b.Normalize ( ); Angle = a.Dot ( b ); if ( Angle > SmallestAngle ) { SmallestAngle = Angle; Smallest = j; } } } if ( Smallest == -1 ) { cout << "Error: Degenerate polygon!" << endl; abort ( ); } 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 = plane; CalculatePlane ( ); if ( plane.n.Dot ( oldPlane.n ) < 0 ) { int j = GetNumberOfVertices ( ); for ( int i = 0; i < j / 2; i++ ) { Vertex v = verts[ i ]; verts[ i ] = verts[ j - i - 1 ]; verts[ j - i - 1 ] = v; } } }