/* -*- Mode: C; tab-width: 4 -*- */
-/* glplanet --- 3D rotating planet, e.g., Earth. */
-
-#if !defined( lint ) && !defined( SABER )
-static const char sccsid[] = "@(#)plate.c 4.07 97/11/24 xlockmore";
-
-#endif
-
-/*-
+/* glplanet --- 3D rotating planet, e.g., Earth.
+ *
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice appear in all copies and that
* other special, indirect and consequential damages.
*
* Revision History:
+ * 21-Mar-01: jwz@jwz.org Broke sphere routine out into its own file.
+ *
* 9-Oct-98: dek@cgl.ucsf.edu Added stars.
*
* 8-Oct-98: jwz@jwz.org Made the 512x512x1 xearth image be built in.
# define PROGCLASS "Planet"
# define HACK_INIT init_planet
# define HACK_DRAW draw_planet
+# define HACK_RESHAPE reshape_planet
# define planet_opts xlockmore_opts
#define DEFAULTS "*delay: 15000 \n" \
+ "*showFPS: False \n" \
"*rotate: True \n" \
"*roll: True \n" \
"*bounce: True \n" \
#ifdef USE_GL /* whole file */
+#include "sphere.h"
+
#ifdef HAVE_XPM
# include <X11/xpm.h>
# ifndef PIXEL_ALREADY_TYPEDEFED
*/
#define NUM_STARS 1000
-#define SLICES 15
-#define STACKS 15
+#define SLICES 32
+#define STACKS 32
/* radius of the sphere- fairly arbitrary */
#define RADIUS 4
}
+#if 0
/* Function for determining points on the surface of the sphere */
static void inline ParametricSphere(float theta, float rho, GLfloat *vector)
{
return;
}
+#endif
/* lame way to generate some random stars */
{
Bool wire = MI_IS_WIREFRAME(mi);
planetstruct *gp = &planets[MI_SCREEN(mi)];
- int i, j;
- int stacks=STACKS, slices=SLICES;
- float radius=RADIUS;
-
- float drho, dtheta;
- float rho, theta;
- GLfloat vector[3];
- GLfloat ds, dt, t, s;;
if (wire) {
glEnable(GL_LINE_SMOOTH);
generate_stars(MI_WIDTH(mi), MI_HEIGHT(mi));
}
-
- /*-
- * 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;
-
-
gp->platelist=glGenLists(1);
glNewList(gp->platelist, GL_COMPILE);
-
- glColor3f(1,1,1);
- 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);
- ParametricSphere(theta, rho, vector);
- normalize(vector);
- glNormal3fv(vector);
- ParametricSphere(theta, rho, vector);
- glVertex3f( vector[0]*radius, vector[1]*radius, vector[2]*radius );
-
- glTexCoord2f(s,t+dt);
- ParametricSphere(theta, rho+drho, vector);
- normalize(vector);
- glNormal3fv(vector);
- ParametricSphere(theta, rho+drho, vector);
- glVertex3f( vector[0]*radius, vector[1]*radius, vector[2]*radius );
-
- glTexCoord2f(s+ds,t+dt);
- ParametricSphere(theta + dtheta, rho+drho, vector);
- normalize(vector);
- glNormal3fv(vector);
- ParametricSphere(theta + dtheta, rho+drho, vector);
- glVertex3f( vector[0]*radius, vector[1]*radius, vector[2]*radius );
-
- glTexCoord2f(s+ds, t);
- ParametricSphere(theta + dtheta, rho, vector);
- normalize(vector);
- glNormal3fv(vector);
- ParametricSphere(theta + dtheta, rho, vector);
- glVertex3f( vector[0]*radius, vector[1]*radius, vector[2]*radius );
-
- s = s + ds;
-
- }
- t = t + dt;
- }
- glEnd();
+ glPushMatrix ();
+ glScalef (RADIUS, RADIUS, RADIUS);
+ unit_sphere (STACKS, SLICES, wire);
+ glPopMatrix ();
glEndList();
-
-
}
static void
if (do_bounce)
{
- /* Move in the direction we had been moving in. */
- gp->xpos += gp->dx;
- gp->ypos += gp->dy;
- gp->zpos += gp->dz;
-
- /* Bounce. */
- if (gp->xpos > gp->box_depth)
- gp->xpos = gp->box_depth, gp->dx = -gp->dx;
- else if (gp->xpos < 0)
- gp->xpos = 0, gp->dx = -gp->dx;
-
- if (gp->ypos > gp->box_width/2)
- gp->ypos = gp->box_width/2, gp->dy = -gp->dy;
- else if (gp->ypos < -gp->box_width/2)
- gp->ypos = -gp->box_width/2, gp->dy = -gp->dy;
-
- if (gp->zpos > gp->box_height/2)
- gp->zpos = gp->box_height/2, gp->dz = -gp->dz;
- else if (gp->zpos < -gp->box_height/2)
- gp->zpos = -gp->box_height/2, gp->dz = -gp->dz;
+ static int frame = 0;
+# define SINOID(SCALE,SIZE) \
+ ((((1 + sin((frame * (SCALE)) / 2 * M_PI)) / 2.0) * (SIZE)) - (SIZE)/2)
+ gp->xpos = SINOID(0.031, gp->box_width);
+ gp->ypos = SINOID(0.023, gp->box_height);
+ gp->zpos = SINOID(0.017, gp->box_depth);
+ frame++;
}
}
/* Standard reshape function */
-static void
-reshape(int width, int height)
+void
+reshape_planet(ModeInfo *mi, int width, int height)
{
GLfloat light[4];
GLfloat h = (GLfloat) height / (GLfloat) width;
gp->window = MI_WINDOW(mi);
if ((gp->glx_context = init_GL(mi)) != NULL) {
- reshape(MI_WIDTH(mi), MI_HEIGHT(mi));
+ reshape_planet(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
pinit(mi);
} else {
MI_CLEARWINDOW(mi);
+ if (mi->fps_p) do_fps (mi);
glFinish();
glXSwapBuffers(display, window);