public Matrix4f shadow(float lightX, float lightY, float lightZ, float lightW, Matrix4f planeTransform) {
        return shadow(lightX, lightY, lightZ, lightW, planeTransform, thisOrNew());
    }
public Matrix4f shadow ( float lightX , float lightY , float lightZ , float lightW , Matrix4f planeTransform ) { return shadow ( lightX , lightY , lightZ , lightW , planeTransform , thisOrNew ( ) ) ; }
Apply a projection transformation to this matrix that projects onto the plane with the general plane equation
<code>y = 0</code> as if casting a shadow from a given light position/direction <code>(lightX, lightY, lightZ, lightW)</code>.
<p>
Before the shadow projection is applied, the plane is transformed via the specified <code>planeTransformation</code>.
<p>
If <code>lightW</code> is <code>0.0</code> the light is being treated as a directional light; if it is <code>1.0</code> it is a point light.
<p>
If <code>M</code> is <code>this</code> matrix and <code>S</code> the shadow matrix,
then the new matrix will be <code>M * S</code>. So when transforming a
vector <code>v</code> with the new matrix by using <code>M * S * v</code>, the
reflection will be applied first!

@param lightX
the x-component of the light vector
@param lightY
the y-component of the light vector
@param lightZ
the z-component of the light vector
@param lightW
the w-component of the light vector
@param planeTransform
the transformation to transform the implied plane <code>y = 0</code> before applying the projection
@return a matrix holding the result