// Static API

        // Rewrites data in mesh to ensure that it only contains valid particle quads.
        internal static void FilterMesh(Mesh mesh, WarningCallback callback)
        {
            ParticleMesh src = ParticleMesh.FromMesh(mesh);
            ParticleMesh dst = new ParticleMesh();

            // ClassifyQuad wants at least 6 indices (2 triangles) to examine
            int limit  = src.TriangleCount - 6;
            int iiVert = 0;

            while (iiVert < limit)
            {
                switch (src.ClassifyQuad(iiVert, callback))
                {
                case ParticleMesh.QuadType.FullParticle:
                    dst.AppendQuad(src, iiVert);
                    iiVert += 6;
                    break;

                case ParticleMesh.QuadType.Degenerate:
                    iiVert += 6;
                    break;

                case ParticleMesh.QuadType.LatterHalfParticle:
                    iiVert += 3;
                    break;

                case ParticleMesh.QuadType.Unknown:
                default:
                    iiVert += 1;
                    break;
                }
            }
            dst.CopyToMesh(mesh);
        }