-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/controller/exp004mouse.c | 55 | ||||
-rw-r--r-- | src/controller/mousewheel.c | 45 | ||||
-rw-r--r-- | src/controller/mousewheel.h | 11 | ||||
-rw-r--r-- | src/controller/performzoom.c | 65 | ||||
-rw-r--r-- | src/controller/performzoom.h | 9 | ||||
-rw-r--r-- | src/view/exp004view.c | 4 |
7 files changed, 149 insertions, 44 deletions
diff --git a/src/controller/performzoom.c b/src/controller/performzoom.c new file mode 100644 index 0000000..2fed1d2 --- a/dev/null +++ b/src/controller/performzoom.c @@ -0,0 +1,65 @@ +#include "performzoom.h" +#include "exp004reshape.h" +#include "../util/check_error.h" +#include "../view/exp004state0.h" +#include <GL/glut.h> +#include <math.h> + +/* + * A simple alias to make the code more readable. + */ +#define S exp004state0 + +void +performzoom (int x1, int y1, int x2, int y2) +{ + /* + * Convert the selection boundary from window coordinates to + * world coordinates. + */ + glMatrixMode (GL_MODELVIEW); + glLoadIdentity (); + GLdouble model[16]; + glGetDoublev (GL_MODELVIEW_MATRIX, model); + GLdouble projection[16]; + glGetDoublev (GL_PROJECTION_MATRIX, projection); + GLint viewport[4]; + glGetIntegerv (GL_VIEWPORT, viewport); + + check_error (__FILE__, __LINE__); + + GLdouble start_position[3]; + gluUnProject (x1, + y1, + 0, + model, + projection, + viewport, + &start_position[0], + &start_position[1], &start_position[2]); + + check_error (__FILE__, __LINE__); + + GLdouble end_position[3]; + gluUnProject (x2, + y2, + 0, + model, + projection, + viewport, + &end_position[0], &end_position[1], &end_position[2]); + + check_error (__FILE__, __LINE__); + + S.zoom.active = true; + S.zoom.coords[0] = fmin (start_position[0], end_position[0]); + S.zoom.coords[1] = fmax (start_position[0], end_position[0]); + S.zoom.coords[2] = fmin (start_position[1], end_position[1]); + S.zoom.coords[3] = fmax (start_position[1], end_position[1]); + + exp004reshape (S.viewport.w, S.viewport.h); + + glutPostRedisplay (); + + return; +} |