Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5098 clevermous 1
#include 
2
#include 
3
#include 
4
#include "glu.h"
5
 
6
 
7
void 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
 
39
static 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
 
52
void 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
 
66
GLUquadricObj *gluNewQuadric(void)
67
{
68
  return NULL;
69
}
70
 
71
void gluQuadricDrawStyle(GLUquadricObj *obj, int style)
72
{
73
}
74
 
75
void 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
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
 
130
void 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
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
 
173
void 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
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
}