36 files changed, 332 insertions, 176 deletions
diff --git a/src/controller/actions/zoom.c b/src/controller/actions/zoom.c new file mode 100644 index 0000000..e33dcb8 --- a/dev/null +++ b/src/controller/actions/zoom.c | |||
@@ -0,0 +1,65 @@ | |||
1 | #include "zoom.h" | ||
2 | #include "../callbacks/reshape.h" | ||
3 | #include "../../util/check_error.h" | ||
4 | #include "../../view/exp004state0.h" | ||
5 | #include <GL/glut.h> | ||
6 | #include <math.h> | ||
7 | |||
8 | /* | ||
9 | * A simple alias to make the code more readable. | ||
10 | */ | ||
11 | #define S exp004state0 | ||
12 | |||
13 | void | ||
14 | zoom (int x1, int y1, int x2, int y2) | ||
15 | { | ||
16 | /* | ||
17 | * Convert the selection boundary from window coordinates to | ||
18 | * world coordinates. | ||
19 | */ | ||
20 | glMatrixMode (GL_MODELVIEW); | ||
21 | glLoadIdentity (); | ||
22 | GLdouble model[16]; | ||
23 | glGetDoublev (GL_MODELVIEW_MATRIX, model); | ||
24 | GLdouble projection[16]; | ||
25 | glGetDoublev (GL_PROJECTION_MATRIX, projection); | ||
26 | GLint viewport[4]; | ||
27 | glGetIntegerv (GL_VIEWPORT, viewport); | ||
28 | |||
29 | check_error (__FILE__, __LINE__); | ||
30 | |||
31 | GLdouble start_position[3]; | ||
32 | gluUnProject (x1, | ||
33 | y1, | ||
34 | 0, | ||
35 | model, | ||
36 | projection, | ||
37 | viewport, | ||
38 | &start_position[0], | ||
39 | &start_position[1], &start_position[2]); | ||
40 | |||
41 | check_error (__FILE__, __LINE__); | ||
42 | |||
43 | GLdouble end_position[3]; | ||
44 | gluUnProject (x2, | ||
45 | y2, | ||
46 | 0, | ||
47 | model, | ||
48 | projection, | ||
49 | viewport, | ||
50 | &end_position[0], &end_position[1], &end_position[2]); | ||
51 | |||
52 | check_error (__FILE__, __LINE__); | ||
53 | |||
54 | S.zoom.active = true; | ||
55 | S.zoom.coords[0] = fmin (start_position[0], end_position[0]); | ||
56 | S.zoom.coords[1] = fmax (start_position[0], end_position[0]); | ||
57 | S.zoom.coords[2] = fmin (start_position[1], end_position[1]); | ||
58 | S.zoom.coords[3] = fmax (start_position[1], end_position[1]); | ||
59 | |||
60 | reshape (S.viewport.w, S.viewport.h); | ||
61 | |||
62 | glutPostRedisplay (); | ||
63 | |||
64 | return; | ||
65 | } | ||