- prev_mx = x;
- prev_my = y;
- bnstate[bidx] = down;
-
- if(bidx == 0) {
- if(down) {
- sel_gear = pick_gear(x, y);
- sel_hit_pos = pick_hit.pos;
- } else {
- sel_gear = 0;
- }
- }
-
- if(bidx == 3 || bidx == 4) { /* wheel */
- if(hover_gear) {
- float dz = bidx == 4 ? 1 : -1;
- hover_gear->set_position(hover_gear->get_position() + hover_gear->get_axis() * dz);
- machine->invalidate_meshing();
- }
- }
-}
-
-static void motion(int x, int y)
-{
- int dx = x - prev_mx;
- int dy = y - prev_my;
- prev_mx = x;
- prev_my = y;
-
- if(!dx && !dy) return;
-
- if(sel_gear) {
- float speed = 0.5;
- Vec3 offs = Vec3(dx * speed, -dy * speed, 0.0);
- offs = sel_gear->get_dir_matrix() * offs;
-
- sel_gear->set_position(sel_gear->get_position() + offs);
- machine->invalidate_meshing();
-
- } else {
- if(bnstate[0]) {
- cam_theta += dx * 0.5;
- cam_phi += dy * 0.5;
-
- if(cam_phi < -90) cam_phi = -90;
- if(cam_phi > 90) cam_phi = 90;
- glutPostRedisplay();
- }
- if(bnstate[2]) {
- cam_dist += dy * 0.01;
- if(cam_dist < 0.0) cam_dist = 0.0;
- glutPostRedisplay();
- }
- }
-}
-
-static void passive_motion(int x, int y)
-{
- prev_mx = x;
- prev_my = y;
-}
-
-static Gear *pick_gear(int x, int y)
-{
- double pt[3];
- double viewmat[16], projmat[16];
- int vp[4];
- Ray ray;
-
- y = win_height - y;
-
- glGetDoublev(GL_MODELVIEW_MATRIX, viewmat);
- glGetDoublev(GL_PROJECTION_MATRIX, projmat);
- glGetIntegerv(GL_VIEWPORT, vp);
-
- gluUnProject(x, y, 0, viewmat, projmat, vp, pt, pt + 1, pt + 2);
- ray.origin = Vec3(pt[0], pt[1], pt[2]) * 1000.0f;
-
- gluUnProject(x, y, 1, viewmat, projmat, vp, pt, pt + 1, pt + 2);
- ray.dir = Vec3(pt[0], pt[1], pt[2]) * 1000.0f - ray.origin;
-
- return machine->intersect_gear(ray, &pick_hit);