/* 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();
}
The endselect subroutine, getvaluator subroutine, gselect subroutine.