b3c0b828735607124361880e50f9d8d6941a01db
[freeglut] / src / freeglut_teapot.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 /*
29  * Original teapot code copyright follows:
30  */
31
32 /*
33  * (c) Copyright 1993, Silicon Graphics, Inc.
34  *
35  * ALL RIGHTS RESERVED
36  *
37  * Permission to use, copy, modify, and distribute this software
38  * for any purpose and without fee is hereby granted, provided
39  * that the above copyright notice appear in all copies and that
40  * both the copyright notice and this permission notice appear in
41  * supporting documentation, and that the name of Silicon
42  * Graphics, Inc. not be used in advertising or publicity
43  * pertaining to distribution of the software without specific,
44  * written prior permission.
45  *
46  * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU
47  * "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR
48  * OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
49  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  IN NO
50  * EVENT SHALL SILICON GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE
51  * ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR
52  * CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
53  * INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,
54  * SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR
55  * NOT SILICON GRAPHICS, INC.  HAS BEEN ADVISED OF THE POSSIBILITY
56  * OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
57  * ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR
58  * PERFORMANCE OF THIS SOFTWARE.
59  *
60  * US Government Users Restricted Rights
61  *
62  * Use, duplication, or disclosure by the Government is subject to
63  * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
64  * (c)(1)(ii) of the Rights in Technical Data and Computer
65  * Software clause at DFARS 252.227-7013 and/or in similar or
66  * successor clauses in the FAR or the DOD or NASA FAR
67  * Supplement.  Unpublished-- rights reserved under the copyright
68  * laws of the United States.  Contractor/manufacturer is Silicon
69  * Graphics, Inc., 2011 N.  Shoreline Blvd., Mountain View, CA
70  * 94039-7311.
71  *
72  * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
73  */
74
75 #ifdef HAVE_CONFIG_H
76 #include "config.h"
77 #endif
78
79 #include <GL/freeglut.h>
80 #include "freeglut_internal.h"
81
82 #include "freeglut_teapot_data.h"
83
84 /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
85
86
87 static void fghTeapot( GLint grid, GLdouble scale, GLenum type )
88 {
89 #if TARGET_HOST_WINCE
90                 int i, numV=sizeof(strip_vertices)/4, numI=sizeof(strip_normals)/4;
91 #else
92     double p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3];
93     long i, j, k, l;
94 #endif
95
96     glPushAttrib( GL_ENABLE_BIT | GL_EVAL_BIT );
97     glEnable( GL_AUTO_NORMAL );
98     glEnable( GL_NORMALIZE );
99     glEnable( GL_MAP2_VERTEX_3 );
100     glEnable( GL_MAP2_TEXTURE_COORD_2 );
101
102     glPushMatrix();
103     glRotated( 270.0, 1.0, 0.0, 0.0 );
104     glScaled( 0.5 * scale, 0.5 * scale, 0.5 * scale );
105     glTranslated( 0.0, 0.0, -1.5 );
106
107 #if TARGET_HOST_WINCE
108     glRotated( 90.0, 1.0, 0.0, 0.0 );
109     glBegin( GL_TRIANGLE_STRIP );
110
111     for( i = 0; i < numV-1; i++ )
112     {
113         int vidx = strip_vertices[i],
114             nidx = strip_normals[i];
115
116         if( vidx != -1 )
117         {
118             glNormal3fv( normals[nidx]  );
119             glVertex3fv( vertices[vidx] );
120         }
121         else
122         {
123             glEnd();
124             glBegin( GL_TRIANGLE_STRIP );
125         }
126     }
127
128     glEnd();
129 #else
130     for (i = 0; i < 10; i++) {
131       for (j = 0; j < 4; j++) {
132         for (k = 0; k < 4; k++) {
133           for (l = 0; l < 3; l++) {
134             p[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
135             q[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
136             if (l == 1)
137               q[j][k][l] *= -1.0;
138             if (i < 6) {
139               r[j][k][l] =
140                 cpdata[patchdata[i][j * 4 + (3 - k)]][l];
141               if (l == 0)
142                 r[j][k][l] *= -1.0;
143               s[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
144               if (l == 0)
145                 s[j][k][l] *= -1.0;
146               if (l == 1)
147                 s[j][k][l] *= -1.0;
148             }
149           }
150         }
151       }
152
153       glMap2d(GL_MAP2_TEXTURE_COORD_2, 0.0, 1.0, 2, 2, 0.0, 1.0, 4, 2,
154         &tex[0][0][0]);
155       glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4,
156         &p[0][0][0]);
157       glMapGrid2d(grid, 0.0, 1.0, grid, 0.0, 1.0);
158       glEvalMesh2(type, 0, grid, 0, grid);
159       glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4,
160         &q[0][0][0]);
161       glEvalMesh2(type, 0, grid, 0, grid);
162       if (i < 6) {
163         glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4,
164           &r[0][0][0]);
165         glEvalMesh2(type, 0, grid, 0, grid);
166         glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4,
167           &s[0][0][0]);
168         glEvalMesh2(type, 0, grid, 0, grid);
169       }
170     }
171 #endif  /* TARGET_HOST_WINCE */
172
173     glPopMatrix();
174     glPopAttrib();
175 }
176
177
178 /* -- INTERFACE FUNCTIONS -------------------------------------------------- */
179
180 /*
181  * Renders a beautiful wired teapot...
182  */
183 void FGAPIENTRY glutWireTeapot( GLdouble size )
184 {
185     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireTeapot" );
186     /* We will use the general teapot rendering code */
187     fghTeapot( 10, size, GL_LINE );
188 }
189
190 /*
191  * Renders a beautiful filled teapot...
192  */
193 void FGAPIENTRY glutSolidTeapot( GLdouble size )
194 {
195     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidTeapot" );
196     /* We will use the general teapot rendering code */
197     fghTeapot( 7, size, GL_FILL );
198 }
199
200 /*** END OF FILE ***/
201
202
203
204
205