| /** |
| (c) Copyright 1993, Silicon Graphics, Inc. |
| |
| ALL RIGHTS RESERVED |
| |
| Permission to use, copy, modify, and distribute this software |
| for any purpose and without fee is hereby granted, provided |
| that the above copyright notice appear in all copies and that |
| both the copyright notice and this permission notice appear in |
| supporting documentation, and that the name of Silicon |
| Graphics, Inc. not be used in advertising or publicity |
| pertaining to distribution of the software without specific, |
| written prior permission. |
| |
| THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU |
| "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR |
| OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF |
| MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO |
| EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE |
| ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR |
| CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER, |
| INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE, |
| SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR |
| NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY |
| OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR |
| PERFORMANCE OF THIS SOFTWARE. |
| |
| US Government Users Restricted Rights |
| |
| Use, duplication, or disclosure by the Government is subject to |
| restrictions set forth in FAR 52.227.19(c)(2) or subparagraph |
| (c)(1)(ii) of the Rights in Technical Data and Computer |
| Software clause at DFARS 252.227-7013 and/or in similar or |
| successor clauses in the FAR or the DOD or NASA FAR |
| Supplement. Unpublished-- rights reserved under the copyright |
| laws of the United States. Contractor/manufacturer is Silicon |
| Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA |
| 94039-7311. |
| |
| OpenGL(TM) is a trademark of Silicon Graphics, Inc. |
| */ |
| |
| /* Taken from the projshadow.c - by Tom McReynolds, SGI */ |
| |
| /* Modified by David Bucciarelli */ |
| |
| /* Rendering shadows using projective shadows. */ |
| |
| #include <GL/glut.h> |
| #include "shadow.h" |
| |
| |
| enum { |
| X, Y, Z, W |
| }; |
| enum { |
| A, B, C, D |
| }; |
| |
| /* create a matrix that will project the desired shadow */ |
| void |
| shadowmatrix(GLfloat shadowMat[4][4], |
| GLfloat groundplane[4], |
| GLfloat lightpos[4]) |
| { |
| GLfloat dot; |
| |
| /* find dot product between light position vector and ground plane normal */ |
| dot = groundplane[X] * lightpos[X] + |
| groundplane[Y] * lightpos[Y] + |
| groundplane[Z] * lightpos[Z] + |
| groundplane[W] * lightpos[W]; |
| |
| shadowMat[0][0] = dot - lightpos[X] * groundplane[X]; |
| shadowMat[1][0] = 0.f - lightpos[X] * groundplane[Y]; |
| shadowMat[2][0] = 0.f - lightpos[X] * groundplane[Z]; |
| shadowMat[3][0] = 0.f - lightpos[X] * groundplane[W]; |
| |
| shadowMat[X][1] = 0.f - lightpos[Y] * groundplane[X]; |
| shadowMat[1][1] = dot - lightpos[Y] * groundplane[Y]; |
| shadowMat[2][1] = 0.f - lightpos[Y] * groundplane[Z]; |
| shadowMat[3][1] = 0.f - lightpos[Y] * groundplane[W]; |
| |
| shadowMat[X][2] = 0.f - lightpos[Z] * groundplane[X]; |
| shadowMat[1][2] = 0.f - lightpos[Z] * groundplane[Y]; |
| shadowMat[2][2] = dot - lightpos[Z] * groundplane[Z]; |
| shadowMat[3][2] = 0.f - lightpos[Z] * groundplane[W]; |
| |
| shadowMat[X][3] = 0.f - lightpos[W] * groundplane[X]; |
| shadowMat[1][3] = 0.f - lightpos[W] * groundplane[Y]; |
| shadowMat[2][3] = 0.f - lightpos[W] * groundplane[Z]; |
| shadowMat[3][3] = dot - lightpos[W] * groundplane[W]; |
| |
| } |
| |
| /* find the plane equation given 3 points */ |
| void |
| findplane(GLfloat plane[4], |
| GLfloat v0[3], GLfloat v1[3], GLfloat v2[3]) |
| { |
| GLfloat vec0[3], vec1[3]; |
| |
| /* need 2 vectors to find cross product */ |
| vec0[X] = v1[X] - v0[X]; |
| vec0[Y] = v1[Y] - v0[Y]; |
| vec0[Z] = v1[Z] - v0[Z]; |
| |
| vec1[X] = v2[X] - v0[X]; |
| vec1[Y] = v2[Y] - v0[Y]; |
| vec1[Z] = v2[Z] - v0[Z]; |
| |
| /* find cross product to get A, B, and C of plane equation */ |
| plane[A] = vec0[Y] * vec1[Z] - vec0[Z] * vec1[Y]; |
| plane[B] = -(vec0[X] * vec1[Z] - vec0[Z] * vec1[X]); |
| plane[C] = vec0[X] * vec1[Y] - vec0[Y] * vec1[X]; |
| |
| plane[D] = -(plane[A] * v0[X] + plane[B] * v0[Y] + plane[C] * v0[Z]); |
| } |