code: public Matrix4f shadow(Vector4f light, float a, float b, float c, float d) {
          return shadow(light.x, light.y, light.z, light.w, a, b, c, d, thisOrNew());
      }
docs: Apply a projection transformation to this matrix that projects onto the plane specified via the general plane equation
  <code>x*a + y*b + z*c + d = 0</code> as if casting a shadow from a given light position/direction <code>light</code>.
  <p>
  If <code>light.w</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!
  <p>
  Reference: <a href="ftp://ftp.sgi.com/opengl/contrib/blythe/advanced99/notes/node192.html">ftp.sgi.com</a>
  
  @param light
  the light's vector
  @param a
  the x factor in the plane equation
  @param b
  the y factor in the plane equation
  @param c
  the z factor in the plane equation
  @param d
  the constant in the plane equation
  @return a matrix holding the result