home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / mesa-1.2.8 / samples / fog.c < prev    next >
C/C++ Source or Header  |  1996-05-27  |  7KB  |  300 lines

  1. /*
  2.  * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
  3.  *
  4.  * Permission to use, copy, modify, distribute, and sell this software and
  5.  * its documentation for any purpose is hereby granted without fee, provided
  6.  * that (i) the above copyright notices and this permission notice appear in
  7.  * all copies of the software and related documentation, and (ii) the name of
  8.  * Silicon Graphics may not be used in any advertising or
  9.  * publicity relating to the software without the specific, prior written
  10.  * permission of Silicon Graphics.
  11.  *
  12.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
  13.  * ANY KIND,
  14.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
  15.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  16.  *
  17.  * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
  18.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  19.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  20.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
  21.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  22.  * OF THIS SOFTWARE.
  23.  */
  24.  
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <stdlib.h>
  28. #include "gltk.h"
  29.  
  30.  
  31. GLenum rgb, doubleBuffer, directRender;
  32.  
  33. double plane[4] = {
  34.     1.0, 0.0, -1.0, 0.0
  35. };
  36. float rotX = 5.0, rotY = -5.0, zTranslate = -65.0;
  37. float fogDensity = 0.02;
  38. GLint cubeList = 1;
  39.  
  40. float scp[18][3] = {
  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.     -0.707107, -0.707107, 0.000000
  73.     },    
  74.     {
  75.     -0.707107, -0.707107, 5.000000
  76.     },
  77.     {
  78.     0.000000, -1.000000, 0.000000
  79.     },    
  80.     {
  81.     0.000000, -1.000000, 5.000000
  82.     },
  83.     {
  84.     0.707107, -0.707107, 0.000000
  85.     },    
  86.     {
  87.     0.707107, -0.707107, 5.000000
  88.     },
  89.     {
  90.     1.000000, 0.000000, 0.000000
  91.     },    
  92.     {
  93.     1.000000, 0.000000, 5.000000
  94.     },
  95. };
  96.  
  97.  
  98. static void Build_lists(void)
  99. {
  100.  
  101.     glNewList(cubeList, GL_COMPILE);
  102.     glBegin(GL_TRIANGLE_STRIP);
  103.        glNormal3fv(scp[0]); glVertex3fv(scp[0]);
  104.        glNormal3fv(scp[0]); glVertex3fv(scp[1]);
  105.        glNormal3fv(scp[2]); glVertex3fv(scp[2]);
  106.        glNormal3fv(scp[2]); glVertex3fv(scp[3]);
  107.        glNormal3fv(scp[4]); glVertex3fv(scp[4]);
  108.        glNormal3fv(scp[4]); glVertex3fv(scp[5]);
  109.        glNormal3fv(scp[6]); glVertex3fv(scp[6]);
  110.        glNormal3fv(scp[6]); glVertex3fv(scp[7]);
  111.        glNormal3fv(scp[8]); glVertex3fv(scp[8]);
  112.        glNormal3fv(scp[8]); glVertex3fv(scp[9]);
  113.        glNormal3fv(scp[10]); glVertex3fv(scp[10]);
  114.        glNormal3fv(scp[10]); glVertex3fv(scp[11]);
  115.        glNormal3fv(scp[12]); glVertex3fv(scp[12]);
  116.        glNormal3fv(scp[12]); glVertex3fv(scp[13]);
  117.        glNormal3fv(scp[14]); glVertex3fv(scp[14]);
  118.        glNormal3fv(scp[14]); glVertex3fv(scp[15]);
  119.        glNormal3fv(scp[16]); glVertex3fv(scp[16]);
  120.        glNormal3fv(scp[16]); glVertex3fv(scp[17]);
  121.     glEnd();
  122.     glEndList();
  123. }
  124.  
  125. static void Init(void)
  126. {
  127.     static float ambient[] = {0.1, 0.1, 0.1, 1.0};
  128.     static float diffuse[] = {1.0, 1.0, 1.0, 1.0};
  129.     static float position[] = {90.0, 90.0, 0.0, 0.0};
  130.     static float front_mat_shininess[] = {30.0};
  131.     static float front_mat_specular[] = {0.0, 0.0, 0.0, 1.0};
  132.     static float front_mat_diffuse[] = {0.0, 1.0, 0.0, 1.0};
  133.     static float back_mat_shininess[] = {50.0};
  134.     static float back_mat_specular[] = {0.0, 0.0, 1.0, 1.0};
  135.     static float back_mat_diffuse[] = {1.0, 0.0, 0.0, 1.0};
  136.     static float lmodel_ambient[] = {0.0, 0.0, 0.0, 1.0};
  137.     static float fog_color[] = {0.8, 0.8, 0.8, 1.0};
  138.     
  139.     glFrontFace(GL_CW);
  140.  
  141.     glEnable(GL_DEPTH_TEST);
  142.  
  143.     glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  144.     glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  145.     glLightfv(GL_LIGHT0, GL_POSITION, position);
  146.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  147.     glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
  148.     glEnable(GL_LIGHTING);
  149.     glEnable(GL_LIGHT0);
  150.     
  151.     glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
  152.     glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
  153.     glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
  154.     glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
  155.     glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
  156.     glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
  157.  
  158.     glEnable(GL_FOG);
  159.     glFogi(GL_FOG_MODE, GL_EXP);
  160.     glFogf(GL_FOG_DENSITY, fogDensity);
  161.     if (rgb) {
  162.     glFogfv(GL_FOG_COLOR, fog_color);
  163.     glClearColor(0.8, 0.8, 0.8, 1.0);
  164.     } else {
  165.     glFogi(GL_FOG_INDEX, 1<<5);
  166.     tkSetFogRamp(5, 3);
  167.     glClearIndex(128);
  168.     }
  169.  
  170.     Build_lists();
  171. }
  172.  
  173. static void Reshape(int width, int height)
  174. {
  175.  
  176.     glViewport(0, 0, (GLint)width, (GLint)height);
  177.  
  178.     glMatrixMode(GL_PROJECTION);
  179.     glLoadIdentity();
  180.     gluPerspective(45.0, 1.0, 1.0, 200.0);
  181.     glMatrixMode(GL_MODELVIEW);
  182. }
  183.  
  184. static GLenum Key(int key, GLenum mask)
  185. {
  186.  
  187.     switch (key) {
  188.       case TK_ESCAPE:
  189.     tkQuit();
  190.       case TK_UP:
  191.     rotX -= 5;
  192.     break;
  193.       case TK_DOWN:
  194.     rotX += 5;
  195.     break;
  196.       case TK_LEFT:
  197.     rotY -= 5;
  198.     break;
  199.       case TK_RIGHT:
  200.     rotY += 5;
  201.     break;
  202.       case TK_D:
  203.     if (rgb) {
  204.         fogDensity *= 1.10;
  205.         glFogf(GL_FOG_DENSITY, fogDensity);
  206.     }
  207.     break;
  208.       case TK_d:
  209.     if (rgb) {
  210.         fogDensity /= 1.10;
  211.         glFogf(GL_FOG_DENSITY, fogDensity);
  212.     }
  213.     break;
  214.       default:
  215.     return GL_FALSE;
  216.     }
  217.     return GL_TRUE;
  218. }
  219.  
  220. static void Draw(void)
  221. {
  222.  
  223.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  224.  
  225.     glPushMatrix();
  226.  
  227.     glTranslatef(0, 0, zTranslate);
  228.     glRotatef(rotY, 0,1,0);
  229.     glRotatef(rotX, 1,0,0);
  230.     glScalef(1.0, 1.0, 10.0);
  231.  
  232.     glCallList(cubeList);
  233.  
  234.     glPopMatrix();
  235.  
  236.     glFlush();
  237.  
  238.     if (doubleBuffer) {
  239.     tkSwapBuffers();
  240.     }
  241. }
  242.  
  243. static GLenum Args(int argc, char **argv)
  244. {
  245.     GLint i;
  246.  
  247.     rgb = GL_TRUE;
  248.     doubleBuffer = GL_FALSE;
  249.     directRender = GL_TRUE;
  250.  
  251.     for (i = 1; i < argc; i++) {
  252.     if (strcmp(argv[i], "-ci") == 0) {
  253.         rgb = GL_FALSE;
  254.     } else if (strcmp(argv[i], "-rgb") == 0) {
  255.         rgb = GL_TRUE;
  256.     } else if (strcmp(argv[i], "-sb") == 0) {
  257.         doubleBuffer = GL_FALSE;
  258.     } else if (strcmp(argv[i], "-db") == 0) {
  259.         doubleBuffer = GL_TRUE;
  260.     } else if (strcmp(argv[i], "-dr") == 0) {
  261.         directRender = GL_TRUE;
  262.     } else if (strcmp(argv[i], "-ir") == 0) {
  263.         directRender = GL_FALSE;
  264.     } else {
  265.         printf("%s (Bad option).\n", argv[i]);
  266.         return GL_FALSE;
  267.     }
  268.     }
  269.     return GL_TRUE;
  270. }
  271.  
  272. void main(int argc, char **argv)
  273. {
  274.     GLenum type;
  275.  
  276.     if (Args(argc, argv) == GL_FALSE) {
  277.     tkQuit();
  278.     }
  279.  
  280.     tkInitPosition(0, 0, 300, 300);
  281.  
  282.     type = TK_DEPTH;
  283.     type |= (rgb) ? TK_RGB : TK_INDEX;
  284.     type |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  285.     type |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  286.     tkInitDisplayMode(type);
  287.  
  288.     if (tkInitWindow("Fog Test") == GL_FALSE) {
  289.     tkQuit();
  290.     }
  291.  
  292.     Init();
  293.  
  294.     tkExposeFunc(Reshape);
  295.     tkReshapeFunc(Reshape);
  296.     tkKeyDownFunc(Key);
  297.     tkDisplayFunc(Draw);
  298.     tkExec();
  299. }
  300.