модификация обработчика мыши
This commit is contained in:
parent
572957a21f
commit
c4362ade85
64
src/main.cpp
64
src/main.cpp
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Отключение атрибутов
|
// Отключение атрибутов
|
||||||
|
Loading…
x
Reference in New Issue
Block a user