From f4abe0abb00210e9ef6b3277060634ba3db4f6d5 Mon Sep 17 00:00:00 2001 From: Don Pellegrino Date: Sat, 13 Jun 2009 21:51:03 +0000 Subject: Added selection by bounding box with mouse. --- diff --git a/src/controller/exp004mouse.c b/src/controller/exp004mouse.c index 11117bf..8e8f986 100644 --- a/src/controller/exp004mouse.c +++ b/src/controller/exp004mouse.c @@ -3,87 +3,118 @@ #include "../view/exp004geometry.h" #include "../view/exp004state0.h" #include "../util/check_error.h" +#include "../util/pick_convert.h" #include #include -#define SIZE 500 -#define N 3 +/* + * A simple alias to make the code more readable. + */ +#define S exp004state0 void exp004mouse (int button, int state, int x, int y) { - - if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) + if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) { - - /* - * "Specify the array to be used for the returned hit records - * with glSelectBuffer () [Redbook]." - */ - GLuint select_buf[SIZE]; - glSelectBuffer (SIZE, select_buf); - /* - * "Enter selection mode by specifying GL_SELECT with - * glRenderMode () [Redbook]." + * Complete a selection if one was started and not cancelled. */ - glRenderMode (GL_SELECT); + if (S.selecting == true) + { + + /* + * "Specify the array to be used for the returned hit records + * with glSelectBuffer () [Redbook]." + */ + GLuint select_buf[ROWS]; + glSelectBuffer (ROWS, select_buf); + + /* + * "Enter selection mode by specifying GL_SELECT with + * glRenderMode () [Redbook]." + */ + glRenderMode (GL_SELECT); + + /* + * "Initialize the name stack using glInitNames () and glPush + * Names () [Redbook]." + */ + glInitNames (); + glPushName (0); + + /* + * "Define the viewing volume you want to use for selection. + * Usually this is different from the viewing volume you + * originally used to draw the scene, so you probably want to + * save and then restore the current transformation state with + * glPushMatrix () and glPopMatrix () [Redbook]." + */ + glMatrixMode (GL_PROJECTION); + glPushMatrix (); + glLoadIdentity (); + + GLint viewport[4]; + glGetIntegerv (GL_VIEWPORT, viewport); + + /* + gluPickMatrix ((GLdouble) x, + (GLdouble) (viewport[3] - y), + N, + N, + viewport); + */ - /* - * "Initialize the name stack using glInitNames () and glPush - * Names () [Redbook]." - */ - glInitNames (); - glPushName (0); - - /* - * "Define the viewing volume you want to use for selection. - * Usually this is different from the viewing volume you - * originally used to draw the scene, so you probably want to - * save and then restore the current transformation state with - * glPushMatrix () and glPopMatrix () [Redbook]." - */ - glMatrixMode (GL_PROJECTION); - glPushMatrix (); - glLoadIdentity (); + double c_x = 0.0; + double c_y = 0.0; + double w = 0.0; + double h = 0.0; + pick_convert (S.select_x, S.select_y, x, y, + &c_x, &c_y, &w, &h); - GLint viewport[4]; - glGetIntegerv (GL_VIEWPORT, viewport); + gluPickMatrix (c_x, + (GLdouble)viewport[3] - c_y, + w, + h, + viewport); + + gluOrtho2D(S.ortho.min_x, + S.ortho.max_x, + S.ortho.min_y, + S.ortho.max_y); + + /* + * "Alternately issue primitive drawing commands and commands to + * manipulate the name stack so that each primitive of interest + * has appropriate names assigned [Redbook]." + */ + exp004geometry (GL_SELECT); + + glMatrixMode (GL_PROJECTION); + glPopMatrix (); + glutSwapBuffers (); + + /* + * "Exit selection mode and process the returned selection data + * (the hit records) [Redbook]." + */ + GLint hits = glRenderMode (GL_RENDER); + check_error (__FILE__, __LINE__); + + /* "process hits from selection mode rendering [Angel,2008]." */ + exp004processhits (hits, select_buf); + + /* "normal render [Angel,2008]." */ + glutPostRedisplay (); + } - gluPickMatrix ((GLdouble) x, - (GLdouble) (viewport[3] - y), - N, - N, - viewport); - - gluOrtho2D(exp004state0.ortho.min_x, - exp004state0.ortho.max_x, - exp004state0.ortho.min_y, - exp004state0.ortho.max_y); - - /* - * "Alternately issue primitive drawing commands and commands to - * manipulate the name stack so that each primitive of interest - * has appropriate names assigned [Redbook]." - */ - exp004geometry (GL_SELECT); - - glMatrixMode (GL_PROJECTION); - glPopMatrix (); - glutSwapBuffers (); + } - /* - * "Exit selection mode and process the returned selection data - * (the hit records) [Redbook]." - */ - GLint hits = glRenderMode (GL_RENDER); - check_error (__FILE__, __LINE__); - - /* "process hits from selection mode rendering [Angel,2008]." */ - exp004processhits (hits, select_buf); - - /* "normal render [Angel,2008]." */ - glutPostRedisplay (); + if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) + { + S.selecting = true; + S.select_x = x; + S.select_y = y; } return; -- cgit v0.8.3.1-22-g547a