test.cpp
C++ source for Ribbon, 252 lines. Raw file
#define WIN32_LEAN_AND_MEAN
#include <math.h>
#include "qe_ogl.h"
#include "mmsystem.h"
double r1=0, r2=0;
BOOL DrawMe = TRUE;
#define LENGTH 400
double ax[1000], ay[1000], az[1000];
double ax1[1000], ay1[1000], az1[1000];
double ax2[1000], ay2[1000], az2[1000];
void Cube(double x1, double y1, double z1, double x2, double y2, double z2, double r, double g, double b)
{
glColor3f(r, g, b);
glBegin(GL_TRIANGLE_FAN);
glVertex3f(x1, y1, z1);
glVertex3f(x1, y1, z2);
glVertex3f(x2, y1, z2);
glVertex3f(x2, y1, z1);
glEnd();
glBegin(GL_TRIANGLE_FAN);
glVertex3f(x2, y2, z1);
glVertex3f(x2, y2, z2);
glVertex3f(x1, y2, z2);
glVertex3f(x1, y2, z1);
glEnd();
glColor3f(r*0.95, g*0.95, b*0.95);
glBegin(GL_TRIANGLE_FAN);
glVertex3f(x1, y2, z1);
glVertex3f(x1, y2, z2);
glVertex3f(x1, y1, z2);
glVertex3f(x1, y1, z1);
glEnd();
glBegin(GL_TRIANGLE_FAN);
glVertex3f(x2, y1, z1);
glVertex3f(x2, y1, z2);
glVertex3f(x2, y2, z2);
glVertex3f(x2, y2, z1);
glEnd();
glColor3f(r*0.90, g*0.90, b*0.90);
glBegin(GL_TRIANGLE_FAN);
glVertex3f(x2, y1, z1);
glVertex3f(x2, y2, z1);
glVertex3f(x1, y2, z1);
glVertex3f(x1, y1, z1);
glEnd();
glBegin(GL_TRIANGLE_FAN);
glVertex3f(x1, y1, z2);
glVertex3f(x1, y2, z2);
glVertex3f(x2, y2, z2);
glVertex3f(x2, y1, z2);
glEnd();
}
void Initialise()
{
int i;
int time = timeGetTime();
for(i=0; i<LENGTH; i++) {
ax[i] = 6.0*sin((i+12)*3.14159/(23+4*sin(time*0.000248))+time*0.000054);
ay[i] = 6.0*sin((i+45)*3.14159/(37+6*sin(time*0.000597))+time*0.000017);
az[i] = 6.0*cos((i+23)*3.14159/(40+9*sin(time*0.000725))+time*0.000093);
}
}
void vector_unit(double *x, double *y, double *z)
{
double d = 1.0/sqrt(*x**x+*y**y+*z**z);
*x*=d;*y*=d;*z*=d;
}
void vector_cross(double *x, double *y, double *z, double ax, double ay, double az, double bx, double by, double bz)
{
*x = ay*bz - az*by;
*y = az*bx - ax*bz;
*z = ax*by - ay*bx;
}
void getviewpoint(double *mx, double *my, double *mz, double r1, double r2)
{
double vx = 0, vy = 0, vz = 0;
double wx, wy, wz;
// r1 = -r1;
// r2 = -r2;
vx = 0;
vy = 0;
vz = 15;
wx = vx;
wy = vy*cos(0.2*r2*3.14159/180)-vz*sin(0.2*r2*3.14159/180);
wz = -(vy*sin(0.2*r2*3.14159/180)+vz*cos(0.2*r2*3.14159/180));
vx = wx*cos(0.2*r1*3.14159/180)-wz*sin(0.2*r1*3.14159/180);
vy = wy;
vz = -(wx*sin(0.2*r1*3.14159/180)+wz*cos(0.2*r1*3.14159/180));
*mx = vx; *my = vy; *mz = vz;
}
void getscreenpoint(double *mx, double *my, double *mz, double w1, double w2, double w3, double r1, double r2)
{
double vx = 0, vy = 0, vz = 0;
double wx, wy, wz;
r1 = -r1;
r2 = -r2;
vx = wx*cos(0.2*r1*3.14159/180)-wz*sin(0.2*r1*3.14159/180);
vy = wy;
vz = -(wx*sin(0.2*r1*3.14159/180)+wz*cos(0.2*r1*3.14159/180));
wx = vx;
wy = vy*cos(0.2*r2*3.14159/180)-vz*sin(0.2*r2*3.14159/180);
wz = -(vy*sin(0.2*r2*3.14159/180)+vz*cos(0.2*r2*3.14159/180));
*mx = wx; *my = wy; *mz = wz;
}
void GameDraw()
{
int i, j;
double r, g, b;
Initialise();
int time = timeGetTime();
double mx, my, mz;
mx = 5.0*sin(time*3.14159/2516);
my = 5.0*sin(time*3.14159/2351);
mz = 5.0*sin(time*3.14159/2892);
// Cube(mx-0.5, my-0.5, mz-0.5, mx+0.5, my+0.5, mz+0.5, 1, 0, 0);
// getviewpoint(&mx, &my, &mz, r1, r2);
double dx, dy, dz;
double dmx, dmy, dmz;
double px2, py2, pz2;
double px, py, pz;
for(i=1; i<LENGTH-1; i++) {
// Direction along pipe
dx = ax[i+1]-ax[i-1];
dy = ay[i+1]-ay[i-1];
dz = az[i+1]-az[i-1];
vector_unit(&dx, &dy, &dz);
// Direction to red cube (view point)
dmx = (mx-ax[i]);
dmy = (my-ay[i]);
dmz = (mz-az[i]);
vector_unit(&dmx, &dmy, &dmz);
// Perpendicular direction
// vector_cross(&px, &py, &pz, dmx, dmy, dmz, dx, dy, dz);
vector_cross(&px, &py, &pz, dmx, dmy, dmz, dx, dy, dz);
// Distance compensation
/*
double sx, sy, sz;
getscreenpoint(&sx, &sy, &sz, px, py, az[i], r1, r2);
px *= 1E-66*sx/az[i];
py *= 1E-66*sy/az[i];
*/
// Make points
ax1[i] = ax[i]-px*0.5;
ay1[i] = ay[i]-py*0.5;
az1[i] = az[i]-pz*0.5;
ax2[i] = ax[i]+px*0.5;
ay2[i] = ay[i]+py*0.5;
az2[i] = az[i]+pz*0.5;
}
r = 0.25;
for(i=1; i<LENGTH-2; i++) {
r = 1-r;
glBegin(GL_TRIANGLE_FAN);
glColor3f(r, r, r); glVertex3f( ax1[i] , ay1[i] , az1[i] );
glColor3f(r, r, r); glVertex3f( ax2[i] , ay2[i] , az2[i] );
glColor3f(r, r, r); glVertex3f( ax2[i+1], ay2[i+1], az2[i+1] );
glColor3f(r, r, r); glVertex3f( ax1[i+1], ay1[i+1], az1[i+1] );
glEnd();
}
}
void GameMain()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.f, 0.f, -12.f);
glRotatef(-r2*0.2, 1.0, 0.0, 0.0);
glRotatef(-r1*0.2, 0.0, 1.0, 0.0);
GameDraw();
SwapBuffers (gl_dc);
}