示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
文件: window.c 项目: je-so/js-projekt
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;
}