*/
#ifdef STANDALONE
-# define PROGCLASS "Klein"
-# define HACK_INIT init_klein
-# define HACK_DRAW draw_klein
-# define HACK_RESHAPE reshape_klein
-# define HACK_HANDLE_EVENT klein_handle_event
-# define EVENT_MASK PointerMotionMask
-# define klein_opts xlockmore_opts
-
-
-#define DEF_SPIN "True"
-#define DEF_WANDER "False"
-#define DEF_RANDOM "False"
-#define DEF_SPEED "150"
-
-# define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*random: " DEF_RANDOM "\n" \
- "*speed: " DEF_SPEED "\n" \
- "*spin: " DEF_SPIN "\n" \
- "*wander: " DEF_WANDER "\n" \
+# define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n"
+# define refresh_klein 0
# include "xlockmore.h" /* from the xscreensaver distribution */
#else /* !STANDALONE */
# include "xlock.h" /* from the xlockmore distribution */
#ifdef USE_GL
-#include <GL/glu.h>
+#define DEF_SPIN "True"
+#define DEF_WANDER "False"
+#define DEF_RAND "True"
+#define DEF_SPEED "150"
+
#include "rotator.h"
#include "gltrackball.h"
};
static argtype vars[] = {
- {&rand, "rand", "Random", DEF_RANDOM, t_Bool},
+ {&rand, "rand", "Random", DEF_RAND, t_Bool},
{&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
{&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
{&speed, "speed", "Speed", DEF_SPEED, t_Int},
};
-ModeSpecOpt klein_opts = {countof(opts), opts, countof(vars), vars, NULL};
+ENTRYPOINT ModeSpecOpt klein_opts = {countof(opts), opts, countof(vars), vars, NULL};
float du, dv;
float a, b, c;
+ float draw_step;
+
} kleinstruct;
static kleinstruct *klein = NULL;
draw(ModeInfo *mi)
{
kleinstruct *kp = &klein[MI_SCREEN(mi)];
- static float step = 0.0;
double u, v;
float coord[3];
+ mi->polygon_count = 0;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
coord[2] = sin(u/2)*sin(v) + cos(u/2)*sin(2*v)/2;
glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
glVertex3fv(coord);
+ mi->polygon_count++;
}
}
break;
coord[2] = kp->a*(cos(v) + sin(tan((v/2))))+0.2*u;
glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
glVertex3fv(coord);
+ mi->polygon_count++;
}
}
break;
coord[2] = u*u-v*v;
glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
glVertex3fv(coord);
+ mi->polygon_count++;
}
}
break;
glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
glVertex3fv(coord);
+ mi->polygon_count++;
}
}
break;
coord[2] = v*sin(u/2);
glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
glVertex3fv(coord);
+ mi->polygon_count++;
}
}
break;
coord[2] = sin(kp->b+=0.00001)*v/(2*M_PI)+kp->a*(1-v/(2*M_PI))*sin(u);
glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
glVertex3fv(coord);
+ mi->polygon_count++;
}
}
break;
coord[2] = u;
glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
glVertex3fv(coord);
+ mi->polygon_count++;
}
}
break;
coord[2] = sin(v);
glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
glVertex3fv(coord);
+ mi->polygon_count++;
}
}
break;
coord[2] = sin(u/2)*cos(v) + cos(u/2)*sin(v);
glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
glVertex3fv(coord);
+ mi->polygon_count++;
}
}
break;
glEnd();
glPopMatrix();
+ if (kp->render == GL_LINES)
+ mi->polygon_count /= 2;
- kp->a = sin(step+=0.01);
- kp->b = cos(step+=0.01);
+ kp->a = sin(kp->draw_step+=0.01);
+ kp->b = cos(kp->draw_step+=0.01);
}
/* new window size or exposure */
-void
+ENTRYPOINT void
reshape_klein(ModeInfo *mi, int width, int height)
{
GLfloat h = (GLfloat) height / (GLfloat) width;
}
-Bool
+ENTRYPOINT Bool
klein_handle_event (ModeInfo *mi, XEvent *event)
{
kleinstruct *kp = &klein[MI_SCREEN(mi)];
- if (event->xany.type == ButtonPress && event->xbutton.button & Button1) {
+ if (event->xany.type == ButtonPress && event->xbutton.button == Button1) {
kp->button_down_p = True;
gltrackball_start (kp->trackball, event->xbutton.x, event->xbutton.y, MI_WIDTH (mi), MI_HEIGHT (mi));
return True;
- } else if (event->xany.type == ButtonRelease && event->xbutton.button & Button1) {
+ } else if (event->xany.type == ButtonRelease && event->xbutton.button == Button1) {
kp->button_down_p = False;
return True;
- } else if (event->xany.type == MotionNotify && kp->button_down_p) {
+ } else if (event->xany.type == ButtonPress &&
+ (event->xbutton.button == Button4 ||
+ event->xbutton.button == Button5 ||
+ event->xbutton.button == Button6 ||
+ event->xbutton.button == Button7)) {
+ gltrackball_mousewheel (kp->trackball, event->xbutton.button, 10,
+ !!event->xbutton.state);
+ return True;
+ } else if (event->xany.type == MotionNotify && kp->button_down_p) {
gltrackball_track (kp->trackball, event->xmotion.x, event->xmotion.y, MI_WIDTH (mi), MI_HEIGHT (mi));
return True;
}
}
-void
+ENTRYPOINT void
init_klein(ModeInfo *mi)
{
int screen = MI_SCREEN(mi);
}
}
-void
+ENTRYPOINT void
draw_klein(ModeInfo * mi)
{
kleinstruct *kp = &klein[MI_SCREEN(mi)];
glXSwapBuffers(display, window);
}
-void
+ENTRYPOINT void
release_klein(ModeInfo * mi)
{
if (klein != NULL) {
}
+XSCREENSAVER_MODULE ("Klein", klein)
+
/*********************************************************/
#endif