ref: 3d94702bea267035144836a5929129fd848b4d79
dir: /DoConfig/fltk/src/freeglut_teapot.cxx/
/* * freeglut_teapot.c * * Teapot(tm) rendering code. * * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. * Written by Pawel W. Olszta, <olszta@sourceforge.net> * Creation date: Fri Dec 24 1999 * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* * Original teapot code copyright follows: */ /* * (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. */ #include <FL/glut.H> #include "freeglut_teapot_data.h" /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ static void fghTeapot( GLint grid, GLdouble scale, GLenum type ) { double p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3]; long i, j, k, l; glPushAttrib( GL_ENABLE_BIT | GL_EVAL_BIT ); glEnable( GL_AUTO_NORMAL ); glEnable( GL_NORMALIZE ); glEnable( GL_MAP2_VERTEX_3 ); glEnable( GL_MAP2_TEXTURE_COORD_2 ); glPushMatrix(); glRotated( 270.0, 1.0, 0.0, 0.0 ); glScaled( 0.5 * scale, 0.5 * scale, 0.5 * scale ); glTranslated( 0.0, 0.0, -1.5 ); for (i = 0; i < 10; i++) { for (j = 0; j < 4; j++) { for (k = 0; k < 4; k++) { for (l = 0; l < 3; l++) { p[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l]; q[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l]; if (l == 1) q[j][k][l] *= -1.0; if (i < 6) { r[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l]; if (l == 0) r[j][k][l] *= -1.0; s[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l]; if (l == 0) s[j][k][l] *= -1.0; if (l == 1) s[j][k][l] *= -1.0; } } } } glMap2d(GL_MAP2_TEXTURE_COORD_2, 0.0, 1.0, 2, 2, 0.0, 1.0, 4, 2, &tex[0][0][0]); glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4, &p[0][0][0]); glMapGrid2d(grid, 0.0, 1.0, grid, 0.0, 1.0); glEvalMesh2(type, 0, grid, 0, grid); glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4, &q[0][0][0]); glEvalMesh2(type, 0, grid, 0, grid); if (i < 6) { glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4, &r[0][0][0]); glEvalMesh2(type, 0, grid, 0, grid); glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4, &s[0][0][0]); glEvalMesh2(type, 0, grid, 0, grid); } } glPopMatrix(); glPopAttrib(); } /* -- INTERFACE FUNCTIONS -------------------------------------------------- */ /* * Renders a beautiful wired teapot... */ void glutWireTeapot( GLdouble size ) { /* We will use the general teapot rendering code */ fghTeapot( 10, size, GL_LINE ); } /* * Renders a beautiful filled teapot... */ void glutSolidTeapot( GLdouble size ) { /* We will use the general teapot rendering code */ fghTeapot( 7, size, GL_FILL ); } /*** END OF FILE ***/