home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / newopg.zip / FOG.C < prev    next >
Text File  |  1995-03-04  |  6KB  |  275 lines

  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. GLdouble 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.     if (rgb) {
  138.     glFogfv(GL_FOG_COLOR, fog_color);
  139.     glClearColor(0.8, 0.8, 0.8, 1.0);
  140.     } else {
  141.     glFogi(GL_FOG_INDEX, 1<<5);
  142.     tkSetFogRamp(5, 3);
  143.     glClearIndex(128);
  144.     }
  145.  
  146.     Build_lists();
  147. }
  148.  
  149. static void Reshape(int width, int height)
  150. {
  151.  
  152.     glViewport(0, 0, (GLint)width, (GLint)height);
  153.  
  154.     glMatrixMode(GL_PROJECTION);
  155.     glLoadIdentity();
  156.     gluPerspective(45.0, 1.0, 1.0, 200.0);
  157.     glMatrixMode(GL_MODELVIEW);
  158. }
  159.  
  160. static GLenum Key(int key, GLenum mask)
  161. {
  162.  
  163.     switch (key) {
  164.       case TK_B:
  165.     tkClipBoard();
  166.     break;
  167.       case TK_ESCAPE:
  168.     tkQuit();
  169.       case TK_UP:
  170.     rotX -= 5;
  171.     break;
  172.       case TK_DOWN:
  173.     rotX += 5;
  174.     break;
  175.       case TK_LEFT:
  176.     rotY -= 5;
  177.     break;
  178.       case TK_RIGHT:
  179.     rotY += 5;
  180.     break;
  181.       case TK_D:
  182.     fogDensity *= 1.10;
  183.     glFogf(GL_FOG_DENSITY, fogDensity);
  184.     break;
  185.       case TK_d:
  186.     fogDensity /= 1.10;
  187.     glFogf(GL_FOG_DENSITY, fogDensity);
  188.     break;
  189.       default:
  190.     return GL_FALSE;
  191.     }
  192.     return GL_TRUE;
  193. }
  194.  
  195. static void Draw(void)
  196. {
  197.  
  198.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  199.  
  200.     glPushMatrix();
  201.  
  202.     glTranslatef(0, 0, zTranslate);
  203.     glRotatef(rotY, 0,1,0);
  204.     glRotatef(rotX, 1,0,0);
  205.     glScalef(1.0, 1.0, 10.0);
  206.  
  207.     glCallList(cubeList);
  208.  
  209.     glPopMatrix();
  210.  
  211.     glFlush();
  212.  
  213.     if (doubleBuffer) {
  214.     tkSwapBuffers();
  215.     }
  216. }
  217.  
  218. static GLenum Args(int argc, char **argv)
  219. {
  220.     GLint i;
  221.  
  222.     rgb = GL_TRUE;
  223.     doubleBuffer = GL_FALSE;
  224.     directRender = GL_TRUE;
  225.  
  226.     for (i = 1; i < argc; i++) {
  227.     if (strcmp(argv[i], "-ci") == 0) {
  228.         rgb = GL_FALSE;
  229.     } else if (strcmp(argv[i], "-rgb") == 0) {
  230.         rgb = GL_TRUE;
  231.     } else if (strcmp(argv[i], "-sb") == 0) {
  232.         doubleBuffer = GL_FALSE;
  233.     } else if (strcmp(argv[i], "-db") == 0) {
  234.         doubleBuffer = GL_TRUE;
  235.     } else if (strcmp(argv[i], "-dr") == 0) {
  236.         directRender = GL_TRUE;
  237.     } else if (strcmp(argv[i], "-ir") == 0) {
  238.         directRender = GL_FALSE;
  239.     } else {
  240.         printf("%s (Bad option).\n", argv[i]);
  241.         return GL_FALSE;
  242.     }
  243.     }
  244.     return GL_TRUE;
  245. }
  246.  
  247. void main(int argc, char **argv)
  248. {
  249.     GLenum type;
  250.  
  251.     if (Args(argc, argv) == GL_FALSE) {
  252.     tkQuit();
  253.     }
  254.  
  255.     tkInitPosition(0, 0, 300, 300);
  256.  
  257.     type = TK_DEPTH;
  258.     type |= (rgb) ? TK_RGB : TK_INDEX;
  259.     type |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  260.     type |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  261.     tkInitDisplayMode(type);
  262.  
  263.     if (tkInitWindow("Fog Test") == GL_FALSE) {
  264.     tkQuit();
  265.     }
  266.  
  267.     Init();
  268.  
  269.     tkExposeFunc(Reshape);
  270.     tkReshapeFunc(Reshape);
  271.     tkKeyDownFunc(Key);
  272.     tkDisplayFunc(Draw);
  273.     tkExec();
  274. }
  275.