/* * Copyright (c) 1993-1997, 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(R) is a registered trademark of Silicon Graphics, Inc. */ /* * ProfondeurDeChamp.cpp * This program demonstrates use of the accumulation buffer to * create an out-of-focus depth-of-field effect. The teapots * are drawn several times into the accumulation buffer. The * viewing volume is jittered,except at the focal point,where * the viewing volume is at the same position,each time. In * this case,the gold teapot remains in focus. */ #include #include #include #include "Jitter.h" #include "ModuleCouleurs.h" #include "ModuleManipulateur.h" #include "ModuleMenus.h" #ifdef WIN32 #define distNear 1 #define distFar 20 #endif #define PI_ 3.14159265358979323846 GLuint teapotList; /* accFrustum() * The first 6 arguments are identical to the glFrustum() call. * * 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. * Set both equal to 0.0 for no depth of field effects. * * 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 * initialized to identity before calling accFrustum(). */ void accFrustum(GLdouble left,GLdouble right,GLdouble bottom, GLdouble top,GLdouble near,GLdouble far,GLdouble pixdx, GLdouble pixdy,GLdouble eyedx,GLdouble eyedy,GLdouble focus) { 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*distNear/focus); dy = -(pixdy*ywsize/(GLdouble) viewport[3] + eyedy*distNear/focus); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(left + dx,right + dx,bottom + dy,top + dy,distNear,distFar); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(-eyedx,-eyedy,0.0); } /* accPerspective() * * The first 4 arguments are identical to the gluPerspective() call. * 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. * Set both equal to 0.0 for no depth of field effects. * * 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 dNear,GLdouble dFar,GLdouble pixdx,GLdouble pixdy, GLdouble eyedx,GLdouble eyedy,GLdouble focus) { GLdouble fov2,left,right,bottom,top; fov2 =((fovy*PI_) / 180.0) / 2.0; top = dNear /(cos(fov2) / sin(fov2)); bottom = -top; right = top * aspect; left = -right; accFrustum(left,right,bottom,top,dNear,dFar, pixdx,pixdy,eyedx,eyedy,focus); } void myinit(void) { 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 }; glLightfv(GL_LIGHT0,GL_AMBIENT,couleurNoir()); glLightfv(GL_LIGHT0,GL_DIFFUSE,couleurBlanc()); glLightfv(GL_LIGHT0,GL_POSITION,position); glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient); glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER,local_view); glFrontFace(GL_CW); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_AUTO_NORMAL); glEnable(GL_NORMALIZE); glEnable(GL_DEPTH_TEST); glClearColor(0.0,0.0,0.0,0.0); glClearAccum(0.0,0.0,0.0,0.0); /* make teapot display list */ teapotList = glGenLists(1); glNewList(teapotList,GL_COMPILE); glutSolidTeapot(0.5); glEndList(); } 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) { GLfloat mat[4]; glPushMatrix(); glTranslatef(0.0,0.5,-5.5); glScalef(1.6F,1.6F,1.F); manipulateurSouris(); manipulateurClavier(); glTranslatef(x,y,z); 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; glMaterialfv(GL_FRONT,GL_DIFFUSE,mat); mat[0] = specr; mat[1] = specg; mat[2] = specb; glMaterialfv(GL_FRONT,GL_SPECULAR,mat); glMaterialf(GL_FRONT,GL_SHININESS,shine*128.0); glCallList(teapotList); glPopMatrix(); } /* 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 * 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 */ void display(void) { int jitter; GLint viewport[4]; glGetIntegerv(GL_VIEWPORT,viewport); glClear(GL_ACCUM_BUFFER_BIT); for(jitter = 0; jitter < 8; jitter++) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 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 */ renderTeapot(-1.1,-0.5,1.0,0.1745,0.01175, 0.01175,0.61424,0.04136,0.04136, 0.727811,0.626959,0.626959,0.6); renderTeapot(-0.5,-0.5,0.5,0.24725,0.1995, 0.0745,0.75164,0.60648,0.22648, 0.628281,0.555802,0.366065,0.4); renderTeapot(0.2,-0.5,0.0,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,-0.5,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,-1.0,0.0,0.1,0.06,0.0, 0.50980392,0.50980392,0.50196078, 0.50196078,0.50196078,.25); glAccum(GL_ACCUM,0.125); } glAccum(GL_RETURN,1.0); glutSwapBuffers(); glFlush(); } void reshape(int w,int h) { glViewport(0,0,(GLsizei) w,(GLsizei) h); } /* Main Loop * Be certain you request an accumulation buffer. */ int main(int argc,char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_ACCUM|GLUT_DOUBLE); glutInitWindowSize(450,250); glutInitWindowPosition(50,50); glutCreateWindow("Profondeur de champ"); myinit(); creationMenuBasique(); glutReshapeFunc(reshape); glutKeyboardFunc(keyBasique); glutSpecialFunc(specialBasique); glutMotionFunc(motionBasique); glutMouseFunc(sourisBasique); glutDisplayFunc(display); glutMainLoop(); return(0); }