2 * Copyright (c) 1993-1997, Silicon Graphics, Inc.
4 * Permission to use, copy, modify, and distribute this software for
5 * any purpose and without fee is hereby granted, provided that the above
6 * copyright notice appear in all copies and that both the copyright notice
7 * and this permission notice appear in supporting documentation, and that
8 * the name of Silicon Graphics, Inc. not be used in advertising
9 * or publicity pertaining to distribution of the software without specific,
10 * written prior permission.
12 * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
13 * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
14 * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
15 * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
16 * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
17 * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
18 * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
19 * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
20 * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
21 * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
22 * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
23 * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
25 * US Government Users Restricted Rights
26 * Use, duplication, or disclosure by the Government is subject to
27 * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
28 * (c)(1)(ii) of the Rights in Technical Data and Computer Software
29 * clause at DFARS 252.227-7013 and/or in similar or successor
30 * clauses in the FAR or the DOD or NASA FAR Supplement.
31 * Unpublished-- rights reserved under the copyright laws of the
32 * United States. Contractor/manufacturer is Silicon Graphics,
33 * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
35 * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
40 * This program draws a NURBS surface in the shape of a
41 * symmetrical hill, using both a NURBS curve and pwl
42 * (piecewise linear) curve to trim part of the surface.
54 GLfloat ctlpoints
[4][4][3];
59 * Initializes the control points of the surface to a small hill.
60 * The control points range from -3 to +3 in x, y, and z
62 static void init_surface(void)
65 for (u
= 0; u
< 4; u
++) {
66 for (v
= 0; v
< 4; v
++) {
67 ctlpoints
[u
][v
][0] = 2.0*((GLfloat
)u
- 1.5);
68 ctlpoints
[u
][v
][1] = 2.0*((GLfloat
)v
- 1.5);
70 if ( (u
== 1 || u
== 2) && (v
== 1 || v
== 2))
71 ctlpoints
[u
][v
][2] = 3.0;
73 ctlpoints
[u
][v
][2] = -3.0;
78 static void nurbsError(GLenum errorCode
)
80 const GLubyte
*estring
;
82 estring
= gluErrorString(errorCode
);
83 fprintf (stderr
, "Nurbs Error: %s\n", (char *) estring
);
87 /* Initialize material property and depth buffer.
89 static void init(void)
91 GLfloat mat_diffuse
[] = { 0.7, 0.7, 0.7, 1.0 };
92 GLfloat mat_specular
[] = { 1.0, 1.0, 1.0, 1.0 };
93 GLfloat mat_shininess
[] = { 100.0 };
95 glClearColor (0.0, 0.0, 0.0, 0.0);
96 glMaterialfv(GL_FRONT
, GL_DIFFUSE
, mat_diffuse
);
97 glMaterialfv(GL_FRONT
, GL_SPECULAR
, mat_specular
);
98 glMaterialfv(GL_FRONT
, GL_SHININESS
, mat_shininess
);
100 glEnable(GL_LIGHTING
);
102 glEnable(GL_DEPTH_TEST
);
103 glEnable(GL_AUTO_NORMAL
);
104 glEnable(GL_NORMALIZE
);
108 theNurb
= gluNewNurbsRenderer();
109 gluNurbsProperty(theNurb
, GLU_SAMPLING_TOLERANCE
, 25.0);
110 gluNurbsProperty(theNurb
, GLU_DISPLAY_MODE
, GLU_FILL
);
111 gluNurbsCallback(theNurb
, GLU_ERROR
,
112 (GLvoid (CALLBACK
*) ()) nurbsError
);
115 static void display(void)
117 GLfloat knots
[8] = {0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0};
118 GLfloat edgePt
[5][2] = /* counter clockwise */
119 {{0.0, 0.0}, {1.0, 0.0}, {1.0, 1.0}, {0.0, 1.0}, {0.0, 0.0}};
120 GLfloat curvePt
[4][2] = /* clockwise */
121 {{0.25, 0.5}, {0.25, 0.75}, {0.75, 0.75}, {0.75, 0.5}};
122 GLfloat curveKnots
[8] =
123 {0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0};
124 GLfloat pwlPt
[4][2] = /* clockwise */
125 {{0.75, 0.5}, {0.5, 0.25}, {0.25, 0.5}};
127 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
129 glRotatef(330.0, 1.,0.,0.);
130 glScalef (0.5, 0.5, 0.5);
132 gluBeginSurface(theNurb
);
133 gluNurbsSurface(theNurb
, 8, knots
, 8, knots
,
134 4 * 3, 3, &ctlpoints
[0][0][0],
135 4, 4, GL_MAP2_VERTEX_3
);
136 gluBeginTrim (theNurb
);
137 gluPwlCurve (theNurb
, 5, &edgePt
[0][0], 2, GLU_MAP1_TRIM_2
);
138 gluEndTrim (theNurb
);
139 gluBeginTrim (theNurb
);
140 gluNurbsCurve (theNurb
, 8, curveKnots
, 2,
141 &curvePt
[0][0], 4, GLU_MAP1_TRIM_2
);
142 gluPwlCurve (theNurb
, 3, &pwlPt
[0][0], 2, GLU_MAP1_TRIM_2
);
143 gluEndTrim (theNurb
);
144 gluEndSurface(theNurb
);
150 static void reshape(int w
, int h
)
152 glViewport(0, 0, (GLsizei
) w
, (GLsizei
) h
);
153 glMatrixMode(GL_PROJECTION
);
155 gluPerspective (45.0, (GLdouble
)w
/(GLdouble
)h
, 3.0, 8.0);
157 glMatrixMode(GL_MODELVIEW
);
159 glTranslatef (0.0, 0.0, -5.0);
163 static void keyboard(unsigned char key
, int x
, int y
)
174 int main(int argc
, char** argv
)
176 glutInit(&argc
, argv
);
177 glutInitDisplayMode (GLUT_SINGLE
| GLUT_RGB
| GLUT_DEPTH
);
178 glutInitWindowSize (500, 500);
179 glutInitWindowPosition (100, 100);
180 glutCreateWindow(argv
[0]);
182 glutReshapeFunc(reshape
);
183 glutDisplayFunc(display
);
184 glutKeyboardFunc (keyboard
);