- int i, j;
- float drho, dtheta;
- float rho, theta;
- GLfloat vector[3];
- GLfloat ds, dt, t, s;
-
- if (!wire)
- glShadeModel(GL_SMOOTH);
-
- /* Generate a sphere with quadrilaterals.
- * Quad vertices are determined using a parametric sphere function.
- * For fun, you could generate practically any parameteric surface and
- * map an image onto it.
- */
- drho = M_PI / stacks;
- dtheta = 2.0 * M_PI / slices;
- ds = 1.0 / slices;
- dt = 1.0 / stacks;
-
- glFrontFace(GL_CCW);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
-
- t = 0.0;
- for (i=0; i < stacks; i++) {
- rho = i * drho;
- s = 0.0;
- for (j=0; j < slices; j++) {
- theta = j * dtheta;
-
- glTexCoord2f (s,t);
- parametric_sphere (theta, rho, vector);
- glNormal3fv (vector);
- parametric_sphere (theta, rho, vector);
- glVertex3f (vector[0], vector[1], vector[2]);
-
- glTexCoord2f (s,t+dt);
- parametric_sphere (theta, rho+drho, vector);
- glNormal3fv (vector);
- parametric_sphere (theta, rho+drho, vector);
- glVertex3f (vector[0], vector[1], vector[2]);
-
- glTexCoord2f (s+ds,t+dt);
- parametric_sphere (theta + dtheta, rho+drho, vector);
- glNormal3fv (vector);
- parametric_sphere (theta + dtheta, rho+drho, vector);
- glVertex3f (vector[0], vector[1], vector[2]);
-
- glTexCoord2f (s+ds, t);
- parametric_sphere (theta + dtheta, rho, vector);
- glNormal3fv (vector);
- parametric_sphere (theta + dtheta, rho, vector);
- glVertex3f (vector[0], vector[1], vector[2]);
-
- s = s + ds;
+ int polys = 0;
+ int i,j;
+ double theta1, theta2, theta3;
+ XYZ p, n;
+ XYZ la = { 0, -1, 0 }, lb = { 0, -1, 0 };
+ XYZ c = {0, 0, 0}; /* center */
+ double r = 1.0; /* radius */
+ int stacks2 = stacks * 2;
+
+ int mode = (wire_p ? GL_LINE_STRIP : GL_TRIANGLE_STRIP);
+
+ int arraysize, out;
+ struct { XYZ p; XYZ n; GLfloat s, t; } *array;
+
+ if (r < 0)
+ r = -r;
+ if (slices < 0)
+ slices = -slices;
+
+ arraysize = (stacks+1) * (slices+1) * (wire_p ? 4 : 2);
+ array = (void *) calloc (arraysize, sizeof(*array));
+ if (! array) abort();
+ out = 0;
+
+ if (slices < 4 || stacks < 2 || r <= 0)
+ {
+ mode = GL_POINTS;
+ array[out++].p = c;
+ goto END;