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);
}