27 files changed, 179 insertions, 549 deletions
@@ -1,17 +1,24 @@ -Visualization system to explore the data from exp004. +Visualization system to explore influenza sequence data. -Light gray is used to display unselected points. White is used to -highlight the selection. - -Use +Light gray is used to display unselected points. A yellow outline is +used to highlight the selection. ESC: Clear selection. - Left-click, drag and release: Add box to selection. - Left-click: Add points under mouse pointer to selection. + + Left-click, drag: Pan. + + CTRL + Left-click, drag and release: Add box to selection. + s: Selection will be used to define a set. + z: Selection will be used to define a zoom region. + r: Reset the display (unzoom). + l: Toggle display of the legend (on by default). + + Mouse-wheel: scroll to zoom in or out by 10% of the window size with + the focus at the center of the window. ====== COFFEE @@ -1,8 +1,7 @@ This is the todo list for the project. * Features to add: - - Pan the display. - - Zoom out. + - Preserve the aspect ratio when zooming. - Handle multiple selections defined by the user. . Save a selection. . Load a selection. diff --git a/src/Makefile.am b/src/Makefile.am index e2a3b72..c7f33a0 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -11,17 +11,19 @@ flumap_SOURCES = \ controller/callbacks/display.c \ controller/callbacks/keyboard.c \ controller/callbacks/mouse.c \ + controller/callbacks/mouse_motion.c \ controller/callbacks/mouse_wheel.c \ controller/callbacks/reshape.c \ db/dbconnect.c \ flumap.c \ - model/base.c \ + model/data/base.c \ model/geometry/density_legend_geometry.c \ model/geometry/map_geometry.c \ model/geometry/protein_geometry.c \ model/geometry/protein_selected_geometry.c \ - model/selection_info_init.c \ - model/zoom_info_init.c \ + model/state/pan_info_init.c \ + model/state/selection_info_init.c \ + model/state/zoom_info_init.c \ util/ati_meminfo.c \ util/check_error.c \ util/pick_convert.c \ @@ -44,20 +46,23 @@ noinst_HEADERS = \ controller/callbacks/display.h \ controller/callbacks/keyboard.h \ controller/callbacks/mouse.h \ + controller/callbacks/mouse_motion.h \ controller/callbacks/mouse_wheel.h \ controller/callbacks/reshape.h \ db/dbconnect.h \ - model/base.h \ - model/state.h \ + model/data/base.h \ + model/data/coordinates.h \ model/geometry/density_legend_geometry.h \ model/geometry/map_geometry.h \ model/geometry/protein_geometry.h \ model/geometry/protein_selected_geometry.h \ - model/selection_info.h \ - model/selection_info_init.h \ - model/selection_purposes.h \ - model/zoom_info.h \ - model/zoom_info_init.h \ + model/state/pan_info.h \ + model/state/selection_info.h \ + model/state/selection_info_init.h \ + model/state/selection_purposes.h \ + model/state/state.h \ + model/state/zoom_info.h \ + model/state/zoom_info_init.h \ util/ati_meminfo.h \ util/check_error.h \ util/pick_convert.h \ @@ -86,4 +91,4 @@ CLEANFILES = \ controller/actions/selection_from_db.c \ controller/actions/sel_save.c \ db/dbconnect.c \ - model/base.c + model/data/base.c 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; } diff --git a/src/controller/actions/pan.h b/src/controller/actions/pan.h index 18ac876..1af615e 100644 --- a/src/controller/actions/pan.h +++ b/src/controller/actions/pan.h @@ -4,6 +4,6 @@ /* * Pan around the geometry. */ -void pan (); +void pan (int x1, int y1, int x2, int y2); #endif // PAN_H diff --git a/src/controller/actions/sel_save.c b/src/controller/actions/sel_save.c index 9690459..48dabc2 100644 --- a/src/controller/actions/sel_save.c +++ b/src/controller/actions/sel_save.c @@ -1,6 +1,6 @@ static char sqla_program_id[292] = { - 172,0,65,69,65,78,65,73,79,66,73,55,78,82,73,90,48,49,49,49, + 172,0,65,69,65,78,65,73,114,65,76,72,80,82,73,90,48,49,49,49, 49,32,50,32,32,32,32,32,32,32,32,32,8,0,68,79,78,32,32,32, 32,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, diff --git a/src/controller/callbacks/keyboard.c b/src/controller/callbacks/keyboard.c index 28bea81..cc917e7 100644 --- a/src/controller/callbacks/keyboard.c +++ b/src/controller/callbacks/keyboard.c @@ -3,6 +3,7 @@ #include "../actions/selection_from_db.h" #include "reshape.h" #include "../../view/state0.h" +#include "../../model/state/pan_info_init.h" #include <GL/glut.h> #define S state0 @@ -42,6 +43,7 @@ keyboard (unsigned char key, int x, int y) /* * Reset the view (unzoom). */ + pan_info_init (&S.pan); S.zoom.active = false; reshape (S.viewport.w, S.viewport.h); glutPostRedisplay (); diff --git a/src/controller/callbacks/mouse.c b/src/controller/callbacks/mouse.c index 16e8b8b..f594c23 100644 --- a/src/controller/callbacks/mouse.c +++ b/src/controller/callbacks/mouse.c @@ -9,6 +9,7 @@ #include "reshape.h" #include <GL/glut.h> #include <math.h> +#include <stdio.h> #include <stdlib.h> /* @@ -19,8 +20,12 @@ void mouse (int button, int state, int x, int y) { + // Release left button. if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) { + // Deactive a panning event if one was happening. + S.pan.active = false; + if (S.selection.active && S.selection.purpose == ZOOM) { /* @@ -41,7 +46,9 @@ mouse (int button, int state, int x, int y) /* * Complete a selection if one was started and not cancelled. */ - if (S.selection.active && S.selection.purpose == SET) + if (S.selection.active && + S.selection.purpose == SET && + glutGetModifiers () == GLUT_ACTIVE_CTRL) { /* @@ -116,12 +123,31 @@ mouse (int button, int state, int x, int y) } - if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) + // Begin selection. + if (button == GLUT_LEFT_BUTTON && + state == GLUT_DOWN && + glutGetModifiers () == GLUT_ACTIVE_CTRL) { S.selection.active = true; S.selection.x = x; S.selection.y = y; } + // Pan. + if (button == GLUT_LEFT_BUTTON && + state == GLUT_DOWN && + glutGetModifiers () != GLUT_ACTIVE_CTRL) + { + /* + * Detection of the first point in a panning event. + */ + if (S.pan.active == false) + { + S.pan.active = true; + S.pan.begin[0] = x; + S.pan.begin[1] = y; + } + } + return; } diff --git a/src/controller/callbacks/mouse_motion.c b/src/controller/callbacks/mouse_motion.c new file mode 100644 index 0000000..3279773 --- a/dev/null +++ b/src/controller/callbacks/mouse_motion.c @@ -0,0 +1,19 @@ +#include "mouse_motion.h" +#include "../../view/state0.h" +#include "../actions/pan.h" +#include <GL/glut.h> + +#define S state0 + +void +mouse_motion (int x, int y) +{ + if (S.pan.active) + { + pan (S.pan.begin[0], S.pan.begin[1], x, y); + S.pan.begin[0] = x; + S.pan.begin[1] = y; + } + + return; +} diff --git a/src/controller/callbacks/mouse_motion.h b/src/controller/callbacks/mouse_motion.h new file mode 100644 index 0000000..2d8e7f2 --- a/dev/null +++ b/src/controller/callbacks/mouse_motion.h @@ -0,0 +1,9 @@ +#ifndef MOUSE_MOTION_H +#define MOUSE_MOTION_H + +/* + * GLUT callback for mouse motion. + */ +void mouse_motion (int x, int y); + +#endif // MOUSE_MOTION_H diff --git a/src/model/base.c b/src/model/base.c deleted file mode 100644 index 649fec3..0000000 --- a/src/model/base.c +++ b/dev/null @@ -1,417 +0,0 @@ -static char sqla_program_id[292] = -{ - 172,0,65,69,65,78,65,73,86,65,78,55,78,82,73,90,48,49,49,49, - 49,32,50,32,32,32,32,32,32,32,32,32,8,0,68,79,78,32,32,32, - 32,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,8,0,66,65,83,69,32,32,32,32,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0 -}; - -#include "sqladef.h" - -static struct sqla_runtime_info sqla_rtinfo = -{{'S','Q','L','A','R','T','I','N'}, sizeof(wchar_t), 0, {' ',' ',' ',' '}}; - - -static const short sqlIsLiteral = SQL_IS_LITERAL; -static const short sqlIsInputHvar = SQL_IS_INPUT_HVAR; - - -#line 1 "base.sqc" -/* I seem to need this for glGenBuffers as per - http://www.gamedev.net/community/forums/topic.asp?topic_id=422358 */ -#define GL_GLEXT_PROTOTYPES - -#include "base.h" -#include "../view/state0.h" -#include "../util/check_error.h" -#include <GL/glut.h> -#include <string.h> -#include <stdlib.h> -#include "sqlca.h" -extern struct sqlca sqlca; - -/* - * A simple alias to make the code more readable. - */ -#define S state0 - -void -base (void) -{ - /* - * This implementation can be improved by mapping the video memory - * directly rather than loading into system memory and then copying - * into video memory. - */ - - /* - * db2dclgn -d exp004 -t coordinates - */ - -/* -EXEC SQL BEGIN DECLARE SECTION; -*/ - -#line 31 "base.sqc" - - -/* -EXEC SQL INCLUDE 'model/coordinates.h'; -*/ - -#line 1 "/home/don/projects/Research/Experiments/exp005/src/model/coordinates.h" -struct -{ - sqlint32 coord_id; - struct - { - short length; - char data[50]; - } gi; - double x; - double y; -} coordinates; - -#line 32 "base.sqc" - - sqlint32 rows; - -/* -EXEC SQL END DECLARE SECTION; -*/ - -#line 34 "base.sqc" - - - /* Determine how many nodes have coordinates assigned to them. */ - -/* -EXEC SQL SELECT COUNT (*) INTO:rows FROM coordinates; -*/ - -{ -#line 37 "base.sqc" - sqlastrt(sqla_program_id, &sqla_rtinfo, &sqlca); -#line 37 "base.sqc" - sqlaaloc(3,1,1,0L); - { - struct sqla_setdata_list sql_setdlist[1]; -#line 37 "base.sqc" - sql_setdlist[0].sqltype = 496; sql_setdlist[0].sqllen = 4; -#line 37 "base.sqc" - sql_setdlist[0].sqldata = (void*)&rows; -#line 37 "base.sqc" - sql_setdlist[0].sqlind = 0L; -#line 37 "base.sqc" - sqlasetdata(3,0,1,sql_setdlist,0L,0L); - } -#line 37 "base.sqc" - sqlacall((unsigned short)24,1,0,3,0L); -#line 37 "base.sqc" - sqlastop(0L); -} - -#line 37 "base.sqc" - - - /* Free any existing coordinates and allocate memory to store the - new values. */ - S.rows = rows; - - free (S.selection.set); - S.selection.set = calloc (rows, sizeof (bool)); - - free (S.gi_data); - S.gi_data = calloc (rows, sizeof (char) * 20); - - free (S.base_vertices_data); - S.base_vertices_data = calloc (rows, sizeof (float) * 2); - - free (S.base_colors_data); - S.base_colors_data = calloc (rows, sizeof (float) * 4); - - -/* -EXEC SQL DECLARE c2 CURSOR FOR SELECT *FROM coordinates; -*/ - -#line 55 "base.sqc" - - - -/* -EXEC SQL OPEN c2; -*/ - -{ -#line 57 "base.sqc" - sqlastrt(sqla_program_id, &sqla_rtinfo, &sqlca); -#line 57 "base.sqc" - sqlacall((unsigned short)26,2,0,0,0L); -#line 57 "base.sqc" - sqlastop(0L); -} - -#line 57 "base.sqc" - - - /* - * Initialize the bounding box of the points. - */ - S.bb.min_x = 0.0; - S.bb.max_x = 0.0; - S.bb.min_y = 0.0; - S.bb.max_y = 0.0; - - -/* -EXEC SQL FETCH c2 INTO:coordinates; -*/ - -{ -#line 67 "base.sqc" - sqlastrt(sqla_program_id, &sqla_rtinfo, &sqlca); -#line 67 "base.sqc" - sqlaaloc(3,4,2,0L); - { - struct sqla_setdata_list sql_setdlist[4]; -#line 67 "base.sqc" - sql_setdlist[0].sqltype = 496; sql_setdlist[0].sqllen = 4; -#line 67 "base.sqc" - sql_setdlist[0].sqldata = (void*)&coordinates.coord_id; -#line 67 "base.sqc" - sql_setdlist[0].sqlind = 0L; -#line 67 "base.sqc" - sql_setdlist[1].sqltype = 448; sql_setdlist[1].sqllen = 50; -#line 67 "base.sqc" - sql_setdlist[1].sqldata = (void*)&coordinates.gi; -#line 67 "base.sqc" - sql_setdlist[1].sqlind = 0L; -#line 67 "base.sqc" - sql_setdlist[2].sqltype = 480; sql_setdlist[2].sqllen = 8; -#line 67 "base.sqc" - sql_setdlist[2].sqldata = (void*)&coordinates.x; -#line 67 "base.sqc" - sql_setdlist[2].sqlind = 0L; -#line 67 "base.sqc" - sql_setdlist[3].sqltype = 480; sql_setdlist[3].sqllen = 8; -#line 67 "base.sqc" - sql_setdlist[3].sqldata = (void*)&coordinates.y; -#line 67 "base.sqc" - sql_setdlist[3].sqlind = 0L; -#line 67 "base.sqc" - sqlasetdata(3,0,4,sql_setdlist,0L,0L); - } -#line 67 "base.sqc" - sqlacall((unsigned short)25,2,0,3,0L); -#line 67 "base.sqc" - sqlastop(0L); -} - -#line 67 "base.sqc" - - while (sqlca.sqlcode != 100) - { - int i = coordinates.coord_id - 1; - - strncpy (S.gi_data + i, coordinates.gi.data, sizeof (S.gi_data[i])); - - float *v = S.base_vertices_data + (i * 2); - *v = coordinates.x; - v++; - *v = coordinates.y; - - v = S.base_vertices_data + (i * 2); - if (*v < S.bb.min_x) - S.bb.min_x = *v; - if (*v > S.bb.max_x) - S.bb.max_x = *v; - - v++; - if (*v < S.bb.min_y) - S.bb.min_y = *v; - if (*v > S.bb.max_y) - S.bb.max_y = *v; - - /* - * Deselected by default. - */ - S.selection.set[i] = false; - - float *c = S.base_colors_data + (i * 4); - *c = DEFAULT_COLOR_R; - c++; - *c = DEFAULT_COLOR_G; - c++; - *c = DEFAULT_COLOR_B; - c++; - *c = DEFAULT_COLOR_A; - - -/* -EXEC SQL FETCH c2 INTO:coordinates; -*/ - -{ -#line 105 "base.sqc" - sqlastrt(sqla_program_id, &sqla_rtinfo, &sqlca); -#line 105 "base.sqc" - sqlaaloc(3,4,3,0L); - { - struct sqla_setdata_list sql_setdlist[4]; -#line 105 "base.sqc" - sql_setdlist[0].sqltype = 496; sql_setdlist[0].sqllen = 4; -#line 105 "base.sqc" - sql_setdlist[0].sqldata = (void*)&coordinates.coord_id; -#line 105 "base.sqc" - sql_setdlist[0].sqlind = 0L; -#line 105 "base.sqc" - sql_setdlist[1].sqltype = 448; sql_setdlist[1].sqllen = 50; -#line 105 "base.sqc" - sql_setdlist[1].sqldata = (void*)&coordinates.gi; -#line 105 "base.sqc" - sql_setdlist[1].sqlind = 0L; -#line 105 "base.sqc" - sql_setdlist[2].sqltype = 480; sql_setdlist[2].sqllen = 8; -#line 105 "base.sqc" - sql_setdlist[2].sqldata = (void*)&coordinates.x; -#line 105 "base.sqc" - sql_setdlist[2].sqlind = 0L; -#line 105 "base.sqc" - sql_setdlist[3].sqltype = 480; sql_setdlist[3].sqllen = 8; -#line 105 "base.sqc" - sql_setdlist[3].sqldata = (void*)&coordinates.y; -#line 105 "base.sqc" - sql_setdlist[3].sqlind = 0L; -#line 105 "base.sqc" - sqlasetdata(3,0,4,sql_setdlist,0L,0L); - } -#line 105 "base.sqc" - sqlacall((unsigned short)25,2,0,3,0L); -#line 105 "base.sqc" - sqlastop(0L); -} - -#line 105 "base.sqc" - - } - - -/* -EXEC SQL CLOSE c2; -*/ - -{ -#line 108 "base.sqc" - sqlastrt(sqla_program_id, &sqla_rtinfo, &sqlca); -#line 108 "base.sqc" - sqlacall((unsigned short)20,2,0,0,0L); -#line 108 "base.sqc" - sqlastop(0L); -} - -#line 108 "base.sqc" - - - -/* -EXEC SQL COMMIT; -*/ - -{ -#line 110 "base.sqc" - sqlastrt(sqla_program_id, &sqla_rtinfo, &sqlca); -#line 110 "base.sqc" - sqlacall((unsigned short)21,0,0,0,0L); -#line 110 "base.sqc" - sqlastop(0L); -} - -#line 110 "base.sqc" - - - /* - * Find the largest axis and use it to setup the projection. This - * is done to preserve the aspect ratio. The aspect ratio should be - * preserved since relative distance is a meaningful indicator in - * the map. - */ - - // Min of min x or min y. - if (S.bb.min_x <= S.bb.min_y) - S.ortho_min = S.bb.min_x; - else - S.ortho_min = S.bb.min_y; - S.ortho_min--; - - // Max of max x or max y. - if (S.bb.max_x >= S.bb.max_y) - S.ortho_max = S.bb.max_x; - else - S.ortho_max = S.bb.max_y; - S.ortho_max++; - - // Invert the y coordinate to match up with the LGL Java viewer. - float *v = S.base_vertices_data; - for (int i = 0; i < S.rows; i++) - { - v++; - *v = S.ortho_max - *v; - v++; - } - - // Move the origin (0,0) to the center of the data. - S.ortho_min = 0.0; - S.ortho_max = 0.0; - - v = S.base_vertices_data; - for (int i = 0; i < S.rows; i++) - { - *v = *v - (0.5 * (S.bb.max_x - S.bb.min_x)); - - if (S.ortho_min > *v) - S.ortho_min = *v; - - if (S.ortho_max < *v) - S.ortho_max = *v; - - v++; - - *v = *v - (0.5 * (S.bb.max_y - S.bb.min_y)); - - if (S.ortho_min > *v) - S.ortho_min = *v; - - if (S.ortho_max < *v) - S.ortho_max = *v; - - v++; - } - - glGenBuffers (2, S.buffers); - - glBindBuffer (GL_ARRAY_BUFFER, S.buffers[BASE_VERTICES]); - glVertexPointer (2, GL_FLOAT, 0, 0); - glBufferData (GL_ARRAY_BUFFER, - sizeof (S.base_vertices_data), S.base_vertices_data, - GL_STATIC_DRAW); - - glBindBuffer (GL_ARRAY_BUFFER, S.buffers[BASE_COLORS]); - glColorPointer (4, GL_FLOAT, 0, 0); - glBufferData (GL_ARRAY_BUFFER, - sizeof (S.base_colors_data), S.base_colors_data, - GL_STATIC_DRAW); - - return; -} diff --git a/src/model/base.h b/src/model/base.h deleted file mode 100644 index 5b7bd0b..0000000 --- a/src/model/base.h +++ b/dev/null @@ -1,9 +0,0 @@ -#ifndef BASE_H -#define BASE_H - -/* - * Build the base layer of the map. - */ -void base (void); - -#endif // BASE_H diff --git a/src/model/coordinates.h b/src/model/coordinates.h deleted file mode 100644 index 7620904..0000000 --- a/src/model/coordinates.h +++ b/dev/null @@ -1,11 +0,0 @@ -struct -{ - sqlint32 coord_id; - struct - { - short length; - char data[50]; - } gi; - double x; - double y; -} coordinates; diff --git a/src/model/base.sqc b/src/model/data/base.sqc index 901ccd7..ad1c395 100644 --- a/src/model/base.sqc +++ b/src/model/data/base.sqc @@ -3,8 +3,8 @@ #define GL_GLEXT_PROTOTYPES #include "base.h" -#include "../view/state0.h" -#include "../util/check_error.h" +#include "../../view/state0.h" +#include "../../util/check_error.h" #include <GL/glut.h> #include <string.h> #include <stdlib.h> @@ -29,7 +29,7 @@ base (void) * db2dclgn -d exp004 -t coordinates */ EXEC SQL BEGIN DECLARE SECTION; - EXEC SQL INCLUDE 'model/coordinates.h'; + EXEC SQL INCLUDE 'model/data/coordinates.h'; sqlint32 rows; EXEC SQL END DECLARE SECTION; diff --git a/src/model/selection_info.h b/src/model/selection_info.h deleted file mode 100644 index 73a1c34..0000000 --- a/src/model/selection_info.h +++ b/dev/null @@ -1,37 +0,0 @@ -#ifndef SELECTION_INFO_H -#define SELECTION_INFO_H - -#include "selection_purposes.h" -#include <stdbool.h> - -typedef struct -{ - - /* - * Selection list. - */ - bool *set; - - /* - * A selection is being performed. - */ - bool active; - - /* - * Indicate if the user is currently defining a selection. - */ - SELECTION_PURPOSES purpose; - - /* - * X coordinate of mouse when selection mode initiated. - */ - int x; - - /* - * Y coordinate of mouse when selection mode initiated. - */ - int y; - -} SELECTION_INFO; - -#endif // SELECTION_INFO_H diff --git a/src/model/selection_info_init.c b/src/model/selection_info_init.c deleted file mode 100644 index 40d00aa..0000000 --- a/src/model/selection_info_init.c +++ b/dev/null @@ -1,14 +0,0 @@ -#include "selection_info_init.h" -#include <string.h> - -void -selection_info_init (SELECTION_INFO * s) -{ - s->set = NULL; - s->active = false; - s->purpose = SET; - s->x = 0; - s->y = 0; - - return; -} diff --git a/src/model/selection_info_init.h b/src/model/selection_info_init.h deleted file mode 100644 index d38b851..0000000 --- a/src/model/selection_info_init.h +++ b/dev/null @@ -1,8 +0,0 @@ -#ifndef SELECTION_INFO_INIT_H -#define SELECTION_INFO_INIT_H - -#include "selection_info.h" - -void selection_info_init (SELECTION_INFO * s); - -#endif // SELECTION_INFO_INIT_H diff --git a/src/model/selection_purposes.h b/src/model/selection_purposes.h deleted file mode 100644 index 6c2e651..0000000 --- a/src/model/selection_purposes.h +++ b/dev/null @@ -1,17 +0,0 @@ -#ifndef SELECTION_PURPOSES_H -#define SELECTION_PURPOSES_H - -typedef enum -{ - /* - * The selection will define a new set. - */ - SET, - - /* - * The selection will define a zoom region. - */ - ZOOM -} SELECTION_PURPOSES; - -#endif // SELECTION_PURPOSES_H diff --git a/src/model/state/pan_info_init.h b/src/model/state/pan_info_init.h new file mode 100644 index 0000000..f47b790 --- a/dev/null +++ b/src/model/state/pan_info_init.h @@ -0,0 +1,8 @@ +#ifndef PAN_INFO_INIT_H +#define PAN_INFO_INIT_H + +#include "pan_info.h" + +void pan_info_init (PAN_INFO* p); + +#endif // PAN_INFO_INIT_H diff --git a/src/model/state.h b/src/model/state/state.h index 71185c8..ac1e035 100644 --- a/src/model/state.h +++ b/src/model/state/state.h @@ -3,6 +3,7 @@ #include "selection_info.h" #include "zoom_info.h" +#include "pan_info.h" /* * Buffer object identifiers. @@ -109,6 +110,8 @@ typedef struct ZOOM_INFO zoom; + PAN_INFO pan; + /* * Display a legend on the map. */ diff --git a/src/model/zoom_info.h b/src/model/state/zoom_info.h index 5916b3c..5916b3c 100644 --- a/src/model/zoom_info.h +++ b/src/model/state/zoom_info.h diff --git a/src/model/zoom_info_init.c b/src/model/state/zoom_info_init.c index f49dd59..f49dd59 100644 --- a/src/model/zoom_info_init.c +++ b/src/model/state/zoom_info_init.c diff --git a/src/model/zoom_info_init.h b/src/model/state/zoom_info_init.h index 2cf2ac2..2cf2ac2 100644 --- a/src/model/zoom_info_init.h +++ b/src/model/state/zoom_info_init.h diff --git a/src/view/geometry.c b/src/view/geometry.c index 7a3ed36..f8bd8e6 100644 --- a/src/view/geometry.c +++ b/src/view/geometry.c @@ -10,12 +10,20 @@ geometry (GLenum mode) { glMatrixMode (GL_MODELVIEW); glLoadIdentity (); + glPushMatrix (); + + /* + * Apply the results of any panning operations. + */ + glTranslatef (S.pan.trans[0], S.pan.trans[1], 0.0); /* * Draw the map. */ glCallList (S.list_offset + MAP_GEOMETRY); + glPopMatrix (); + /* * Draw the legend. */ diff --git a/src/view/init.c b/src/view/init.c index e32a75e..1c06c7e 100644 --- a/src/view/init.c +++ b/src/view/init.c @@ -1,12 +1,13 @@ -#include "init.h" -#include "state0.h" +#include "../model/data/base.h" #include "../model/geometry/density_legend_geometry.h" #include "../model/geometry/map_geometry.h" #include "../model/geometry/protein_geometry.h" #include "../model/geometry/protein_selected_geometry.h" -#include "../model/selection_info_init.h" -#include "../model/zoom_info_init.h" -#include "../model/base.h" +#include "../model/state/pan_info_init.h" +#include "../model/state/selection_info_init.h" +#include "../model/state/zoom_info_init.h" +#include "init.h" +#include "state0.h" #include <GL/glut.h> #define S state0 @@ -23,6 +24,7 @@ init (void) S.base_colors_data = NULL; selection_info_init (&S.selection); zoom_info_init (&S.zoom); + pan_info_init (&S.pan); S.legend = true; /* diff --git a/src/view/state0.h b/src/view/state0.h index 071e3ff..6be5b48 100644 --- a/src/view/state0.h +++ b/src/view/state0.h @@ -1,7 +1,7 @@ #ifndef STATE0_H #define STATE0_H -#include "../model/state.h" +#include "../model/state/state.h" STATE state0; diff --git a/src/view/view.c b/src/view/view.c index db3be6d..02fd833 100644 --- a/src/view/view.c +++ b/src/view/view.c @@ -1,6 +1,7 @@ #include "../controller/callbacks/display.h" #include "../controller/callbacks/keyboard.h" #include "../controller/callbacks/mouse.h" +#include "../controller/callbacks/mouse_motion.h" #include "../controller/callbacks/mouse_wheel.h" #include "../controller/callbacks/reshape.h" #include "../db/dbconnect.h" @@ -20,7 +21,7 @@ view (void) // GLUT Initialization glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); - glutCreateWindow ("Exp004"); + glutCreateWindow ("Protein Sequence Map - Flu"); // GL Initialization glClearColor (CLEAR_COLOR); @@ -49,6 +50,7 @@ view (void) glutKeyboardFunc (keyboard); glutMouseFunc (mouse); glutMouseWheelFunc (mouse_wheel); + glutMotionFunc (mouse_motion); glutReshapeFunc (reshape); return; |