summaryrefslogtreecommitdiffstats
Side-by-side diff
-rw-r--r--src/Makefile.am55
-rw-r--r--src/controller/README_controller.txt18
-rw-r--r--src/controller/actions/clear_selection.h (renamed from src/controller/clear_selection.h)0
-rw-r--r--src/controller/actions/clear_selection.sqc (renamed from src/controller/clear_selection.sqc)4
-rw-r--r--src/controller/actions/pan.c8
-rw-r--r--src/controller/actions/pan.h9
-rw-r--r--src/controller/actions/process_hits.c (renamed from src/controller/exp004processhits.c)12
-rw-r--r--src/controller/actions/process_hits.h8
-rw-r--r--src/controller/actions/sel_save.c141
-rw-r--r--src/controller/actions/sel_save.h9
-rw-r--r--src/controller/actions/sel_save.sqc (renamed from src/controller/selsave.sqc)8
-rw-r--r--src/controller/actions/selection_from_db.h (renamed from src/controller/selection_from_db.h)0
-rw-r--r--src/controller/actions/selection_from_db.sqc (renamed from src/controller/selection_from_db.sqc)8
-rw-r--r--src/controller/actions/set_ortho.h (renamed from src/controller/set_ortho.h)0
-rw-r--r--src/controller/actions/vis_sel_set.h (renamed from src/controller/vis_sel_set.h)0
-rw-r--r--src/controller/actions/zoom.c (renamed from src/controller/performzoom.c)12
-rw-r--r--src/controller/actions/zoom.h9
-rw-r--r--src/controller/callbacks/display.c (renamed from src/controller/exp004display.c)8
-rw-r--r--src/controller/callbacks/display.h9
-rw-r--r--src/controller/callbacks/keyboard.c (renamed from src/controller/keyboard.c)10
-rw-r--r--src/controller/callbacks/keyboard.h (renamed from src/controller/keyboard.h)0
-rw-r--r--src/controller/callbacks/mouse.c (renamed from src/controller/exp004mouse.c)36
-rw-r--r--src/controller/callbacks/mouse.h9
-rw-r--r--src/controller/callbacks/mouse_wheel.c (renamed from src/controller/mousewheel.c)22
-rw-r--r--src/controller/callbacks/mouse_wheel.h (renamed from src/controller/mousewheel.h)8
-rw-r--r--src/controller/callbacks/reshape.c (renamed from src/controller/exp004reshape.c)10
-rw-r--r--src/controller/callbacks/reshape.h6
-rw-r--r--src/controller/exp004display.h6
-rw-r--r--src/controller/exp004mouse.h6
-rw-r--r--src/controller/exp004processhits.h8
-rw-r--r--src/controller/exp004reshape.h6
-rw-r--r--src/controller/performzoom.h9
-rw-r--r--src/controller/selsave.h9
-rw-r--r--src/controller/set_ortho.c21
-rw-r--r--src/model/geometry/density_legend_geometry.c4
-rw-r--r--src/view/exp004view.c20
36 files changed, 332 insertions, 176 deletions
diff --git a/src/controller/callbacks/mouse.c b/src/controller/callbacks/mouse.c
new file mode 100644
index 0000000..fc48eff
--- a/dev/null
+++ b/src/controller/callbacks/mouse.c
@@ -0,0 +1,127 @@
+#include "../../util/check_error.h"
+#include "../../util/pick_convert.h"
+#include "../../view/exp004geometry.h"
+#include "../../view/exp004state0.h"
+#include "../actions/process_hits.h"
+#include "../actions/set_ortho.h"
+#include "../actions/zoom.h"
+#include "mouse.h"
+#include "reshape.h"
+#include <GL/glut.h>
+#include <math.h>
+#include <stdlib.h>
+
+/*
+ * A simple alias to make the code more readable.
+ */
+#define S exp004state0
+
+void
+mouse (int button, int state, int x, int y)
+{
+ if (button == GLUT_LEFT_BUTTON && state == GLUT_UP)
+ {
+ if (S.selection.active && S.selection.purpose == ZOOM)
+ {
+ /*
+ * NOOP if the mouse was not moved.
+ */
+ if (x == S.selection.x || y == S.selection.y)
+ return;
+
+ GLint viewport[4];
+ glGetIntegerv (GL_VIEWPORT, viewport);
+
+ zoom (S.selection.x,
+ viewport[3] - S.selection.y,
+ x,
+ viewport[3] - y);
+ }
+
+ /*
+ * Complete a selection if one was started and not cancelled.
+ */
+ if (S.selection.active && S.selection.purpose == SET)
+ {
+
+ /*
+ * "Specify the array to be used for the returned hit records
+ * with glSelectBuffer () [Redbook]."
+ */
+ GLuint *select_buf = calloc (S.rows, sizeof (GLuint));
+ glSelectBuffer (S.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);
+
+ double c_x = 0.0;
+ double c_y = 0.0;
+ double w = 0.0;
+ double h = 0.0;
+ pick_convert (S.selection.x, S.selection.y, x, y,
+ &c_x, &c_y, &w, &h);
+
+ gluPickMatrix (c_x, (GLdouble) viewport[3] - c_y, w, h, viewport);
+
+ set_ortho ();
+
+ /*
+ * "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]." */
+ process_hits (hits, select_buf);
+
+ /* "normal render [Angel,2008]." */
+ glutPostRedisplay ();
+ }
+
+ }
+
+ if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
+ {
+ S.selection.active = true;
+ S.selection.x = x;
+ S.selection.y = y;
+ }
+
+ return;
+}

Valid XHTML 1.0 Strict

Copyright © 2009 Don Pellegrino All Rights Reserved.