[ Previous | Next | Contents | Glossary | Home | Search ]
GL3.2 for AIX: Graphics Library (GL) Technical Reference

select1.c Example C Language Program

/*
select1.c:
Select demo program.  the "ship" is the blue rectangle.  The
"planet" is the red circle. move the ship so it intersects the
planet and the ship will crash.
*/
#include <gl/gl.h>
#include <gl/device.h>
#define PLANET 1
main()
{
  short type, val;
  register short buffer[50], cnt, i;
  float shipx, shipy, shipz;
  for (i = 0; i < 50; i++)
    buffer[i] = 0;
  initialize();
  while (TRUE) {
    type = qread(&val);
    if (val==0)
      continue;
    switch (type) {
    case REDRAW:
      reshapeviewport();
      drawplanet();
      break;
    case ESCKEY:
      gexit();
      exit();
    case LEFTMOUSE:
      /* set ship location to cursor location */
      shipz=0;
      shipx=getvaluator(MOUSEX);
      shipy=getvaluator(MOUSEY);
      /* draw the ship */
      color(BLUE);
      rect(shipx, shipy, shipx+20, shipy+10);
      /* specify the selecting region to be a box 
         surrounding the ship */
      pushmatrix();
      ortho(shipx, shipx+.05, shipy, shipy+.05, 
          shipz-0.5, shipz+.05);
      /* clear the name stack */
      initnames();
      gselect(buffer, 50);  /* enter selecting mode */
      /* put "1" on the name stack to be saved if 
         PLANET draws into the selecting region */
      loadname(1);
      pushname(2);                /* draw the planet */
      callobj(PLANET);            /* exit selecting mode */
      cnt = endselect(buffer);
      popmatrix();                /* check to see if PLANET was selected */
      printf("cnt = %d\n",cnt);
      for (i = 0;i<4;i++)
        printf("buffer[%d] = %d\n",i,buffer[i]);
      if (buffer[1]==1) {
        printf("CRASH\n");
        gexit();
        exit();
      }
      break;
    default:
      break;
    }
  }
}
initialize()
{
  int gid;
  float xmax,ymax;
  prefposition(XMAXSCREEN/4, XMAXSCREEN*3/4, YMAXSCREEN/4, 
      YMAXSCREEN*3/4);
  keepaspect(1,1);
  gid = winopen("select1");
  qdevice(ESCKEY);
  qdevice(REDRAW);
  qdevice(LEFTMOUSE);
  qenter(REDRAW,gid);
  xmax = .5 + (float) XMAXSCREEN;
  ymax = .5 + (float) YMAXSCREEN;
  ortho(xmax/4.0, xmax*3.0/4.0, ymax/4.0, ymax*3.0/4.0, 0.0,
      -xmax/2.0);
  createplanet(PLANET);
}
drawplanet()
{
  color(BLACK);
  clear();
  color(RED);
  /* create the planet object */
  callobj(PLANET);
}
createplanet(x)
{
  makeobj(x);
  circfi(600,600,20);
  closeobj();
}

Related Information

The endselect subroutine, getvaluator subroutine, gselect subroutine.


[ Previous | Next | Contents | Glossary | Home | Search ]