/* * pick1.c: * *A sample picking program. Use LEFTMOUSE to "pick" the *background, a circle, or the square. */
#include <gl/gl.h> #include <gl/device.h>
#define PICKS 1
main() {
short namebuffer[50]; long numpicked; short val, i, j, k; Device dev;
initialize(); while (TRUE) { dev = qread(&val); if (val == 0) continue; switch (dev) { case ESCKEY: gexit(); exit(0); case REDRAW: reshapeviewport(); color(BLACK); clear(); callobj(PICKS); break; case LEFTMOUSE: pick(namebuffer, 50); ortho2(-0.5, XMAXSCREEN + 0.5, -0.5, YMAXSCREEN + 0.5); callobj(PICKS); numpicked = endpick(namebuffer); printf("hits: %d; ",numpicked); j = 0; for (i = 0; i < numpicked; i++) { printf(" "); k = namebuffer[j++]; printf("%d ", k); for (;k; k--) printf("%d ", namebuffer[j++]); printf("|"); }
printf("\n"); break; default: break; }
}
}
initialize() { int gid;
prefposition(XMAXSCREEN/4,XMAXSCREEN*3/4, YMAXSCREEN/4,YMAXSCREEN*3/4); gid = winopen("pick1"); ortho2(-0.5, XMAXSCREEN + 0.5, -0.5, YMAXSCREEN + 0.5); qdevice(ESCKEY); qdevice(REDRAW); qdevice(LEFTMOUSE); qdevice(MIDDLEMOUSE); qenter(REDRAW,gid); initnames(); makeobj(PICKS); color(RED); loadname(1); rectfi(20,20,100,100); loadname(2); pushname(3); circi(50,500,50); loadname(4); circi(50,530,60); loadname(5); move2i(30,30); draw2i(32,32); closeobj(); }
The endpick subroutine, initnames subroutine, loadname subroutine, pick subroutine, pushname subroutine.