source: trunk/sys/TinyGL/examples/glu.c @ 299

Last change on this file since 299 was 1, checked in by alain, 8 years ago

First import

File size: 6.0 KB
Line 
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++) {
18        glBegin(GL_QUAD_STRIP);
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
66GLUquadricObj *gluNewQuadric(void)
67{
68  return NULL;
69}
70
71void gluQuadricDrawStyle(GLUquadricObj *obj, int style)
72{
73}
74
75void gluCylinder( GLUquadricObj *qobj,
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;
101         glBegin( GL_QUAD_STRIP );
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
130void gluDisk( GLUquadricObj *qobj,
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;
153               glBegin( GL_QUAD_STRIP );
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
173void gluSphere(GLUquadricObj *qobj,
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 */
190  glBegin( GL_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;
220         glBegin( GL_QUAD_STRIP );
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 */
243    glBegin( GL_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}
Note: See TracBrowser for help on using the repository browser.