www.pudn.com > VC++OpenGL.rar > OLYMPIC.C


#include  
#include  
 
#include  
#include  
#include  
#include  
#include  
#include  
 
#define M_PI	3.14159265f 
 
#define sinf(x) (float)sin((x)) 
#define cosf(x) (float)cos((x)) 
#define XSIZE   100 
#define YSIZE   75 
 
#define RINGS 5 
#define BLUERING 0 
#define BLACKRING 1 
#define REDRING 2 
#define YELLOWRING 3 
#define GREENRING 4 
 
#define BACKGROUND 8 
 
enum { 
  BLACK = 0, 
  RED, 
  GREEN, 
  YELLOW, 
  BLUE, 
  MAGENTA, 
  CYAN, 
  WHITE 
}; 
 
typedef short Point[2]; 
 
GLenum directRender; 
 
unsigned char rgb_colors[RINGS][3]; 
int mapped_colors[RINGS]; 
float dests[RINGS][3]; 
float offsets[RINGS][3]; 
float angs[RINGS]; 
float rotAxis[RINGS][3]; 
int iters[RINGS]; 
GLuint theTorus; 
 
void FillTorus(float rc, int numc, float rt, int numt) 
{ 
  int i, j, k; 
  float s, t; 
  float x, y, z; 
  float pi, twopi; 
 
  pi = M_PI; 
  twopi = 2 * pi; 
 
  for (i = 0; i < numc; i++) { 
    glBegin(GL_QUAD_STRIP); 
    for (j = 0; j <= numt; j++) { 
      for (k = 1; k >= 0; k--) { 
        s = (float)((i + k) % numc + 0.5f); 
        t = (float)(j % numt); 
 
        x = cosf(t * twopi / numt) * cosf(s * twopi / numc); 
        y = sinf(t * twopi / numt) * cosf(s * twopi / numc); 
        z = sinf(s * twopi / numc); 
        glNormal3f(x, y, z); 
 
        x = (rt + rc * cosf(s * twopi / numc)) * cosf(t * twopi / numt); 
        y = (rt + rc * cosf(s * twopi / numc)) * sinf(t * twopi / numt); 
        z = rc * sinf(s * twopi / numc); 
        glVertex3f(x, y, z); 
      } 
    } 
    glEnd(); 
  } 
} 
 
float Clamp(int iters_left, float t) 
{ 
 
  if (iters_left < 3) { 
    return 0.0; 
  } 
  return (iters_left - 2) * t / iters_left; 
} 
 
void CALLBACK DrawScene(void) 
{ 
  int i; 
 
  glPushMatrix(); 
 
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
  gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0); 
 
  for (i = 0; i < RINGS; i++) { 
    glColor3ubv(rgb_colors[i]); 
    glPushMatrix(); 
    glTranslatef(dests[i][0] + offsets[i][0],  
		         dests[i][1] + offsets[i][1], 
                 dests[i][2] + offsets[i][2]); 
    glRotatef(angs[i], rotAxis[i][0], rotAxis[i][1], rotAxis[i][2]); 
    glCallList(theTorus); 
    glPopMatrix(); 
  } 
  glPopMatrix(); 
  auxSwapBuffers(); 
} 
 
void CALLBACK Idle(void) 
{ 
  int i, j; 
  int more = GL_FALSE; 
  for (i = 0; i < RINGS; i++) { 
    if (iters[i]) { 
      for (j = 0; j < 3; j++) { 
        offsets[i][j] = Clamp(iters[i], offsets[i][j]); 
      } 
      angs[i] = Clamp(iters[i], angs[i]); 
      iters[i]--; 
	  more = GL_TRUE; 
    } 
  } 
  if(more) { 
    DrawScene(); 
  } else { 
	auxIdleFunc(NULL); 
  } 
} 
 
float MyRand(void) 
{ 
  return 10.0f * ( ((float) rand())/((float) RAND_MAX) - 0.5f); 
} 
 
void ReInit(void) 
{ 
  int i; 
  float deviation; 
 
  deviation = MyRand() / 2.0f; 
  deviation = deviation * deviation; 
  for (i = 0; i < RINGS; i++) { 
    offsets[i][0] = MyRand(); 
    offsets[i][1] = MyRand(); 
    offsets[i][2] = MyRand(); 
    angs[i] = 260.0f * MyRand(); 
    rotAxis[i][0] = MyRand(); 
    rotAxis[i][1] = MyRand(); 
    rotAxis[i][2] = MyRand(); 
    iters[i] = (int)(deviation * MyRand() + 60); 
  } 
} 
 
