multialphablend.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:4k
源码类别:

GIS编程

开发平台:

Visual C++

  1. #include <assert.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <GL/glut.h>
  6. GLUquadricObj *cone, *base, *qsphere;
  7. #ifndef __sgi
  8. #define trunc(x) ((double)((int)(x)))
  9. #endif
  10. void init(void)
  11. {
  12.   static GLfloat lightpos[] = {.5, .75, 1.5, 1};
  13.   glEnable(GL_DEPTH_TEST); 
  14.   glEnable(GL_LIGHTING);
  15.   glEnable(GL_LIGHT0);
  16.   glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  17.   cone = gluNewQuadric();
  18.   base = gluNewQuadric();
  19.   qsphere = gluNewQuadric();
  20.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  21. }
  22. void reshape(GLsizei w, GLsizei h) 
  23. {
  24.   glViewport(0, 0, w, h);
  25.   
  26.   glMatrixMode(GL_PROJECTION);
  27.   glLoadIdentity();
  28.   gluPerspective(60, 1, .01, 10);
  29.   gluLookAt(0, 0, 2.577, 0, 0, -5, 0, 1, 0);
  30.   
  31.   glMatrixMode(GL_MODELVIEW);
  32.   glLoadIdentity();
  33. }
  34. void draw_room(void)
  35. {
  36.   /* material for the walls, floor, ceiling */
  37.   static GLfloat wall_mat[] = {1.f, 1.f, 1.f, 1.f};
  38.   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, wall_mat);
  39.   glBegin(GL_QUADS);
  40.   
  41.   /* floor */
  42.   glNormal3f(0, 1, 0);
  43.   glVertex3f(-1, -1, 1);
  44.   glVertex3f(1, -1, 1);
  45.   glVertex3f(1, -1, -1);
  46.   glVertex3f(-1, -1, -1);
  47.   /* ceiling */
  48.   glNormal3f(0, -1, 0);
  49.   glVertex3f(-1, 1, -1);
  50.   glVertex3f(1, 1, -1);
  51.   glVertex3f(1, 1, 1);
  52.   glVertex3f(-1, 1, 1);  
  53.   /* left wall */
  54.   glNormal3f(1, 0, 0);
  55.   glVertex3f(-1, -1, -1);
  56.   glVertex3f(-1, -1, 1);
  57.   glVertex3f(-1, 1, 1);
  58.   glVertex3f(-1, 1, -1);
  59.   /* right wall */
  60.   glNormal3f(-1, 0, 0);
  61.   glVertex3f(1, 1, -1);
  62.   glVertex3f(1, 1, 1);
  63.   glVertex3f(1, -1, 1);
  64.   glVertex3f(1, -1, -1);
  65.   /* far wall */
  66.   glNormal3f(0, 0, 1);
  67.   glVertex3f(-1, -1, -1);
  68.   glVertex3f(1, -1, -1);
  69.   glVertex3f(1, 1, -1);
  70.   glVertex3f(-1, 1, -1);
  71.   glEnd();
  72. }
  73. void draw_cone(void)
  74. {
  75.   static GLfloat cone_mat[] = {0.f, .5f, 1.f, .5f};
  76.   glPushMatrix();
  77.   glTranslatef(0, -1, 0);
  78.   glRotatef(-90, 1, 0, 0);
  79.   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cone_mat);
  80.   /* base is coplanar with floor, so turn off depth testing */
  81.   glDisable(GL_DEPTH_TEST);
  82.   gluDisk(base, 0., .3, 20, 1); 
  83.   glEnable(GL_DEPTH_TEST);
  84.   gluCylinder(cone, .3, 0, 1.25, 20, 1);
  85.   glPopMatrix();
  86. }
  87. void draw_sphere(GLdouble angle)
  88. {
  89.   static GLfloat sphere_mat[] = {1.f, .5f, 0.f, .5f};
  90.   glPushMatrix();
  91.   glTranslatef(0, -.3, 0);
  92.   glRotatef(angle, 0, 1, 0);
  93.   glTranslatef(.6, 0, 0);
  94.   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, sphere_mat);
  95.   gluSphere(qsphere, .3, 20, 20);
  96.   glPopMatrix();
  97. }
  98. GLdouble get_secs(void)
  99. {
  100.     return glutGet(GLUT_ELAPSED_TIME) / 1000.0;
  101. }
  102. void draw(void)
  103. {
  104.     GLenum err;
  105.     GLdouble secs, degrees;
  106.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  107.     /* one revolution every 10 seconds... */
  108.     secs = get_secs();
  109.     secs = secs - 10.*trunc(secs / 10.);
  110.     degrees = (secs/10.) * (360.);
  111.     draw_room();
  112.     glEnable(GL_BLEND);
  113.     glEnable(GL_CULL_FACE);
  114.     if (degrees < 180) {
  115.       /* sphere behind cone */
  116.       glCullFace(GL_FRONT);
  117.       draw_sphere(degrees);
  118.       draw_cone();
  119.       glCullFace(GL_BACK);
  120.       draw_sphere(degrees);
  121.       draw_cone();
  122.     } else {
  123.       /* cone behind sphere */
  124.       glCullFace(GL_FRONT);
  125.       draw_cone();
  126.       draw_sphere(degrees);
  127.       glCullFace(GL_BACK);
  128.       draw_cone();
  129.       draw_sphere(degrees);
  130.     }
  131.     glDisable(GL_CULL_FACE);
  132.     glDisable(GL_BLEND);
  133.     err = glGetError();
  134.     if (err != GL_NO_ERROR) printf("Error:  %sn", gluErrorString(err));
  135.     glutSwapBuffers();
  136. }
  137. /* ARGSUSED1 */
  138. void key(unsigned char key, int x, int y)
  139. {
  140.   static int idle = 1;
  141.   if (key == 27) exit(0);
  142.   idle = (idle == 0);
  143.   if (idle) {
  144.     glutIdleFunc(draw);
  145.   } else {
  146.     glutIdleFunc(0);
  147.   }
  148. }
  149. main(int argc, char *argv[])
  150. {
  151.     glutInit(&argc, argv);
  152.     glutInitWindowSize(256, 256);
  153.     glutInitWindowPosition(0, 0);
  154.     glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
  155.     glutCreateWindow(argv[0]);
  156.     glutDisplayFunc(draw);
  157.     glutIdleFunc(draw);
  158.     glutKeyboardFunc(key);
  159.     glutReshapeFunc(reshape);
  160.     init();
  161.     glutMainLoop();
  162.     return 0;
  163. }