summaryrefslogtreecommitdiffstats
Side-by-side diff
-rw-r--r--src/Makefile.am4
-rw-r--r--src/controller/exp004mouse.c55
-rw-r--r--src/controller/mousewheel.c45
-rw-r--r--src/controller/mousewheel.h11
-rw-r--r--src/controller/performzoom.c65
-rw-r--r--src/controller/performzoom.h9
-rw-r--r--src/view/exp004view.c4
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;
+}

Valid XHTML 1.0 Strict

Copyright © 2009 Don Pellegrino All Rights Reserved.