freeglut_teapot.c
上传用户:gb3593
上传日期:2022-01-07
资源大小:3028k
文件大小:6k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2.  * freeglut_teapot.c
  3.  *
  4.  * Teapot(tm) rendering code.
  5.  *
  6.  * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
  7.  * Written by Pawel W. Olszta, <olszta@sourceforge.net>
  8.  * Creation date: Fri Dec 24 1999
  9.  *
  10.  * Permission is hereby granted, free of charge, to any person obtaining a
  11.  * copy of this software and associated documentation files (the "Software"),
  12.  * to deal in the Software without restriction, including without limitation
  13.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  14.  * and/or sell copies of the Software, and to permit persons to whom the
  15.  * Software is furnished to do so, subject to the following conditions:
  16.  *
  17.  * The above copyright notice and this permission notice shall be included
  18.  * in all copies or substantial portions of the Software.
  19.  *
  20.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  21.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  22.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  23.  * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  24.  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  25.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  26.  */
  27. /*
  28.  * Original teapot code copyright follows:
  29.  */
  30. /*
  31.  * (c) Copyright 1993, Silicon Graphics, Inc.
  32.  *
  33.  * ALL RIGHTS RESERVED
  34.  *
  35.  * Permission to use, copy, modify, and distribute this software
  36.  * for any purpose and without fee is hereby granted, provided
  37.  * that the above copyright notice appear in all copies and that
  38.  * both the copyright notice and this permission notice appear in
  39.  * supporting documentation, and that the name of Silicon
  40.  * Graphics, Inc. not be used in advertising or publicity
  41.  * pertaining to distribution of the software without specific,
  42.  * written prior permission.
  43.  *
  44.  * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU
  45.  * "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR
  46.  * OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
  47.  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  IN NO
  48.  * EVENT SHALL SILICON GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE
  49.  * ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR
  50.  * CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
  51.  * INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,
  52.  * SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR
  53.  * NOT SILICON GRAPHICS, INC.  HAS BEEN ADVISED OF THE POSSIBILITY
  54.  * OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  55.  * ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR
  56.  * PERFORMANCE OF THIS SOFTWARE.
  57.  *
  58.  * US Government Users Restricted Rights
  59.  *
  60.  * Use, duplication, or disclosure by the Government is subject to
  61.  * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
  62.  * (c)(1)(ii) of the Rights in Technical Data and Computer
  63.  * Software clause at DFARS 252.227-7013 and/or in similar or
  64.  * successor clauses in the FAR or the DOD or NASA FAR
  65.  * Supplement.  Unpublished-- rights reserved under the copyright
  66.  * laws of the United States.  Contractor/manufacturer is Silicon
  67.  * Graphics, Inc., 2011 N.  Shoreline Blvd., Mountain View, CA
  68.  * 94039-7311.
  69.  *
  70.  * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
  71.  */
  72. #include <GL/freeglut.h>
  73. #include "freeglut_internal.h"
  74. #include "freeglut_teapot_data.h"
  75. /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
  76. static void fghTeapot( GLint grid, GLdouble scale, GLenum type )
  77. {
  78. #if defined(_WIN32_WCE)
  79. int i, numV=sizeof(strip_vertices)/4, numI=sizeof(strip_normals)/4;
  80. #else
  81.     double p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3];
  82.     long i, j, k, l;
  83. #endif
  84.     glPushAttrib( GL_ENABLE_BIT | GL_EVAL_BIT );
  85.     glEnable( GL_AUTO_NORMAL );
  86.     glEnable( GL_NORMALIZE );
  87.     glEnable( GL_MAP2_VERTEX_3 );
  88.     glEnable( GL_MAP2_TEXTURE_COORD_2 );
  89.     glPushMatrix();
  90.     glRotated( 270.0, 1.0, 0.0, 0.0 );
  91.     glScaled( 0.5 * scale, 0.5 * scale, 0.5 * scale );
  92.     glTranslated( 0.0, 0.0, -1.5 );
  93. #if defined(_WIN32_WCE)
  94.     glRotated( 90.0, 1.0, 0.0, 0.0 );
  95.     glBegin( GL_TRIANGLE_STRIP );
  96.     for( i = 0; i < numV-1; i++ )
  97.     {
  98.         int vidx = strip_vertices[i],
  99.             nidx = strip_normals[i];
  100.         if( vidx != -1 )
  101.         {
  102.             glNormal3fv( normals[nidx]  );
  103.             glVertex3fv( vertices[vidx] );
  104.         }
  105.         else
  106.         {
  107.             glEnd();
  108.             glBegin( GL_TRIANGLE_STRIP );
  109.         }
  110.     }
  111.     glEnd();
  112. #else
  113.     for (i = 0; i < 10; i++) {
  114.       for (j = 0; j < 4; j++) {
  115.         for (k = 0; k < 4; k++) {
  116.           for (l = 0; l < 3; l++) {
  117.             p[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
  118.             q[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
  119.             if (l == 1)
  120.               q[j][k][l] *= -1.0;
  121.             if (i < 6) {
  122.               r[j][k][l] =
  123.                 cpdata[patchdata[i][j * 4 + (3 - k)]][l];
  124.               if (l == 0)
  125.                 r[j][k][l] *= -1.0;
  126.               s[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
  127.               if (l == 0)
  128.                 s[j][k][l] *= -1.0;
  129.               if (l == 1)
  130.                 s[j][k][l] *= -1.0;
  131.             }
  132.           }
  133.         }
  134.       }
  135.       glMap2d(GL_MAP2_TEXTURE_COORD_2, 0.0, 1.0, 2, 2, 0.0, 1.0, 4, 2,
  136.         &tex[0][0][0]);
  137.       glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4,
  138.         &p[0][0][0]);
  139.       glMapGrid2d(grid, 0.0, 1.0, grid, 0.0, 1.0);
  140.       glEvalMesh2(type, 0, grid, 0, grid);
  141.       glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4,
  142.         &q[0][0][0]);
  143.       glEvalMesh2(type, 0, grid, 0, grid);
  144.       if (i < 6) {
  145.         glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4,
  146.           &r[0][0][0]);
  147.         glEvalMesh2(type, 0, grid, 0, grid);
  148.         glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4,
  149.           &s[0][0][0]);
  150.         glEvalMesh2(type, 0, grid, 0, grid);
  151.       }
  152.     }
  153. #endif  /* defined(_WIN32_WCE) */
  154.     glPopMatrix();
  155.     glPopAttrib();
  156. }
  157. /* -- INTERFACE FUNCTIONS -------------------------------------------------- */
  158. /*
  159.  * Renders a beautiful wired teapot...
  160.  */
  161. void FGAPIENTRY glutWireTeapot( GLdouble size )
  162. {
  163.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireTeapot" );
  164.     /* We will use the general teapot rendering code */
  165.     fghTeapot( 10, size, GL_LINE );
  166. }
  167. /*
  168.  * Renders a beautiful filled teapot...
  169.  */
  170. void FGAPIENTRY glutSolidTeapot( GLdouble size )
  171. {
  172.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidTeapot" );
  173.     /* We will use the general teapot rendering code */
  174.     fghTeapot( 7, size, GL_FILL );
  175. }
  176. /*** END OF FILE ***/