#include "zoom.h" #include "../callbacks/reshape.h" #include "../../util/check_error.h" #include "../../view/exp004state0.h" #include #include /* * A simple alias to make the code more readable. */ #define S exp004state0 void zoom (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]); reshape (S.viewport.w, S.viewport.h); glutPostRedisplay (); return; }