модификация обработчика мыши

This commit is contained in:
Ковалев Роман Евгеньевич 2023-04-03 17:33:03 +03:00 committed by re.kovalev
parent be2917546a
commit 68a8f4d0d0
1 changed files with 46 additions and 18 deletions

View File

@ -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;