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

This commit is contained in:
parent 572957a21f
commit c4362ade85

View File

@ -27,25 +27,36 @@ void framebuffer_size_callback(GLFWwindow* window, int width, int height)
Camera camera(800.0f/600.0f); Camera camera(800.0f/600.0f);
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);
lastX = xpos;
lastY = ypos;
camera.rotate(offset);
} }
void mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
{
uint16_t& mouse_button = (button == GLFW_MOUSE_BUTTON_LEFT)?mouse.left:mouse.right;
if (action == GLFW_PRESS && !(mouse_button & 0100000))
mouse_button = 0100000;
else if (action == GLFW_RELEASE)
mouse_button = 040000;
}
int main(void) int main(void)
{ {
GLFWwindow* window; // Указатель на окно GLFW3 GLFWwindow* window; // Указатель на окно GLFW3
@ -79,6 +90,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))
@ -403,9 +415,13 @@ int main(void)
scene.render(gShader, material_data); scene.render(gShader, material_data);
rectangle.render(gShader, material_data); rectangle.render(gShader, material_data);
glReadBuffer(GL_COLOR_ATTACHMENT4); // Выбор объекта
glReadPixels(lastX, WINDOW_HEIGHT-lastY, 1, 1, GL_RGB_INTEGER, GL_UNSIGNED_INT, &selected); if (mouse.left == 0100000)
std::cout << (void*) selected.value << ' ' << selected.etc << '\n'; {
glReadBuffer(GL_COLOR_ATTACHMENT4);
glReadPixels(mouse.x, WINDOW_HEIGHT-mouse.y, 1, 1, GL_RGB_INTEGER, GL_UNSIGNED_INT, &selected);
std::cout << (void*) selected.value << ' ' << selected.etc << '\n';
}
// Активируем буфер SSAO // Активируем буфер SSAO
ssaoBuffer.use(); ssaoBuffer.use();
@ -511,10 +527,22 @@ int main(void)
for (int i = 0; i < lights_count; i++) for (int i = 0; i < lights_count; i++)
lights[i].render(bulbShader, material_data); lights[i].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.rotate(glm::vec2(mouse.x - mouse.prev_x, mouse.prev_y - mouse.y));
} }
// Отключение атрибутов // Отключение атрибутов