120 lines
4.0 KiB
C
120 lines
4.0 KiB
C
/**
|
|
(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]);
|
|
}
|