TinyGL 0.4.1 for MinGW
glu.c
Go to the documentation of this file.
1#include <stdlib.h>
2#include <math.h>
3#include <GL/gl.h>
4#include "glu.h"
5
6
7void drawTorus(float rc, int numc, float rt, int numt)
8{
9 int i, j, k;
10 double s, t;
11 double x, y, z;
12 double pi, twopi;
13
14 pi = 3.14159265358979323846;
15 twopi = 2 * pi;
16
17 for (i = 0; i < numc; i++) {
19 for (j = 0; j <= numt; j++) {
20 for (k = 1; k >= 0; k--) {
21 s = (i + k) % numc + 0.5;
22 t = j % numt;
23
24 x = cos(t*twopi/numt) * cos(s*twopi/numc);
25 y = sin(t*twopi/numt) * cos(s*twopi/numc);
26 z = sin(s*twopi/numc);
27 glNormal3f(x, y, z);
28
29 x = (rt + rc * cos(s*twopi/numc)) * cos(t*twopi/numt);
30 y = (rt + rc * cos(s*twopi/numc)) * sin(t*twopi/numt);
31 z = rc * sin(s*twopi/numc);
32 glVertex3f(x, y, z);
33 }
34 }
35 glEnd();
36 }
37}
38
39static void normal3f( GLfloat x, GLfloat y, GLfloat z )
40{
41 GLdouble mag;
42
43 mag = sqrt( x*x + y*y + z*z );
44 if (mag>0.00001F) {
45 x /= mag;
46 y /= mag;
47 z /= mag;
48 }
49 glNormal3f( x, y, z );
50}
51
52void gluPerspective( GLdouble fovy, GLdouble aspect,
53 GLdouble zNear, GLdouble zFar )
54{
55 GLdouble xmin, xmax, ymin, ymax;
56
57 ymax = zNear * tan( fovy * M_PI / 360.0 );
58 ymin = -ymax;
59
60 xmin = ymin * aspect;
61 xmax = ymax * aspect;
62
63 glFrustum( xmin, xmax, ymin, ymax, zNear, zFar );
64}
65
67{
68 return NULL;
69}
70
72{
73}
74
76 GLdouble baseRadius, GLdouble topRadius, GLdouble height,
77 GLint slices, GLint stacks )
78{
79 GLdouble da, r, dr, dz;
80 GLfloat z, nz, nsign;
81 GLint i, j;
82 GLfloat du = 1.0 / slices;
83 GLfloat dv = 1.0 / stacks;
84 GLfloat tcx = 0.0, tcy = 0.0;
85
86 nsign = 1.0;
87
88 da = 2.0*M_PI / slices;
89 dr = (topRadius-baseRadius) / stacks;
90 dz = height / stacks;
91 nz = (baseRadius-topRadius) / height; /* Z component of normal vectors */
92
93 for (i=0;i<slices;i++) {
94 GLfloat x1 = -sin(i*da);
95 GLfloat y1 = cos(i*da);
96 GLfloat x2 = -sin((i+1)*da);
97 GLfloat y2 = cos((i+1)*da);
98 z = 0.0;
99 r = baseRadius;
100 tcy = 0.0;
102 for (j=0;j<=stacks;j++) {
103 if (nsign==1.0) {
104 normal3f( x1*nsign, y1*nsign, nz*nsign );
105 glTexCoord2f(tcx, tcy);
106 glVertex3f( x1*r, y1*r, z );
107 normal3f( x2*nsign, y2*nsign, nz*nsign );
108 glTexCoord2f(tcx+du, tcy);
109 glVertex3f( x2*r, y2*r, z );
110 }
111 else {
112 normal3f( x2*nsign, y2*nsign, nz*nsign );
113 glTexCoord2f(tcx, tcy);
114 glVertex3f( x2*r, y2*r, z );
115 normal3f( x1*nsign, y1*nsign, nz*nsign );
116 glTexCoord2f(tcx+du, tcy);
117 glVertex3f( x1*r, y1*r, z );
118 }
119 z += dz;
120 r += dr;
121 tcy += dv;
122 }
123 glEnd();
124 tcx += du;
125 }
126}
127
128/* Disk (adapted from Mesa) */
129
131 GLdouble innerRadius, GLdouble outerRadius,
132 GLint slices, GLint loops )
133{
134 GLdouble a, da;
135 GLfloat dr;
136 GLfloat r1, r2, dtc;
137 GLint s, l;
138 GLfloat sa,ca;
139
140 /* Normal vectors */
141 glNormal3f( 0.0, 0.0, +1.0 );
142
143 da = 2.0*M_PI / slices;
144 dr = (outerRadius-innerRadius) / (GLfloat) loops;
145
146 /* texture of a gluDisk is a cut out of the texture unit square */
147 /* x, y in [-outerRadius, +outerRadius]; s, t in [0, 1] (linear mapping) */
148 dtc = 2.0f * outerRadius;
149
150 r1 = innerRadius;
151 for (l=0;l<loops;l++) {
152 r2 = r1 + dr;
154 for (s=0;s<=slices;s++) {
155 if (s==slices) a = 0.0;
156 else a = s * da;
157 sa = sin(a); ca = cos(a);
158 glTexCoord2f(0.5+sa*r2/dtc,0.5+ca*r2/dtc);
159 glVertex2f( r2*sa, r2*ca );
160 glTexCoord2f(0.5+sa*r1/dtc,0.5+ca*r1/dtc);
161 glVertex2f( r1*sa, r1*ca );
162 }
163 glEnd();
164 r1 = r2;
165 }
166
167}
168
169/*
170 * Sphère (adapted from Mesa)
171 */
172
174 float radius,int slices,int stacks)
175{
176 float rho, drho, theta, dtheta;
177 float x, y, z;
178 float s, t, ds, dt;
179 int i, j, imin, imax;
180 int normals;
181 float nsign;
182
183 normals=1;
184 nsign=1;
185
186 drho = M_PI / (float) stacks;
187 dtheta = 2.0 * M_PI / (float) slices;
188
189 /* draw +Z end as a triangle fan */
191 glNormal3f( 0.0, 0.0, 1.0 );
192 glTexCoord2f(0.5,0.0);
193 glVertex3f( 0.0, 0.0, nsign * radius );
194 for (j=0;j<=slices;j++) {
195 theta = (j==slices) ? 0.0 : j * dtheta;
196 x = -sin(theta) * sin(drho);
197 y = cos(theta) * sin(drho);
198 z = nsign * cos(drho);
199 if (normals) glNormal3f( x*nsign, y*nsign, z*nsign );
200 glVertex3f( x*radius, y*radius, z*radius );
201 }
202 glEnd();
203
204
205 ds = 1.0 / slices;
206 dt = 1.0 / stacks;
207 t = 1.0; /* because loop now runs from 0 */
208 if (1) {
209 imin = 0;
210 imax = stacks;
211 }
212 else {
213 imin = 1;
214 imax = stacks-1;
215 }
216
217 /* draw intermediate stacks as quad strips */
218 for (i=imin;i<imax;i++) {
219 rho = i * drho;
221 s = 0.0;
222 for (j=0;j<=slices;j++) {
223 theta = (j==slices) ? 0.0 : j * dtheta;
224 x = -sin(theta) * sin(rho);
225 y = cos(theta) * sin(rho);
226 z = nsign * cos(rho);
227 if (normals) glNormal3f( x*nsign, y*nsign, z*nsign );
228 glTexCoord2f(s,1-t);
229 glVertex3f( x*radius, y*radius, z*radius );
230 x = -sin(theta) * sin(rho+drho);
231 y = cos(theta) * sin(rho+drho);
232 z = nsign * cos(rho+drho);
233 if (normals) glNormal3f( x*nsign, y*nsign, z*nsign );
234 glTexCoord2f(s,1-(t-dt));
235 s += ds;
236 glVertex3f( x*radius, y*radius, z*radius );
237 }
238 glEnd();
239 t -= dt;
240 }
241
242/* draw -Z end as a triangle fan */
244 glNormal3f( 0.0, 0.0, -1.0 );
245 glTexCoord2f(0.5,1.0);
246 glVertex3f( 0.0, 0.0, -radius*nsign );
247 rho = M_PI - drho;
248 s = 1.0;
249 t = dt;
250 for (j=slices;j>=0;j--) {
251 theta = (j==slices) ? 0.0 : j * dtheta;
252 x = -sin(theta) * sin(rho);
253 y = cos(theta) * sin(rho);
254 z = nsign * cos(rho);
255 if (normals) glNormal3f( x*nsign, y*nsign, z*nsign );
256 glTexCoord2f(s,1-t);
257 s -= ds;
258 glVertex3f( x*radius, y*radius, z*radius );
259 }
260 glEnd();
261}
void glVertex2f(float x, float y)
Definition: api.c:18
void glVertex3f(float x, float y, float z)
Definition: api.c:23
void glNormal3f(float x, float y, float z)
Definition: api.c:35
void glTexCoord2f(float s, float t)
Definition: api.c:118
#define M_PI
Definition: gears.c:24
void glFrustum(double left, double right, double bottom, double top, double near, double far)
Definition: api.c:354
@ GL_QUAD_STRIP
Definition: gl.h:40
@ GL_TRIANGLE_FAN
Definition: gl.h:38
float GLfloat
Definition: gl.h:671
double GLdouble
Definition: gl.h:672
int GLint
Definition: gl.h:667
void glBegin(int type)
Definition: api.c:223
void glEnd(void)
Definition: api.c:233
void gluQuadricDrawStyle(GLUquadricObj *obj, int style)
Definition: glu.c:71
void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar)
Definition: glu.c:52
void drawTorus(float rc, int numc, float rt, int numt)
Definition: glu.c:7
void gluDisk(GLUquadricObj *qobj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops)
Definition: glu.c:130
void gluSphere(GLUquadricObj *qobj, float radius, int slices, int stacks)
Definition: glu.c:173
void gluCylinder(GLUquadricObj *qobj, GLdouble baseRadius, GLdouble topRadius, GLdouble height, GLint slices, GLint stacks)
Definition: glu.c:75
GLUquadricObj * gluNewQuadric(void)
Definition: glu.c:66
register int a
Definition: zline.h:1
int x1
Definition: ztriangle.h:15
int x2
Definition: ztriangle.h:17