picksquare.c
上传用户:tengyuc
上传日期:2007-08-14
资源大小:722k
文件大小:3k
源码类别:

OpenGL

开发平台:

Visual C++

  1. #include <stdlib.h> #include <stdio.h> #include <GL/glut.h> int board[3][3];   // 每个方块的颜色值 // 清除每个方块的颜色值 void init(void) {    int i, j;    for (i = 0; i < 3; i++)        for (j = 0; j < 3; j ++)          board[i][j] = 0;    glClearColor (0.0, 0.0, 0.0, 0.0); } //  方块绘制函数,在选择模式下,每个方块的名字以所在的行和列表示
  2. //  方块的颜色值保存在board[][]中 void drawSquares(GLenum mode) {
  3. GLuint i, j;
  4. for (i = 0; i < 3; i++) 
  5. {
  6. if (mode == GL_SELECT)
  7. glLoadName (i);
  8. for (j = 0; j < 3; j ++) 
  9. {
  10. if (mode == GL_SELECT)
  11. glPushName (j);
  12. glColor3f ((GLfloat) i/3.0, (GLfloat) j/3.0,                      (GLfloat) board[i][j]/3.0);
  13. glRecti (i, j, i+1, j+1);
  14. if (mode == GL_SELECT)
  15. glPopName ();
  16. }
  17. } } //  处理鼠标单击一些其它信息 void processHits (GLint hits, GLuint buffer[]) {
  18. unsigned int i, j;
  19. GLuint ii, jj, names, *ptr;
  20. printf ("hits = %dn", hits);
  21. ptr = (GLuint *) buffer;
  22. for (i = 0; i < hits; i++) 
  23. {
  24. names = *ptr;
  25. printf (" number of names for this hit = %dn", names); ptr++;
  26. printf("  z1 is %g;", (float) *ptr/0x7fffffff); ptr++;
  27. printf(" z2 is %gn", (float) *ptr/0x7fffffff); ptr++;
  28. printf ("   names are ");
  29. for (j = 0; j < names; j++) 
  30. printf ("%d ", *ptr);
  31. if (j == 0)  
  32. ii = *ptr;
  33. else if (j == 1)
  34. jj = *ptr;
  35. ptr++;
  36. }
  37. printf ("n");
  38. board[ii][jj] = (board[ii][jj] + 1) % 3;
  39. } } //  设置选择模式,名字堆栈和投影矩阵,然后绘制对象 #define BUFSIZE 512 void pickSquares(int button, int state, int x, int y) {
  40. GLuint selectBuf[BUFSIZE];
  41. GLint hits;
  42. GLint viewport[4];
  43. if (button != GLUT_LEFT_BUTTON || state != GLUT_DOWN)
  44. return;
  45. glGetIntegerv (GL_VIEWPORT, viewport);
  46. glSelectBuffer (BUFSIZE, selectBuf);
  47. (void) glRenderMode (GL_SELECT);
  48. glInitNames();
  49. glPushName(0);
  50. glMatrixMode (GL_PROJECTION);
  51. glPushMatrix ();
  52. glLoadIdentity ();
  53. //  在鼠标位置生成5X5像素区域
  54. gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] - y),                    5.0, 5.0, viewport);
  55. gluOrtho2D (0.0, 3.0, 0.0, 3.0);
  56. drawSquares (GL_SELECT);
  57. glMatrixMode (GL_PROJECTION);
  58. glPopMatrix ();
  59. glFlush ();
  60. hits = glRenderMode (GL_RENDER);
  61. processHits (hits, selectBuf);
  62. glutPostRedisplay(); }  void display(void) {    glClear(GL_COLOR_BUFFER_BIT);    drawSquares (GL_RENDER);    glFlush(); } void reshape(int w, int h) {    glViewport(0, 0, w, h);    glMatrixMode(GL_PROJECTION);    glLoadIdentity();    gluOrtho2D (0.0, 3.0, 0.0, 3.0);    glMatrixMode(GL_MODELVIEW);    glLoadIdentity(); } void keyboard(unsigned char key, int x, int y) {    switch (key) {       case 27:          exit(0);          break;    } } int main(int argc, char** argv) {    glutInit(&argc, argv);    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);    glutInitWindowSize (200, 200);    glutInitWindowPosition (100, 100);    glutCreateWindow (argv[0]);    init ();    glutReshapeFunc (reshape);    glutDisplayFunc(display);     glutMouseFunc (pickSquares);    glutKeyboardFunc (keyboard);    glutMainLoop();    return 0;  }