home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 2000 April & May / AMIGA_2000_04.iso / patches / mesa3.1 / util / projshad.c < prev    next >
Text File  |  1998-02-02  |  1KB  |  52 lines

  1. /* projshad.c */
  2.  
  3.  
  4. /*
  5.  * Generate the projection matrix for a projective shadow
  6.  * Borrowed from GLUT distribution's scube demo, written
  7.  * by David Yu.
  8.  *
  9.  * This code is freely distributable.
  10.  *
  11.  */
  12.  
  13.  
  14. /*
  15.  * ground is the equation of the plane onto which the shadow should
  16.  * be projected.
  17.  * light is the homogenious coordinate of the light position.
  18.  */
  19. static void
  20. myShadowMatrix(float ground[4], float light[4])
  21. {
  22.   float dot;
  23.   float shadowMat[4][4];
  24.  
  25.   dot = ground[0] * light[0] +
  26.     ground[1] * light[1] +
  27.     ground[2] * light[2] +
  28.     ground[3] * light[3];
  29.  
  30.   shadowMat[0][0] = dot - light[0] * ground[0];
  31.   shadowMat[1][0] = 0.0 - light[0] * ground[1];
  32.   shadowMat[2][0] = 0.0 - light[0] * ground[2];
  33.   shadowMat[3][0] = 0.0 - light[0] * ground[3];
  34.  
  35.   shadowMat[0][1] = 0.0 - light[1] * ground[0];
  36.   shadowMat[1][1] = dot - light[1] * ground[1];
  37.   shadowMat[2][1] = 0.0 - light[1] * ground[2];
  38.   shadowMat[3][1] = 0.0 - light[1] * ground[3];
  39.  
  40.   shadowMat[0][2] = 0.0 - light[2] * ground[0];
  41.   shadowMat[1][2] = 0.0 - light[2] * ground[1];
  42.   shadowMat[2][2] = dot - light[2] * ground[2];
  43.   shadowMat[3][2] = 0.0 - light[2] * ground[3];
  44.  
  45.   shadowMat[0][3] = 0.0 - light[3] * ground[0];
  46.   shadowMat[1][3] = 0.0 - light[3] * ground[1];
  47.   shadowMat[2][3] = 0.0 - light[3] * ground[2];
  48.   shadowMat[3][3] = dot - light[3] * ground[3];
  49.  
  50.   glMultMatrixf((const GLfloat *) shadowMat);
  51. }
  52.