void Init(void) 
{ 
  int i; 
  float top_y = 1.0f; 
  float bottom_y = 0.0f; 
  float top_z = 0.15f; 
  float bottom_z = 0.69f; 
  float spacing = 2.5f; 
  static float lmodel_ambient[] = {0.0f, 0.0f, 0.0f, 0.0f}; 
  static float lmodel_twoside[] = {GL_FALSE}; 
  static float lmodel_local[] = {GL_FALSE}; 
  static float light0_ambient[] = {0.1f, 0.1f, 0.1f, 1.0f}; 
  static float light0_diffuse[] = {1.0f, 1.0f, 1.0f, 0.0f}; 
  static float light0_position[] = {0.8660254f, 0.5f, 1.0f, 0.0f}; 
  static float light0_specular[] = {1.0f, 1.0f, 1.0f, 0.0f}; 
  static float bevel_mat_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f}; 
  static float bevel_mat_shininess[] = {40.0f}; 
  static float bevel_mat_specular[] = {1.0f, 1.0f, 1.0f, 0.0f}; 
  static float bevel_mat_diffuse[] = {1.0f, 0.0f, 0.0f, 0.0f}; 
 
  srand(time(NULL)); 
  ReInit(); 
  for (i = 0; i < RINGS; i++) { 
    rgb_colors[i][0] = rgb_colors[i][1] = rgb_colors[i][2] = 0; 
  } 
  rgb_colors[BLUERING][2] = 255; 
  rgb_colors[REDRING][0] = 255; 
  rgb_colors[GREENRING][1] = 255; 
  rgb_colors[YELLOWRING][0] = 255; 
  rgb_colors[YELLOWRING][1] = 255; 
  mapped_colors[BLUERING] = BLUE; 
  mapped_colors[REDRING] = RED; 
  mapped_colors[GREENRING] = GREEN; 
  mapped_colors[YELLOWRING] = YELLOW; 
  mapped_colors[BLACKRING] = BLACK; 
 
  dests[BLUERING][0] = -spacing; 
  dests[BLUERING][1] = top_y; 
  dests[BLUERING][2] = top_z; 
 
  dests[BLACKRING][0] = 0.0; 
  dests[BLACKRING][1] = top_y; 
  dests[BLACKRING][2] = top_z; 
 
  dests[REDRING][0] = spacing; 
  dests[REDRING][1] = top_y; 
  dests[REDRING][2] = top_z; 
 
  dests[YELLOWRING][0] = -spacing / 2.0f; 
  dests[YELLOWRING][1] = bottom_y; 
  dests[YELLOWRING][2] = bottom_z; 
 
  dests[GREENRING][0] = spacing / 2.0f; 
  dests[GREENRING][1] = bottom_y; 
  dests[GREENRING][2] = bottom_z; 
 
  theTorus = glGenLists(1); 
  glNewList(theTorus, GL_COMPILE); 
  FillTorus(0.1f, 8, 1.0f, 25); 
  glEndList(); 
 
  glEnable(GL_CULL_FACE); 
  glCullFace(GL_BACK); 
  glEnable(GL_DEPTH_TEST); 
  glClearDepth(1.0); 
 
  glClearColor(0.5, 0.5, 0.5, 0.0); 
  glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient); 
  glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse); 
  glLightfv(GL_LIGHT0, GL_SPECULAR, light0_specular); 
  glLightfv(GL_LIGHT0, GL_POSITION, light0_position); 
  glEnable(GL_LIGHT0); 
 
  glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_local); 
  glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside); 
  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); 
  glEnable(GL_LIGHTING); 
 
  glMaterialfv(GL_FRONT, GL_AMBIENT, bevel_mat_ambient); 
  glMaterialfv(GL_FRONT, GL_SHININESS, bevel_mat_shininess); 
  glMaterialfv(GL_FRONT, GL_SPECULAR, bevel_mat_specular); 
  glMaterialfv(GL_FRONT, GL_DIFFUSE, bevel_mat_diffuse); 
 
  glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); 
  glEnable(GL_COLOR_MATERIAL); 
  glShadeModel(GL_SMOOTH); 
  
  glMatrixMode(GL_PROJECTION); 
  gluPerspective(45, 1.33, 0.1, 100.0); 
  glMatrixMode(GL_MODELVIEW); 
} 
 
void CALLBACK Reshape(int width, int height) 
{ 
  glViewport(0, 0, width, height); 
} 
 
void main(int argc, char **argv) 
{ 
  auxInitPosition(0, 0, 400, 300); 
  auxInitDisplayMode(AUX_RGB|AUX_DOUBLE); 
  auxInitWindow("Olympic"); 
  Init(); 
  auxReshapeFunc(Reshape); 
  auxIdleFunc(Idle); 
  auxMainLoop(DrawScene); 
}