bool OpenGP::TrackballWindow::mouse_move_callback(double x_window, double y_window) { x_window *= scale_factor_retina(); y_window *= scale_factor_retina(); // mLogger() << x_window << y_window; bool left_down = (glfwGetMouseButton(_window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS); bool middle_down = (glfwGetMouseButton(_window, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS); Vec3 pos_window(x_window, y_window, 0.0f); Vec3 pos_clip = window_to_clip(pos_window); bool managed = false; // Rotate if (left_down && _mod_current == GLFW_MOD_NONE) { scene.trackball_camera.rotate(pos_clip); managed = true; } // Pan if (middle_down || (left_down && _mod_current == GLFW_MOD_SUPER)) { scene.trackball_camera.translate(pos_clip, old_pos_clip); managed = true; } // Scale if (left_down && (_mod_current == GLFW_MOD_SHIFT)) { scene.trackball_camera.scale(5.0f * (float)(pos_clip(1) - old_pos_clip(1))); managed = true; } old_pos_clip = pos_clip; return managed; }
bool OpenGP::TrackballWindow::mouse_press_callback(int button, int action, int mods) { if( action == GLFW_RELEASE ){ static auto before = std::chrono::system_clock::now(); auto now = std::chrono::system_clock::now(); double diff_ms = std::chrono::duration <double, std::milli> (now - before).count(); before = now; if(diff_ms>10 && diff_ms<200){ action = GLFW_DOUBLECLICK; // mDebug() << "doubleclick"; } } if ((button == GLFW_MOUSE_BUTTON_LEFT) && (action == GLFW_PRESS)) { double x_window, y_window; getFramebufferCursorPos(&x_window, &y_window); Vec3 pos_window(x_window, y_window, 0.0f); Vec3 pos_clip = window_to_clip(pos_window); scene.trackball_camera.begin_rotate(pos_clip); return true; } if ((button == GLFW_MOUSE_BUTTON_LEFT) && (action == GLFW_RELEASE)) { scene.trackball_camera.finish_rotate(); return true; } if ((button == GLFW_MOUSE_BUTTON_LEFT) && (action == GLFW_DOUBLECLICK) && (mods == GLFW_MOD_NONE)) { double x_window, y_window; getFramebufferCursorPos(&x_window,&y_window); /// Fetch the depth by querying the OpenGL depth buffer float z_window = 1.0f; glReadBuffer(GL_FRONT); glReadPixels(int(x_window), _height - int(y_window), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z_window); /// If we clicked on something visible focus the trackball (center it) on the current point if (z_window != 1.0f) { Vec3 pos_window(x_window, y_window, z_window); Vec3 pos_clip = window_to_clip(pos_window); scene.trackball_camera.focus(pos_clip); } return true; } return false; }
static int test_position(window_t * win, display_t * disp) { int32_t x; int32_t y; int32_t dx; // stores the offset in case of windowsconfig_FRAME int32_t dy; // stores the offset in case of windowsconfig_FRAME // prepare TEST(0 == show_window(win)); WAITFOR(disp, isvisible_window(win)); TEST(0 == setpos_window(win, WINPOS_INIT_X+10, WINPOS_INIT_Y+10)); TEST(0 == setpos_window(win, WINPOS_INIT_X, WINPOS_INIT_Y)); WAITFOR(disp, pos_window(win, &x, &y) == 0 && x >= WINPOS_INIT_X+10); TEST(0 == pos_window(win, &x, &y)); dx = x - WINPOS_INIT_X; dy = y - WINPOS_INIT_Y; TEST(0 <= dx && dx <= 10); TEST(0 <= dy && dy <= 30); // TEST pos_window TEST(0 == pos_window(win, &x, &y)); TEST(WINPOS_INIT_X == x - dx); TEST(WINPOS_INIT_Y == y - dy); // TEST setpos_window TEST(0 == setpos_window(win, 200, 180)); WAITFOR(disp, pos_window(win, &x, &y) == 0 && x == 200 + dx); WAITFOR(disp, pos_window(win, &x, &y) == 0 && y == 180 + dy); TEST(0 == pos_window(win, &x, &y)); TEST(200 == x - dx); TEST(180 == y - dy); TEST(0 == setpos_window(win, WINPOS_INIT_X, WINPOS_INIT_Y)); WAITFOR(disp, pos_window(win, &x, &y) == 0 && x == WINPOS_INIT_X + dx); TEST(0 == pos_window(win, &x, &y)); TEST(WINPOS_INIT_X == x - dx); TEST(WINPOS_INIT_Y == y - dy); return 0; ONERR: return EINVAL; }