2 * Copyright (c) 1993-2003, Silicon Graphics, Inc.
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose and without fee is hereby granted, provided that the above
7 * copyright notice appear in all copies and that both the copyright
8 * notice and this permission notice appear in supporting documentation,
9 * and that the name of Silicon Graphics, Inc. not be used in
10 * advertising or publicity pertaining to distribution of the software
11 * without specific, written prior permission.
13 * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" AND
14 * WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
16 * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
17 * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
18 * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
19 * OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, LOSS OF
20 * PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD
21 * PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF
22 * THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF
23 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE
24 * OR PERFORMANCE OF THIS SOFTWARE.
26 * US Government Users Restricted Rights
27 * Use, duplication, or disclosure by the Government is subject to
28 * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
29 * (c)(1)(ii) of the Rights in Technical Data and Computer Software
30 * clause at DFARS 252.227-7013 and/or in similar or successor clauses
31 * in the FAR or the DOD or NASA FAR Supplement. Unpublished - rights
32 * reserved under the copyright laws of the United States.
34 * Contractor/manufacturer is:
35 * Silicon Graphics, Inc.
36 * 1500 Crittenden Lane
37 * Mountain View, CA 94043
38 * United State of America
40 * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
48 /*#include "helpers.h"*/
50 #define SHADOW_MAP_WIDTH 256
51 #define SHADOW_MAP_HEIGHT 256
53 #define PI 3.14159265359
56 GLdouble nearPlane
= 10.0;
57 GLdouble farPlane
= 100.0;
60 GLfloat torusAngle
= 0.0;
62 GLfloat lightPos
[] = { 25.0, 25.0, 25.0, 1.0 };
63 GLfloat lookat
[] = { 0.0, 0.0, 0.0 };
64 GLfloat up
[] = { 0.0, 0.0, 1.0 };
66 GLboolean showShadow
= GL_FALSE
;
71 GLfloat white
[] = { 1.0, 1.0, 1.0, 1.0 };
73 glTexImage2D( GL_TEXTURE_2D
, 0, GL_DEPTH_COMPONENT
,
74 SHADOW_MAP_WIDTH
, SHADOW_MAP_HEIGHT
, 0,
75 GL_DEPTH_COMPONENT
, GL_UNSIGNED_BYTE
, NULL
);
77 glLightfv( GL_LIGHT0
, GL_POSITION
, lightPos
);
78 glLightfv( GL_LIGHT0
, GL_SPECULAR
, white
);
79 glLightfv( GL_LIGHT0
, GL_DIFFUSE
, white
);
81 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_CLAMP_TO_EDGE
);
82 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_CLAMP_TO_EDGE
);
83 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
84 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
85 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_COMPARE_FUNC
, GL_LEQUAL
);
86 glTexParameteri( GL_TEXTURE_2D
, GL_DEPTH_TEXTURE_MODE
, GL_LUMINANCE
);
87 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_COMPARE_MODE
,
88 GL_COMPARE_R_TO_TEXTURE
);
90 glTexGeni( GL_S
, GL_TEXTURE_GEN_MODE
, GL_OBJECT_LINEAR
);
91 glTexGeni( GL_T
, GL_TEXTURE_GEN_MODE
, GL_OBJECT_LINEAR
);
92 glTexGeni( GL_R
, GL_TEXTURE_GEN_MODE
, GL_OBJECT_LINEAR
);
93 glTexGeni( GL_Q
, GL_TEXTURE_GEN_MODE
, GL_OBJECT_LINEAR
);
95 glColorMaterial( GL_FRONT_AND_BACK
, GL_AMBIENT_AND_DIFFUSE
);
97 glCullFace( GL_BACK
);
99 glEnable( GL_DEPTH_TEST
);
100 glEnable( GL_LIGHT0
);
101 glEnable( GL_LIGHTING
);
102 glEnable( GL_TEXTURE_2D
);
103 glEnable( GL_TEXTURE_GEN_S
);
104 glEnable( GL_TEXTURE_GEN_T
);
105 glEnable( GL_TEXTURE_GEN_R
);
106 glEnable( GL_TEXTURE_GEN_Q
);
107 glEnable( GL_COLOR_MATERIAL
);
108 glEnable( GL_CULL_FACE
);
112 reshape( int width
, int height
)
114 glViewport( 0, 0, width
, height
);
116 glMatrixMode( GL_PROJECTION
);
118 gluPerspective( fovy
, (GLdouble
) width
/height
, nearPlane
, farPlane
);
119 glMatrixMode( GL_MODELVIEW
);
131 keyboard( unsigned char key
, int x
, int y
)
134 case 27: /* Escape */
139 static GLboolean textureOn
= GL_TRUE
;
140 textureOn
= !textureOn
;
142 glEnable( GL_TEXTURE_2D
);
144 glDisable( GL_TEXTURE_2D
);
149 static GLboolean compareMode
= GL_TRUE
;
150 compareMode
= !compareMode
;
151 printf( "Compare mode %s\n", compareMode
? "On" : "Off" );
152 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_COMPARE_MODE
,
153 compareMode
? GL_COMPARE_R_TO_TEXTURE
: GL_NONE
);
158 static GLboolean funcMode
= GL_TRUE
;
159 funcMode
= !funcMode
;
160 printf( "Operator %s\n", funcMode
? "GL_LEQUAL" : "GL_GEQUAL" );
161 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_COMPARE_FUNC
,
162 funcMode
? GL_LEQUAL
: GL_GEQUAL
);
167 showShadow
= !showShadow
;
171 static GLboolean animate
= GL_TRUE
;
173 glutIdleFunc( animate
? idle
: NULL
);
182 transposeMatrix( GLfloat m
[16] )
185 #define Swap( a, b ) tmp = a; a = b; b = tmp
191 Swap( m
[11], m
[14] );
196 drawObjects( GLboolean shadowRender
)
198 GLboolean textureOn
= glIsEnabled( GL_TEXTURE_2D
);
201 glDisable( GL_TEXTURE_2D
);
203 if ( !shadowRender
) {
204 glNormal3f( 0, 0, 1 );
205 glColor3f( 1, 1, 1 );
206 glRectf( -20.0, -20.0, 20.0, 20.0 );
210 glTranslatef( 11, 11, 11 );
211 glRotatef( 54.73, -5, 5, 0 );
212 glRotatef( torusAngle
, 1, 0, 0 );
213 glColor3f( 1, 0, 0 );
214 glutSolidTorus( 1, 4, 8, 36 );
218 glTranslatef( 2, 2, 2 );
219 glColor3f( 0, 0, 1 );
224 glTranslatef( lightPos
[0], lightPos
[1], lightPos
[2] );
225 glColor3f( 1, 1, 1 );
226 glutWireSphere( 0.5, 6, 6 );
229 if ( shadowRender
&& textureOn
)
230 glEnable( GL_TEXTURE_2D
);
234 generateShadowMap( void )
239 glGetLightfv( GL_LIGHT0
, GL_POSITION
, lightPos
);
240 glGetIntegerv( GL_VIEWPORT
, viewport
);
242 glViewport( 0, 0, SHADOW_MAP_WIDTH
, SHADOW_MAP_HEIGHT
);
244 glClear( GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
246 glMatrixMode( GL_PROJECTION
);
249 gluPerspective( 80.0, 1.0, 10.0, 1000.0 );
250 glMatrixMode( GL_MODELVIEW
);
254 gluLookAt( lightPos
[0], lightPos
[1], lightPos
[2],
255 lookat
[0], lookat
[1], lookat
[2],
256 up
[0], up
[1], up
[2] );
258 drawObjects( GL_TRUE
);
261 glMatrixMode( GL_PROJECTION
);
263 glMatrixMode( GL_MODELVIEW
);
265 glCopyTexImage2D( GL_TEXTURE_2D
, 0, GL_DEPTH_COMPONENT
, 0, 0,
266 SHADOW_MAP_WIDTH
, SHADOW_MAP_HEIGHT
, 0 );
268 glViewport( viewport
[0], viewport
[1], viewport
[2], viewport
[3] );
271 GLfloat depthImage
[SHADOW_MAP_WIDTH
][SHADOW_MAP_HEIGHT
];
272 glReadPixels( 0, 0, SHADOW_MAP_WIDTH
, SHADOW_MAP_HEIGHT
,
273 GL_DEPTH_COMPONENT
, GL_FLOAT
, depthImage
);
274 glWindowPos2f( viewport
[2]/2, 0 );
275 glDrawPixels( SHADOW_MAP_WIDTH
, SHADOW_MAP_HEIGHT
, GL_LUMINANCE
,
276 GL_FLOAT
, depthImage
);
282 generateTextureMatrix( void )
284 GLfloat tmpMatrix
[16];
287 * Set up projective texture matrix. We use the GL_MODELVIEW matrix
288 * stack and OpenGL matrix commands to make the matrix.
292 glTranslatef( 0.5, 0.5, 0.0 );
293 glScalef( 0.5, 0.5, 1.0 );
294 gluPerspective( 60.0, 1.0, 1.0, 1000.0 );
295 gluLookAt( lightPos
[0], lightPos
[1], lightPos
[2],
296 lookat
[0], lookat
[1], lookat
[2],
297 up
[0], up
[1], up
[2] );
298 glGetFloatv( GL_MODELVIEW_MATRIX
, tmpMatrix
);
301 transposeMatrix( tmpMatrix
);
303 glTexGenfv( GL_S
, GL_OBJECT_PLANE
, &tmpMatrix
[0] );
304 glTexGenfv( GL_T
, GL_OBJECT_PLANE
, &tmpMatrix
[4] );
305 glTexGenfv( GL_R
, GL_OBJECT_PLANE
, &tmpMatrix
[8] );
306 glTexGenfv( GL_Q
, GL_OBJECT_PLANE
, &tmpMatrix
[12] );
315 generateTextureMatrix();
320 glClear( GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
323 gluLookAt( radius
*cos(angle
), radius
*sin(angle
), 30,
324 lookat
[0], lookat
[1], lookat
[2],
325 up
[0], up
[1], up
[2] );
326 drawObjects( GL_FALSE
);
333 main( int argc
, char** argv
)
335 glutInit( &argc
, argv
);
336 glutInitDisplayMode( GLUT_RGBA
| GLUT_DEPTH
| GLUT_DOUBLE
);
337 glutInitWindowSize( 512, 512 );
338 glutInitWindowPosition( 100, 100 );
339 glutCreateWindow( argv
[0] );
344 glutDisplayFunc( display
);
345 glutReshapeFunc( reshape
);
346 glutKeyboardFunc( keyboard
);
347 glutIdleFunc( idle
);