27 files changed, 179 insertions, 549 deletions
diff --git a/src/controller/actions/pan.c b/src/controller/actions/pan.c index cdc5cad..2f856b0 100644 --- a/src/controller/actions/pan.c +++ b/src/controller/actions/pan.c @@ -1,8 +1,61 @@ #include "pan.h" +#include "../../util/check_error.h" +#include "../../view/state0.h" +#include <GL/glut.h> + +#define S state0 void -pan () +pan (int x1, int y1, int x2, int y2) { - + int dx = x1 - x2; + int dy = y1 - x2; + + if (dx == 0 && dy == 0) + return; + + /* + * 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.pan.trans[0] += end_position[0] - start_position[0]; + S.pan.trans[1] -= end_position[1] - start_position[1]; + + glutPostRedisplay (); + return; } |