diff options
author | Scott Moreau <oreaus@gmail.com> | 2012-04-24 11:28:26 -0600 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-04-25 10:52:43 -0400 |
commit | 7890c4d36dbec14d44109ead6fb12adfece47a7b (patch) | |
tree | 2f17e5f69a8fa9310613f5fb99207f16d690c915 | |
parent | e10d27901789facc6288f82afe9f95617146f063 (diff) |
gears: Allow model rotation with pointer
-rw-r--r-- | clients/gears.c | 69 |
1 files changed, 65 insertions, 4 deletions
diff --git a/clients/gears.c b/clients/gears.c index ca1fda2..c432bc5 100644 --- a/clients/gears.c +++ b/clients/gears.c @@ -36,6 +36,7 @@ #include <EGL/egl.h> #include <EGL/eglext.h> +#include <linux/input.h> #include <wayland-client.h> #include "window.h" @@ -51,6 +52,14 @@ struct gears { EGLContext context; GLfloat angle; + struct { + GLfloat rotx; + GLfloat roty; + } view; + + int button_down; + int last_x, last_y; + GLint gear_list[3]; }; @@ -212,10 +221,54 @@ static const struct wl_callback_listener listener = { frame_callback }; +static int +motion_handler(struct widget *widget, struct input *input, + uint32_t time, int32_t x, int32_t y, void *data) +{ + struct gears *gears = data; + int offset_x, offset_y; + float step = 0.5; + + if (gears->button_down) { + offset_x = x - gears->last_x; + offset_y = y - gears->last_y; + gears->last_x = x; + gears->last_y = y; + gears->view.roty += offset_x * step; + gears->view.rotx += offset_y * step; + if (gears->view.roty >= 360) + gears->view.roty = gears->view.roty - 360; + if (gears->view.roty <= 0) + gears->view.roty = gears->view.roty + 360; + if (gears->view.rotx >= 360) + gears->view.rotx = gears->view.rotx - 360; + if (gears->view.rotx <= 0) + gears->view.rotx = gears->view.rotx + 360; + } + + return POINTER_LEFT_PTR; +} + +static void +button_handler(struct widget *widget, struct input *input, + uint32_t time, int button, int state, void *data) +{ + struct gears *gears = data; + + if (button == BTN_LEFT) { + if (state) { + gears->button_down = 1; + input_get_position(input, + &gears->last_x, &gears->last_y); + } else { + gears->button_down = 0; + } + } +} + static void redraw_handler(struct widget *widget, void *data) { - GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0; struct rectangle window_allocation; struct rectangle allocation; struct wl_callback *callback; @@ -245,9 +298,8 @@ redraw_handler(struct widget *widget, void *data) glTranslatef(0.0, 0.0, -50); - glRotatef(view_rotx, 1.0, 0.0, 0.0); - glRotatef(view_roty, 0.0, 1.0, 0.0); - glRotatef(view_rotz, 0.0, 0.0, 1.0); + glRotatef(gears->view.rotx, 1.0, 0.0, 0.0); + glRotatef(gears->view.roty, 0.0, 1.0, 0.0); glPushMatrix(); glTranslatef(-3.0, -2.0, 0.0); @@ -340,6 +392,13 @@ gears_create(struct display *display) glEndList(); } + gears->button_down = 0; + gears->last_x = 0; + gears->last_y = 0; + + gears->view.rotx = 20.0; + gears->view.roty = 30.0; + glEnable(GL_NORMALIZE); glMatrixMode(GL_PROJECTION); @@ -357,6 +416,8 @@ gears_create(struct display *display) window_set_user_data(gears->window, gears); widget_set_resize_handler(gears->widget, resize_handler); widget_set_redraw_handler(gears->widget, redraw_handler); + widget_set_button_handler(gears->widget, button_handler); + widget_set_motion_handler(gears->widget, motion_handler); window_set_keyboard_focus_handler(gears->window, keyboard_focus_handler); |