private static List<VertexData> processTriangles(Mesh mesh,
            int[] index, Vector3f[] v, Vector2f[] t, boolean splitMirrored) {
        IndexBuffer indexBuffer = mesh.getIndexBuffer();
        FloatBuffer vertexBuffer = (FloatBuffer) mesh.getBuffer(Type.Position).getData();
        if (mesh.getBuffer(Type.TexCoord) == null) {
            throw new IllegalArgumentException("Can only generate tangents for "
                    + "meshes with texture coordinates");
        }

        FloatBuffer textureBuffer = (FloatBuffer) mesh.getBuffer(Type.TexCoord).getData();

        List<VertexData> vertices = initVertexData(vertexBuffer.limit() / 3);

        for (int i = 0; i < indexBuffer.size() / 3; i++) {
            for (int j = 0; j < 3; j++) {
                index[j] = indexBuffer.get(i * 3 + j);
                populateFromBuffer(v[j], vertexBuffer, index[j]);
                populateFromBuffer(t[j], textureBuffer, index[j]);
            }

            TriangleData triData = processTriangle(index, v, t);
            if (splitMirrored) {
                triData.setIndex(index);
                triData.triangleOffset = i * 3;
            }
            vertices.get(index[0]).triangles.add(triData);
            vertices.get(index[1]).triangles.add(triData);
            vertices.get(index[2]).triangles.add(triData);
        }

        return vertices;
    }
A private constructor to inhibit instantiation of this class.
jme3-core/src/main/java/com/jme3/util/TangentBinormalGenerator.java