модификация обработчика мыши
This commit is contained in:
parent
be2917546a
commit
68a8f4d0d0
52
src/main.cpp
52
src/main.cpp
|
@ -61,23 +61,34 @@ void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
||||||
Camera::current().setPerspective(CAMERA_FOVy, (float)width/height);
|
Camera::current().setPerspective(CAMERA_FOVy, (float)width/height);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool firstMouse = true;
|
// Данные о мыши
|
||||||
float lastX, lastY;
|
struct Mouse
|
||||||
|
{
|
||||||
|
float x = 0, y = 0; // Координаты курсора
|
||||||
|
float prev_x = 0, prev_y = 0; // Координаты курсора на предыдущем кадре
|
||||||
|
uint16_t left = 040100, right = 040100; // Состояние кнопок
|
||||||
|
} mouse;
|
||||||
|
|
||||||
|
void process_mouse_button(uint16_t& button)
|
||||||
|
{
|
||||||
|
if ((++button & 037777) == 037777)
|
||||||
|
button &= 0140100;
|
||||||
|
}
|
||||||
|
|
||||||
void mouse_callback(GLFWwindow* window, double xpos, double ypos)
|
void mouse_callback(GLFWwindow* window, double xpos, double ypos)
|
||||||
{
|
{
|
||||||
if (firstMouse)
|
mouse.x = xpos;
|
||||||
{
|
mouse.y = ypos;
|
||||||
lastX = xpos;
|
|
||||||
lastY = ypos;
|
|
||||||
firstMouse = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::vec2 offset(xpos - lastX, lastY - ypos);
|
void mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
|
||||||
lastX = xpos;
|
{
|
||||||
lastY = ypos;
|
uint16_t& mouse_button = (button == GLFW_MOUSE_BUTTON_LEFT)?mouse.left:mouse.right;
|
||||||
|
|
||||||
Camera::current().rotate(offset);
|
if (action == GLFW_PRESS && !(mouse_button & 0100000))
|
||||||
|
mouse_button = 0100000;
|
||||||
|
else if (action == GLFW_RELEASE)
|
||||||
|
mouse_button = 040000;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
|
@ -115,6 +126,7 @@ int main(void)
|
||||||
|
|
||||||
// Установка callback-функции для мыши и камеры
|
// Установка callback-функции для мыши и камеры
|
||||||
glfwSetCursorPosCallback(window, mouse_callback);
|
glfwSetCursorPosCallback(window, mouse_callback);
|
||||||
|
glfwSetMouseButtonCallback(window, mouse_button_callback);
|
||||||
|
|
||||||
// Загрузка функций OpenGL с помощью GLAD
|
// Загрузка функций OpenGL с помощью GLAD
|
||||||
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
|
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
|
||||||
|
@ -442,9 +454,13 @@ int main(void)
|
||||||
scene.render(gShader, material_data);
|
scene.render(gShader, material_data);
|
||||||
rectangle.render(gShader, material_data);
|
rectangle.render(gShader, material_data);
|
||||||
|
|
||||||
|
// Выбор объекта
|
||||||
|
if (mouse.left == 0100000)
|
||||||
|
{
|
||||||
glReadBuffer(GL_COLOR_ATTACHMENT4);
|
glReadBuffer(GL_COLOR_ATTACHMENT4);
|
||||||
glReadPixels(lastX, WINDOW_HEIGHT-lastY, 1, 1, GL_RGB_INTEGER, GL_UNSIGNED_INT, &selected);
|
glReadPixels(mouse.x, WINDOW_HEIGHT-mouse.y, 1, 1, GL_RGB_INTEGER, GL_UNSIGNED_INT, &selected);
|
||||||
std::cout << (void*) selected.value << ' ' << selected.etc << '\n';
|
std::cout << (void*) selected.value << ' ' << selected.etc << '\n';
|
||||||
|
}
|
||||||
|
|
||||||
// Активируем буфер SSAO
|
// Активируем буфер SSAO
|
||||||
ssaoBuffer.use();
|
ssaoBuffer.use();
|
||||||
|
@ -543,10 +559,22 @@ int main(void)
|
||||||
bulbShader.use();
|
bulbShader.use();
|
||||||
Light::render(bulbShader, material_data);
|
Light::render(bulbShader, material_data);
|
||||||
|
|
||||||
|
// Дополнительная обработка мыши
|
||||||
|
process_mouse_button(mouse.left);
|
||||||
|
process_mouse_button(mouse.right);
|
||||||
|
mouse.prev_x = mouse.x;
|
||||||
|
mouse.prev_y = mouse.y;
|
||||||
|
|
||||||
// Представление содержимого буфера цепочки показа на окно
|
// Представление содержимого буфера цепочки показа на окно
|
||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
// Обработка системных событий
|
// Обработка системных событий
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
|
|
||||||
|
// Поворот камеры
|
||||||
|
if (mouse.right & 0100000
|
||||||
|
&& mouse.x != mouse.prev_x
|
||||||
|
&& mouse.y != mouse.prev_y)
|
||||||
|
Camera::current().rotate(glm::vec2(mouse.x - mouse.prev_x, mouse.prev_y - mouse.y));
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue