public static void generate(Mesh mesh, boolean approxTangents, boolean splitMirrored) {
        int[] index = new int[3];
        Vector3f[] v = new Vector3f[3];
        Vector2f[] t = new Vector2f[3];
        for (int i = 0; i < 3; i++) {
            v[i] = new Vector3f();
            t[i] = new Vector2f();
        }

        if (mesh.getBuffer(Type.Normal) == null) {
            throw new IllegalArgumentException("The given mesh has no normal data!");
        }

        List<VertexData> vertices;
        switch (mesh.getMode()) {
            case Triangles:
                vertices = processTriangles(mesh, index, v, t, splitMirrored);
                if (splitMirrored) {
                    splitVertices(mesh, vertices, splitMirrored);
                }
                break;
            case TriangleStrip:
                vertices = processTriangleStrip(mesh, index, v, t);
                break;
            case TriangleFan:
                vertices = processTriangleFan(mesh, index, v, t);
                break;
            default:
                throw new UnsupportedOperationException(mesh.getMode() + " is not supported.");
        }

        processTriangleData(mesh, vertices, approxTangents, splitMirrored);

        //if the mesh has a bind pose, we need to generate the bind pose for the tangent buffer
        TangentUtils.generateBindPoseTangentsIfNecessary(mesh);
    }
A private constructor to inhibit instantiation of this class.
jme3-core/src/main/java/com/jme3/util/TangentBinormalGenerator.java