code: public Matrix4d shadow(double lightX, double lightY, double lightZ, double lightW, Matrix4dc planeTransform) {
          return shadow(lightX, lightY, lightZ, lightW, planeTransform, this);
      }
docs: 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 this