home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / OpenGL 1.0 SDK / Source / Examples / aux / samples / fog.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-18  |  5.8 KB  |  270 lines  |  [TEXT/CWIE]

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include "tk.h"
  5.  
  6.  
  7. GLenum rgb, doubleBuffer, directRender;
  8.  
  9. double plane[4] = {
  10.     1.0, 0.0, -1.0, 0.0
  11. };
  12. float rotX = 5.0, rotY = -5.0, zTranslate = -65.0;
  13. float fogDensity = 0.02;
  14. GLint cubeList = 1;
  15.  
  16. float scp[18][3] = {
  17.     {
  18.     1.000000, 0.000000, 0.000000
  19.     },    
  20.     {
  21.     1.000000, 0.000000, 5.000000
  22.     },
  23.     {
  24.     0.707107, 0.707107, 0.000000
  25.     },    
  26.     {
  27.     0.707107, 0.707107, 5.000000
  28.     },
  29.     {
  30.     0.000000, 1.000000, 0.000000
  31.     },    
  32.     {
  33.     0.000000, 1.000000, 5.000000
  34.     },
  35.     {
  36.     -0.707107, 0.707107, 0.000000
  37.     },    
  38.     {
  39.     -0.707107, 0.707107, 5.000000
  40.     },
  41.     {
  42.     -1.000000, 0.000000, 0.000000
  43.     },    
  44.     {
  45.     -1.000000, 0.000000, 5.000000
  46.     },
  47.     {
  48.     -0.707107, -0.707107, 0.000000
  49.     },    
  50.     {
  51.     -0.707107, -0.707107, 5.000000
  52.     },
  53.     {
  54.     0.000000, -1.000000, 0.000000
  55.     },    
  56.     {
  57.     0.000000, -1.000000, 5.000000
  58.     },
  59.     {
  60.     0.707107, -0.707107, 0.000000
  61.     },    
  62.     {
  63.     0.707107, -0.707107, 5.000000
  64.     },
  65.     {
  66.     1.000000, 0.000000, 0.000000
  67.     },    
  68.     {
  69.     1.000000, 0.000000, 5.000000
  70.     },
  71. };
  72.  
  73.  
  74. static void Build_lists(void)
  75. {
  76.  
  77.     glNewList(cubeList, GL_COMPILE);
  78.     glBegin(GL_TRIANGLE_STRIP);
  79.        glNormal3fv(scp[0]); glVertex3fv(scp[0]);
  80.        glNormal3fv(scp[0]); glVertex3fv(scp[1]);
  81.        glNormal3fv(scp[2]); glVertex3fv(scp[2]);
  82.        glNormal3fv(scp[2]); glVertex3fv(scp[3]);
  83.        glNormal3fv(scp[4]); glVertex3fv(scp[4]);
  84.        glNormal3fv(scp[4]); glVertex3fv(scp[5]);
  85.        glNormal3fv(scp[6]); glVertex3fv(scp[6]);
  86.        glNormal3fv(scp[6]); glVertex3fv(scp[7]);
  87.        glNormal3fv(scp[8]); glVertex3fv(scp[8]);
  88.        glNormal3fv(scp[8]); glVertex3fv(scp[9]);
  89.        glNormal3fv(scp[10]); glVertex3fv(scp[10]);
  90.        glNormal3fv(scp[10]); glVertex3fv(scp[11]);
  91.        glNormal3fv(scp[12]); glVertex3fv(scp[12]);
  92.        glNormal3fv(scp[12]); glVertex3fv(scp[13]);
  93.        glNormal3fv(scp[14]); glVertex3fv(scp[14]);
  94.        glNormal3fv(scp[14]); glVertex3fv(scp[15]);
  95.        glNormal3fv(scp[16]); glVertex3fv(scp[16]);
  96.        glNormal3fv(scp[16]); glVertex3fv(scp[17]);
  97.     glEnd();
  98.     glEndList();
  99. }
  100.  
  101. static void Init(void)
  102. {
  103.     static float ambient[] = {0.1, 0.1, 0.1, 1.0};
  104.     static float diffuse[] = {1.0, 1.0, 1.0, 1.0};
  105.     static float position[] = {90.0, 90.0, 0.0, 0.0};
  106.     static float front_mat_shininess[] = {30.0};
  107.     static float front_mat_specular[] = {0.0, 0.0, 0.0, 1.0};
  108.     static float front_mat_diffuse[] = {0.0, 1.0, 0.0, 1.0};
  109.     static float back_mat_shininess[] = {50.0};
  110.     static float back_mat_specular[] = {0.0, 0.0, 1.0, 1.0};
  111.     static float back_mat_diffuse[] = {1.0, 0.0, 0.0, 1.0};
  112.     static float lmodel_ambient[] = {0.0, 0.0, 0.0, 1.0};
  113.     static float fog_color[] = {0.8, 0.8, 0.8, 1.0};
  114.     
  115.     glFrontFace(GL_CW);
  116.  
  117.     glEnable(GL_DEPTH_TEST);
  118.     
  119.     glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  120.     glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  121.     glLightfv(GL_LIGHT0, GL_POSITION, position);
  122.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  123.     glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
  124.     glEnable(GL_LIGHTING);
  125.     glEnable(GL_LIGHT0);
  126.     
  127.     glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
  128.     glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
  129.     glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
  130.     glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
  131.     glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
  132.     glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
  133.  
  134.     glEnable(GL_FOG);
  135.     glFogi(GL_FOG_MODE, GL_EXP);
  136.     glFogf(GL_FOG_DENSITY, fogDensity);
  137.     
  138.     if (rgb) {
  139.     glFogfv(GL_FOG_COLOR, fog_color);
  140.     glClearColor(0.8, 0.8, 0.8, 1.0);
  141.     } else {
  142.     glFogi(GL_FOG_INDEX, 1<<5);
  143.     tkSetFogRamp(5, 3);
  144.     glClearIndex(128);
  145.     }
  146.     
  147.     Build_lists();
  148. }
  149.  
  150. static void Reshape(int width, int height)
  151. {
  152.  
  153.     glViewport(0, 0, (GLint)width, (GLint)height);
  154.  
  155.     glMatrixMode(GL_PROJECTION);
  156.     glLoadIdentity();
  157.     gluPerspective(45.0, 1.0, 10.0, 150.0);
  158.     glMatrixMode(GL_MODELVIEW);
  159. }
  160.  
  161. static GLenum Key(int key, GLenum mask)
  162. {
  163.  
  164.     switch (key) {
  165.       case TK_ESCAPE:
  166.     tkQuit();
  167.       case TK_UP:
  168.     rotX -= 5;
  169.     break;
  170.       case TK_DOWN:
  171.     rotX += 5;
  172.     break;
  173.       case TK_LEFT:
  174.     rotY -= 5;
  175.     break;
  176.       case TK_RIGHT:
  177.     rotY += 5;
  178.     break;
  179.       case TK_D:
  180.     fogDensity *= 1.10;
  181.     glFogf(GL_FOG_DENSITY, fogDensity);
  182.     break;
  183.       case TK_d:
  184.     fogDensity /= 1.10;
  185.     glFogf(GL_FOG_DENSITY, fogDensity);
  186.     break;
  187.       default:
  188.     return GL_FALSE;
  189.     }
  190.     return GL_TRUE;
  191. }
  192.  
  193. static void Draw(void)
  194. {
  195.     glDisable(GL_DITHER);
  196.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  197.     glEnable(GL_DITHER);
  198.  
  199.     glPushMatrix();
  200.  
  201.     glTranslatef(0, 0, zTranslate);
  202.     glRotatef(rotY, 0,1,0);
  203.     glRotatef(rotX, 1,0,0);
  204.     glScalef(1.0, 1.0, 10.0);
  205.  
  206.     glCallList(cubeList);
  207.  
  208.     glPopMatrix();
  209.  
  210.     tkSwapBuffers();
  211. }
  212.  
  213. static GLenum Args(int argc, char **argv)
  214. {
  215.     GLint i;
  216.  
  217.     rgb = GL_TRUE;
  218.     doubleBuffer = GL_TRUE;
  219.     directRender = GL_TRUE;
  220.  
  221.     for (i = 1; i < argc; i++) {
  222.     if (strcmp(argv[i], "-ci") == 0) {
  223.         rgb = GL_FALSE;
  224.     } else if (strcmp(argv[i], "-rgb") == 0) {
  225.         rgb = GL_TRUE;
  226.     } else if (strcmp(argv[i], "-sb") == 0) {
  227.         doubleBuffer = GL_FALSE;
  228.     } else if (strcmp(argv[i], "-db") == 0) {
  229.         doubleBuffer = GL_TRUE;
  230.     } else if (strcmp(argv[i], "-dr") == 0) {
  231.         directRender = GL_TRUE;
  232.     } else if (strcmp(argv[i], "-ir") == 0) {
  233.         directRender = GL_FALSE;
  234.     } else {
  235.         printf("%s (Bad option).\n", argv[i]);
  236.         return GL_FALSE;
  237.     }
  238.     }
  239.     return GL_TRUE;
  240. }
  241.  
  242. void main(int argc, char **argv)
  243. {
  244.     GLenum type;
  245.  
  246.     if (Args(argc, argv) == GL_FALSE) {
  247.     tkQuit();
  248.     }
  249.  
  250.     tkInitPosition(30, 60, 300, 300);
  251.  
  252.     type = TK_DEPTH;
  253.     type |= (rgb) ? TK_RGB : TK_INDEX;
  254.     type |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  255.     type |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  256.     tkInitDisplayMode(type);
  257.  
  258.     if (tkInitWindow("Fog Test") == GL_FALSE) {
  259.     tkQuit();
  260.     }
  261.  
  262.     Init();
  263.  
  264.     tkExposeFunc(Reshape);
  265.     tkReshapeFunc(Reshape);
  266.     tkKeyDownFunc(Key);
  267.     tkDisplayFunc(Draw);
  268.     tkExec();
  269. }
  270.