diff options
Diffstat (limited to 'progs/redbook/dof.c')
-rw-r--r-- | progs/redbook/dof.c | 91 |
1 files changed, 52 insertions, 39 deletions
diff --git a/progs/redbook/dof.c b/progs/redbook/dof.c index 166ca9e62f..6673dc2d54 100644 --- a/progs/redbook/dof.c +++ b/progs/redbook/dof.c @@ -3,14 +3,14 @@ /* * (c) Copyright 1993, Silicon Graphics, Inc. - * ALL RIGHTS RESERVED - * Permission to use, copy, modify, and distribute this software for + * 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 + * 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. + * 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, @@ -24,8 +24,8 @@ * 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 + * + * 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 @@ -55,35 +55,35 @@ /* accFrustum() * The first 6 arguments are identical to the glFrustum() call. - * - * pixdx and pixdy are anti-alias jitter in pixels. + * + * pixdx and pixdy are anti-alias jitter in pixels. * Set both equal to 0.0 for no anti-alias jitter. - * eyedx and eyedy are depth-of field jitter in pixels. + * eyedx and eyedy are depth-of field jitter in pixels. * Set both equal to 0.0 for no depth of field effects. * - * focus is distance from eye to plane in focus. + * focus is distance from eye to plane in focus. * focus must be greater than, but not equal to 0.0. * - * Note that accFrustum() calls glTranslatef(). You will - * probably want to insure that your ModelView matrix has been + * Note that accFrustum() calls glTranslatef(). You will + * probably want to insure that your ModelView matrix has been * initialized to identity before calling accFrustum(). */ -void accFrustum(GLdouble left, GLdouble right, GLdouble bottom, - GLdouble top, GLdouble nnear, GLdouble ffar, GLdouble pixdx, +void accFrustum(GLdouble left, GLdouble right, GLdouble bottom, + GLdouble top, GLdouble nnear, GLdouble ffar, GLdouble pixdx, GLdouble pixdy, GLdouble eyedx, GLdouble eyedy, GLdouble focus) { - GLdouble xwsize, ywsize; + GLdouble xwsize, ywsize; GLdouble dx, dy; GLint viewport[4]; glGetIntegerv (GL_VIEWPORT, viewport); - + xwsize = right - left; ywsize = top - bottom; - + dx = -(pixdx*xwsize/(GLdouble) viewport[2] + eyedx*nnear/focus); dy = -(pixdy*ywsize/(GLdouble) viewport[3] + eyedy*nnear/focus); - + glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum (left + dx, right + dx, bottom + dy, top + dy, nnear, ffar); @@ -93,20 +93,20 @@ void accFrustum(GLdouble left, GLdouble right, GLdouble bottom, } /* accPerspective() - * + * * The first 4 arguments are identical to the gluPerspective() call. - * pixdx and pixdy are anti-alias jitter in pixels. + * pixdx and pixdy are anti-alias jitter in pixels. * Set both equal to 0.0 for no anti-alias jitter. - * eyedx and eyedy are depth-of field jitter in pixels. + * eyedx and eyedy are depth-of field jitter in pixels. * Set both equal to 0.0 for no depth of field effects. * - * focus is distance from eye to plane in focus. + * focus is distance from eye to plane in focus. * focus must be greater than, but not equal to 0.0. * * Note that accPerspective() calls accFrustum(). */ -void accPerspective(GLdouble fovy, GLdouble aspect, - GLdouble nnear, GLdouble ffar, GLdouble pixdx, GLdouble pixdy, +void accPerspective(GLdouble fovy, GLdouble aspect, + GLdouble nnear, GLdouble ffar, GLdouble pixdx, GLdouble pixdy, GLdouble eyedx, GLdouble eyedy, GLdouble focus) { GLdouble fov2,left,right,bottom,top; @@ -128,7 +128,7 @@ void myinit(void) GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 }; GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat position[] = { 0.0, 3.0, 3.0, 0.0 }; - + GLfloat lmodel_ambient[] = { 0.2, 0.2, 0.2, 1.0 }; GLfloat local_view[] = { 0.0 }; @@ -138,7 +138,7 @@ void myinit(void) glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); glLightfv(GL_LIGHT0, GL_POSITION, position); - + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view); @@ -155,18 +155,18 @@ void myinit(void) glClearAccum(0.0, 0.0, 0.0, 0.0); } -void renderTeapot (GLfloat x, GLfloat y, GLfloat z, - GLfloat ambr, GLfloat ambg, GLfloat ambb, - GLfloat difr, GLfloat difg, GLfloat difb, +void renderTeapot (GLfloat x, GLfloat y, GLfloat z, + GLfloat ambr, GLfloat ambg, GLfloat ambb, + GLfloat difr, GLfloat difg, GLfloat difb, GLfloat specr, GLfloat specg, GLfloat specb, GLfloat shine) { float mat[4]; glPushMatrix(); glTranslatef (x, y, z); - mat[0] = ambr; mat[1] = ambg; mat[2] = ambb; mat[3] = 1.0; + mat[0] = ambr; mat[1] = ambg; mat[2] = ambb; mat[3] = 1.0; glMaterialfv (GL_FRONT, GL_AMBIENT, mat); - mat[0] = difr; mat[1] = difg; mat[2] = difb; + mat[0] = difr; mat[1] = difg; mat[2] = difb; glMaterialfv (GL_FRONT, GL_DIFFUSE, mat); mat[0] = specr; mat[1] = specg; mat[2] = specb; glMaterialfv (GL_FRONT, GL_SPECULAR, mat); @@ -175,9 +175,9 @@ void renderTeapot (GLfloat x, GLfloat y, GLfloat z, glPopMatrix(); } -/* display() draws 5 teapots into the accumulation buffer +/* display() draws 5 teapots into the accumulation buffer * several times; each time with a jittered perspective. - * The focal point is at z = 5.0, so the gold teapot will + * The focal point is at z = 5.0, so the gold teapot will * stay in focus. The amount of jitter is adjusted by the * magnitude of the accPerspective() jitter; in this example, 0.33. * In this example, the teapots are drawn 8 times. See jitter.h @@ -192,8 +192,8 @@ void display(void) for (jitter = 0; jitter < 8; jitter++) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - accPerspective (45.0, - (GLdouble) viewport[2]/(GLdouble) viewport[3], + accPerspective (45.0, + (GLdouble) viewport[2]/(GLdouble) viewport[3], 1.0, 15.0, 0.0, 0.0, 0.33*j8[jitter].x, 0.33*j8[jitter].y, 5.0); /* ruby, gold, silver, emerald, and cyan teapots */ @@ -203,9 +203,9 @@ void display(void) 0.75164, 0.60648, 0.22648, 0.628281, 0.555802, 0.366065, 0.4); renderTeapot (0.2, -0.5, -5.5, 0.19225, 0.19225, 0.19225, 0.50754, 0.50754, 0.50754, 0.508273, 0.508273, 0.508273, 0.4); - renderTeapot (1.0, -0.5, -6.0, 0.0215, 0.1745, 0.0215, + renderTeapot (1.0, -0.5, -6.0, 0.0215, 0.1745, 0.0215, 0.07568, 0.61424, 0.07568, 0.633, 0.727811, 0.633, 0.6); - renderTeapot (1.8, -0.5, -6.5, 0.0, 0.1, 0.06, 0.0, 0.50980392, + renderTeapot (1.8, -0.5, -6.5, 0.0, 0.1, 0.06, 0.0, 0.50980392, 0.50980392, 0.50196078, 0.50196078, 0.50196078, .25); glAccum (GL_ACCUM, 0.125); } @@ -219,8 +219,21 @@ void myReshape(int w, int h) glViewport(0, 0, w, h); } +static void +key(unsigned char k, int x, int y) +{ + switch (k) { + case 27: /* Escape */ + exit(0); + break; + default: + return; + } + glutPostRedisplay(); +} + /* Main Loop - * Open window with initial window size, title bar, + * Open window with initial window size, title bar, * RGBA display mode, depth buffer, and handle input events. */ int main(int argc, char** argv) @@ -232,7 +245,7 @@ int main(int argc, char** argv) myinit(); glutReshapeFunc(myReshape); glutDisplayFunc(display); + glutKeyboardFunc(key); glutMainLoop(); return 0; /* ANSI C requires main to return int. */ } - |