xenocara/app/xlockmore/modes/glx/i_linkage.cc
2006-11-26 11:07:42 +00:00

127 lines
3.1 KiB
C++

#ifdef VMS
/* Xlib.h for VMS is not (yet) compatible with C++ *
* The resulting warnings are switched off here */
#pragma message disable nosimpint
#include <X11/Intrinsic.h>
#pragma message enable nosimpint
#endif
#include "xlock.h"
#ifndef VMS
#include <X11/Intrinsic.h>
#endif
#include "i_linkage.h"
#include "i_threejetvec.h"
#include "i_figureeight.h"
#include "i_spline.h"
#include "i_sphere.h"
char *parse_parts(char *parts);
#define PART_POS 0x1
#define PART_NEG 0x2
double scale = M_PI;
int scene = 0;
int bezier = 0;
char *parts = (char *) NULL;
int n_strips = N_STRIPS;
Bool
invert_draw(spherestruct * gp)
{
double umin, vmin, umax, vmax;
double du, dv;
double time = 0.0;
double corrstart, pushstart, twiststart, unpushstart, uncorrstart;
int binary = 0;
int j, k;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(gp->view_rotx, 1.0, 0.0, 0.0);
glRotatef(gp->view_roty, 0.0, 1.0, 0.0);
glRotatef(gp->view_rotz, 0.0, 0.0, 1.0);
/* default parameters */
corrstart = 0;
pushstart = .1;
twiststart = .23;
unpushstart = .6;
uncorrstart = .93;
vmin = 0.0;
umin = 0.0;
vmax = 1.0;
umax = 1.0;
du = dv = 1./12.;
/* Simple inversion fits our needs perfectly... */
du = 0.04;
dv = 0.04;
umax = 2.0;
parts = (char *) "+0+1+2+3+4+5+6+7";
time = (cos((M_PI*gp->time)/gp->numsteps)+1.0)/2.0;
binary = 0;
/* draw it here */
if (gp->partlist == NULL)
gp->partlist = parse_parts(parts);
/* Need to compute */
if (gp->construction) {
glNewList(gp->frames+gp->time, GL_COMPILE);
if (glGetError() != GL_NO_ERROR) {
return False;
}
if (time >= uncorrstart && uncorrstart >= 0)
printScene(UnCorrugate, umin, umax, du, vmin, vmax, dv,
(time - uncorrstart) / (1.0 - uncorrstart), binary);
else if (time >= unpushstart && unpushstart >= 0)
printScene(UnPush, umin, umax, du, vmin, vmax, dv,
(time - unpushstart) /
(((uncorrstart < 0) ? 1.0 : uncorrstart) - unpushstart), binary);
else if (time >= twiststart && twiststart >= 0)
printScene(Twist, umin, umax, du, vmin, vmax, dv,
(time - twiststart) /
(((unpushstart < 0) ? 1.0 : unpushstart) - twiststart), binary);
else if (time >= pushstart && pushstart >= 0)
printScene(PushThrough, umin, umax, du, vmin, vmax, dv,
(time - pushstart) /
(((twiststart < 0) ? 1.0 : twiststart) - pushstart), binary);
else if (time >= corrstart && corrstart >= 0)
printScene(Corrugate, umin, umax, du, vmin, vmax, dv,
(time - corrstart) /
(((pushstart < 0) ? 1.0 : pushstart) - corrstart), binary);
glEndList();
}
for(j = -1; j <= 1; j += 2) {
for(k = 0; k < n_strips; k++) {
if(gp->partlist[k] & (j<0 ? PART_NEG : PART_POS)) {
double t = 2*M_PI * (j < 0 ? n_strips-1-k : k) / n_strips;
double s = sin(t), c = cos(t);
GLdouble m[16];
m[0] = j*c; m[4] = -s; m[8] = 0; m[12] = 0;
m[1] = j*s; m[5] = c; m[9] = 0, m[13] = 0;
m[2] = 0; m[6] = 0; m[10] = j; m[14] = 0;
m[3] = 0; m[7] = 0; m[11] = 0; m[15] = 1;
glPushMatrix();
glMultMatrixd(m);
glCallList(gp->frames+gp->time);
glPopMatrix();
}
}
}
glPopMatrix();
return True;
}