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

GIS编程

开发平台:

Visual C++

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <GL/glut.h>
  5. #include "skyfly.h"
  6. void init_misc(void);
  7. void init_skyfly(void);
  8. void sim_singlechannel(void);
  9. void cull_proc(void);
  10. void draw_proc(void);
  11. #define SKY_R 0.23f
  12. #define SKY_G 0.35f
  13. #define SKY_B 0.78f
  14. #define TERR_DARK_R 0.27f
  15. #define TERR_DARK_G 0.18f
  16. #define TERR_DARK_B 0.00f
  17. #define TERR_LITE_R 0.24f
  18. #define TERR_LITE_G 0.53f
  19. #define TERR_LITE_B 0.05f
  20. typedef struct {
  21.   unsigned char red;
  22.   unsigned char green;
  23.   unsigned char blue;
  24. } palette_t;
  25. palette_t       pal[256];
  26. static int buttons[BUTCOUNT] = { 0 };
  27. static int mouse_x, mouse_y;
  28. GLboolean show_timer = GL_FALSE;
  29. GLboolean fullscreen = GL_FALSE;
  30. int Xgetbutton(int button)
  31. {
  32.         int b;
  33.         if (button < 0 || button >= BUTCOUNT)
  34.                 return -1;
  35.         b = buttons[button];
  36.         if (button < LEFTMOUSE)
  37.                 buttons[button] = 0;
  38.         return b;
  39. }
  40. int Xgetvaluator(int val)
  41. {
  42.     switch (val) {
  43.                 case MOUSEX:
  44.                         return mouse_x;
  45.                 case MOUSEY:
  46.                         return mouse_y;
  47.                 default:
  48.                         return -1;
  49.         }
  50. }
  51. void setPaletteIndex(int i, GLfloat r, GLfloat g, GLfloat b)
  52. {
  53. pal[i].red = (255.0F * r);
  54. pal[i].green = (255.0F * g);
  55. pal[i].blue = (255.0F * b);      
  56. }                                                           
  57. void init_cmap(void)
  58. {
  59. int  ii, jj, color;
  60.     GLfloat  r0, g0, b0, r1, g1, b1;
  61.     /* Set up color map */
  62. color = 10;
  63. memset(pal,0,sizeof(pal));
  64.     /* Sky colors */
  65.     sky_base = color;
  66.     r0 = SKY_R; r1 = 1.0f;
  67.     g0 = SKY_G; g1 = 1.0f;
  68.     b0 = SKY_B; b1 = 1.0f;
  69.     for (ii = 0; ii < SKY_COLORS; ii++) {
  70.         GLfloat p, r, g, b;
  71.         p = (GLfloat) ii / (SKY_COLORS-1);
  72.         r = r0 + p * (r1 - r0);
  73.         g = g0 + p * (g1 - g0);
  74.         b = b0 + p * (b1 - b0);
  75.         for (jj = 0; jj < FOG_LEVELS; jj++) {
  76.             GLfloat fp, fr, fg, fb;
  77.             fp = (FOG_LEVELS > 1) ? (GLfloat) jj / (FOG_LEVELS-1) : 0.0f;
  78.             fr = r + fp * (fog_params[0] - r);
  79.             fg = g + fp * (fog_params[1] - g);
  80.             fb = b + fp * (fog_params[2] - b);
  81.             setPaletteIndex(sky_base + (ii*FOG_LEVELS) + jj, fr, fg, fb);
  82.         }
  83.     }
  84.     color += (SKY_COLORS * FOG_LEVELS);
  85.     /* Terrain colors */
  86.     terr_base = color;
  87.     r0 = TERR_DARK_R;   r1 = TERR_LITE_R;
  88.     g0 = TERR_DARK_G;   g1 = TERR_LITE_G;
  89.     b0 = TERR_DARK_B;   b1 = TERR_LITE_B;
  90.     for (ii = 0; ii < TERR_COLORS; ii++) {
  91.         GLfloat p, r, g, b;
  92.         p = (GLfloat) ii / (TERR_COLORS-1);
  93.         r = r0 + p * (r1 - r0);
  94.         g = g0 + p * (g1 - g0);
  95.         b = b0 + p * (b1 - b0);
  96.         for (jj = 0; jj < FOG_LEVELS; jj++) {
  97.             GLfloat fp, fr, fg, fb;
  98.             fp = (FOG_LEVELS > 1) ? (GLfloat) jj / (FOG_LEVELS-1) : 0.0f;
  99.             fr = r + fp * (fog_params[0] - r);
  100.             fg = g + fp * (fog_params[1] - g);
  101.             fb = b + fp * (fog_params[2] - b);
  102.             setPaletteIndex(terr_base + (ii*FOG_LEVELS) + jj, fr, fg, fb);
  103.         }
  104. }
  105.     color += (TERR_COLORS * FOG_LEVELS);
  106.     /* Plane colors */
  107.     plane_colors[0] = color;
  108.     plane_colors[1] = color + (PLANE_COLORS/2);
  109.     plane_colors[2] = color + (PLANE_COLORS-1);
  110.     r0 = 0.4; r1 = 0.8;
  111.     g0 = 0.4; g1 = 0.8;
  112.     b0 = 0.1; b1 = 0.1;
  113.     for (ii = 0; ii < PLANE_COLORS; ii++) {
  114.         GLfloat p, r, g, b;
  115.         p = (GLfloat) ii / (PLANE_COLORS);
  116.         r = r0 + p * (r1 - r0);
  117.         g = g0 + p * (g1 - g0);
  118.         b = b0 + p * (b1 - b0);
  119.         setPaletteIndex(plane_colors[0] + ii, r, g, b);
  120.     }
  121. color += PLANE_COLORS;
  122. #if 0
  123. GM_setPalette(pal,256,0);
  124. GM_realizePalette(256,0,true);
  125. #endif
  126. }
  127. void draw(void);
  128. void gameLogic(void)
  129. {
  130. sim_singlechannel();
  131.         draw();
  132. }
  133. /* When not visible, stop animating.  Restart when visible again. */
  134. static void 
  135. visible(int vis)
  136. {
  137.   if (vis == GLUT_VISIBLE) {
  138.     glutIdleFunc(gameLogic);
  139.   } else {
  140.     glutIdleFunc(NULL);
  141.   }
  142. }
  143. int                 lastCount;      /* Timer count for last fps update */
  144. int                 frameCount;     /* Number of frames for timing */
  145. int                 fpsRate;        /* Current frames per second rate */
  146. void draw(void)
  147. {
  148.     int   newCount;
  149.     char    buf[20];
  150.     int   i, len;
  151.     /* Draw the frame */
  152.     cull_proc();
  153.     draw_proc();
  154.     /* Update the frames per second count if we have gone past at least
  155.        a quarter of a second since the last update. */
  156.     newCount = glutGet(GLUT_ELAPSED_TIME);
  157.     frameCount++;
  158.     if ((newCount - lastCount) > 1000) {
  159.         fpsRate = (int) ((10000.0f / (newCount - lastCount)) * frameCount);
  160.         lastCount = newCount;
  161.         frameCount = 0;
  162.     }
  163.     if (show_timer) {
  164.         sprintf(buf,"%3d.%d fps", fpsRate / 10, fpsRate % 10);
  165.         glPushAttrib(GL_ENABLE_BIT | GL_CURRENT_BIT);
  166.         glDisable(GL_LIGHTING);
  167.         glDisable(GL_TEXTURE_2D);
  168.         glDisable(GL_DEPTH_TEST);
  169.         glDisable(GL_FOG);
  170.         glDisable(GL_BLEND);
  171.         glMatrixMode(GL_PROJECTION);
  172.         glPushMatrix();
  173.         glLoadIdentity();
  174.         glOrtho(0, Wxsize, 0, Wysize, -1, 1);
  175.         glMatrixMode(GL_MODELVIEW);
  176.         glPushMatrix();
  177.         glLoadIdentity();
  178.         glColor3f(1.0f, 1.0f, 0.0f);
  179.         glRasterPos2i(10, 10);
  180.         len = strlen(buf);
  181.         for (i = 0; i < len; i++)
  182.             glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, buf[i]);
  183.         glMatrixMode(GL_PROJECTION);
  184.         glPopMatrix();
  185.         glMatrixMode(GL_MODELVIEW);
  186.         glPopMatrix();
  187.         glPopAttrib();
  188.     }
  189.     glutSwapBuffers();
  190. }
  191. void
  192. reshape(int width, int height)
  193. {
  194.     Wxsize = width;
  195.     Wysize = height;
  196.     mouse_x = Wxsize/2;
  197.     mouse_y = Wysize/2;
  198.     glViewport(0, 0, width, height);
  199. }
  200. /* ARGSUSED1 */
  201. void
  202. keyboard(unsigned char c, int x, int y)
  203. {
  204.     switch (c) {
  205.     case 0x1B:
  206.         exit(0);
  207.         break;
  208.     case 'r':
  209.         buttons[RKEY] = 1;
  210.         break;
  211.     case '.':
  212.         buttons[PERIODKEY] = 1;
  213.         break;
  214.     case ' ':
  215.         buttons[SPACEKEY] = 1;
  216.         break;
  217.     case 'f':
  218.         set_fog(!fog);
  219.         break;
  220.     case 'd':
  221.         set_dither(!dither);
  222.         break;
  223.     case 't':
  224.         show_timer = !show_timer;
  225.         break;
  226.     }
  227. }
  228. void mouse(int button, int state, int x, int y)
  229. {
  230.     mouse_x = x;
  231.     mouse_y = y;
  232.     switch (button) {
  233.     case GLUT_LEFT_BUTTON:
  234.         buttons[LEFTMOUSE] = (state == GLUT_DOWN);
  235.         break;
  236.     case GLUT_MIDDLE_BUTTON:
  237.         buttons[MIDDLEMOUSE] = (state == GLUT_DOWN);
  238.         break;
  239.     case GLUT_RIGHT_BUTTON:
  240.         buttons[RIGHTMOUSE] = (state == GLUT_DOWN);
  241.         break;
  242.     }
  243. }
  244. void motion(int x, int y)
  245. {
  246.     mouse_x = x;
  247.     mouse_y = y;
  248. }
  249. /* ARGSUSED1 */
  250. void special(int key, int x, int y)
  251. {
  252.     switch (key) {
  253.     case GLUT_KEY_LEFT:
  254.         buttons[LEFTARROWKEY] = 1;
  255.         break;
  256.     case GLUT_KEY_UP:
  257.         buttons[UPARROWKEY] = 1;
  258.         break;
  259.     case GLUT_KEY_RIGHT:
  260.         buttons[RIGHTARROWKEY] = 1;
  261.         break;
  262.     case GLUT_KEY_DOWN:
  263.         buttons[DOWNARROWKEY] = 1;
  264.         break;
  265.     case GLUT_KEY_PAGE_UP:
  266.         buttons[PAGEUPKEY] = 1;
  267.         break;
  268.     case GLUT_KEY_PAGE_DOWN:
  269.         buttons[PAGEDOWNKEY] = 1;
  270.         break;
  271.     }
  272. }
  273. int
  274. main(int argc, char **argv)
  275. {
  276.   glutInit(&argc, argv);
  277.   if (argc > 1 && !strcmp(argv[1], "-f"))
  278.       fullscreen = GL_TRUE;
  279.   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE);
  280.   if (fullscreen) {
  281.       glutGameModeString("640x480:16@60");
  282.       glutEnterGameMode();
  283.   } else {
  284.       glutInitWindowSize(400, 400);
  285.       glutCreateWindow("GLUT-based OpenGL skyfly");
  286.   }
  287.   glutDisplayFunc(draw);
  288.   glutReshapeFunc(reshape);
  289.   glutVisibilityFunc(visible);
  290.   glutKeyboardFunc(keyboard);
  291.   glutMouseFunc(mouse);
  292.   glutMotionFunc(motion);
  293.   glutPassiveMotionFunc(motion);
  294.   glutSpecialFunc(special);
  295.   init_misc();
  296.   if (!rgbmode)
  297.     init_cmap();
  298.   init_skyfly();
  299.   glutMainLoop();
  300.   return 0;             /* ANSI C requires main to return int. */
  301. }