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

GIS编程

开发平台:

Visual C++

  1. /*  
  2.  *  CS 453 - Final project : An OpenGL version of the pegboard game IQ
  3.  *  Due : June 5, 1997
  4.  *  Author : Kiri Wagstaff
  5.  *
  6.  * File : pick.c
  7.  * Description : Routines for picking ability.  MANY thanks to Nate
  8.  *                Robins since all of this code is his.  I couldn't
  9.  *                have done it without him. :)
  10.  *
  11.  */
  12. #include <stdarg.h>
  13. #include "gliq.h"
  14. int picked=0;         /* Which piece has been selected? */
  15. GLuint    select_buffer[SELECT_BUFFER];
  16. GLboolean selection = GL_FALSE;
  17. GLuint pick(int x, int y);
  18. void passive(int x, int y);
  19. GLuint pick(int x, int y)
  20. {
  21.   GLuint    i, hits, num_names, picked;
  22.   GLuint*   p;
  23.   GLboolean save;
  24.   GLuint    depth = (GLuint)-1;
  25.   GLint     viewport[4];
  26.   int height = glutGet(GLUT_WINDOW_HEIGHT);
  27.   int width = glutGet(GLUT_WINDOW_WIDTH);
  28.   /* fill in the current viewport parameters */
  29.   viewport[0] = 0;
  30.   viewport[1] = 0;
  31.   viewport[2] = width;
  32.   viewport[3] = height;
  33.   /* set the render mode to selection */
  34.   glRenderMode(GL_SELECT);
  35.   selection = GL_TRUE;
  36.   glInitNames();
  37.   glPushName(0);
  38.   /* setup a picking matrix and render into selection buffer */
  39.   glMatrixMode(GL_PROJECTION);
  40.   glPushMatrix();
  41.   glLoadIdentity();
  42.   gluPickMatrix(x, viewport[3] - y, 5.0, 5.0, viewport);
  43.   gluPerspective(60.0, (GLfloat)viewport[3]/(GLfloat)viewport[2], 1.0, 128.0);
  44.   glMatrixMode(GL_MODELVIEW);
  45.   glLoadIdentity();
  46.   glTranslatef(0.0, -2.0, -15.0);
  47.   switch(curstate)
  48.     {
  49.     case SELBOARD:
  50.       /* Draw the quit button */
  51.       drawquit(7.0, 9.0, 0.4, 1.0);
  52.       displaybuttons();
  53.       break;
  54.     case PLAY:
  55.       /* Draw the quit button */
  56.       drawquit(7.0, 9.0, 0.4, 1.0);
  57.       glPushMatrix();
  58.       glRotatef(45.0, 1.0, 0.0, 0.0);
  59.       tbMatrix();
  60.       drawpegs();
  61.       glPopMatrix();
  62.       break;
  63.     case HIGHSC:
  64.       break;
  65.     case VIEWSCORES:
  66.       break;
  67.     default:
  68.       printf("Unknown state %d, exiting.n", curstate);
  69.       exit(1);
  70.     }
  71.   glMatrixMode(GL_PROJECTION);
  72.   glPopMatrix();
  73.   glMatrixMode(GL_MODELVIEW);
  74.   hits = glRenderMode(GL_RENDER);
  75.   selection = GL_FALSE;
  76.   p = select_buffer;
  77.   picked = 0;
  78.   for (i = 0; i < hits; i++) {
  79.     save = GL_FALSE;
  80.     num_names = *p; /* number of names in this hit */
  81.     p++;
  82.     if (*p <= depth) { /* check the 1st depth value */
  83.       depth = *p;
  84.       save = GL_TRUE;
  85.     }
  86.     p++;
  87.     if (*p <= depth) { /* check the 2nd depth value */
  88.       depth = *p;
  89.       save = GL_TRUE;
  90.     }
  91.     p++;
  92.     if (save)
  93.       picked = *p;
  94.     p += num_names; /* skip over the rest of the names */
  95.   }
  96.   return picked;
  97. }
  98. void passive(int x, int y) 
  99. {
  100.   picked = pick(x,y);
  101.   glutPostRedisplay();
  102. }
  103. /* text: general purpose text routine.  draws a string according to
  104.  * format in a stroke font at x, y after scaling it by the scale
  105.  * specified (scale is in window-space (lower-left origin) pixels).  
  106.  *
  107.  * x      - position in x (in window-space)
  108.  * y      - position in y (in window-space)
  109.  * scale  - scale in pixels
  110.  * format - as in printf()
  111.  */
  112. void 
  113. text(GLfloat x, GLfloat y, GLfloat scale, char* format, ...)
  114. {
  115.   va_list args;
  116.   char buffer[255], *p;
  117.   GLfloat font_scale = 119.05 + 33.33;
  118.   va_start(args, format);
  119.   vsprintf(buffer, format, args);
  120.   va_end(args);
  121.   glMatrixMode(GL_PROJECTION);
  122.   glPushMatrix();
  123.   glLoadIdentity();
  124.   gluOrtho2D(0, glutGet(GLUT_WINDOW_WIDTH), 0, glutGet(GLUT_WINDOW_HEIGHT));
  125.   glMatrixMode(GL_MODELVIEW);
  126.   glPushMatrix();
  127.   glLoadIdentity();
  128.   glPushAttrib(GL_ENABLE_BIT);
  129.   glDisable(GL_LIGHTING);
  130.   glDisable(GL_TEXTURE_2D);
  131.   glDisable(GL_DEPTH_TEST);
  132.   glTranslatef(x, y, 0.0);
  133.   glScalef(scale/font_scale, scale/font_scale, scale/font_scale);
  134.   for(p = buffer; *p; p++)
  135.     glutStrokeCharacter(GLUT_STROKE_ROMAN, *p);
  136.   
  137.   glPopAttrib();
  138.   glPopMatrix();
  139.   glMatrixMode(GL_PROJECTION);
  140.   glPopMatrix();
  141.   glMatrixMode(GL_MODELVIEW);
  142. }