public Vector3f importanceSampleGGX(Vector4f xi, float a2, Vector3f store) {
        if (store == null) {
            store = new Vector3f();
        }

        float cosTheta = sqrt((1f - xi.x) / (1f + (a2 - 1f) * xi.x));
        float sinTheta = sqrt(1f - cosTheta * cosTheta);

        float sinThetaCosPhi = sinTheta * xi.z;//xi.z is cos(phi)
        float sinThetaSinPhi = sinTheta * xi.w;//xi.w is sin(phi)

        store.x = sinThetaCosPhi;
        store.y = sinThetaSinPhi;
        store.z = cosTheta;

        return store;
    }
Computes GGX half vector in local space

@param xi (not null)
@param a2 fourth power of roughness
@param store caller-provided storage
@return either store or a new vector (not null)
jme3-core/src/main/java/com/jme3/environment/generation/PrefilteredEnvMapFaceGenerator.java