#include "main.h" #include #include #include #define ANGLE ((float)0x01 / 0xff * 2 * GLM_PI) unsigned char selected_axis = 0; int window_width; int window_height; unsigned char animate_index=0; versor q = GLM_QUAT_IDENTITY_INIT; vec3 axis[3] = { {1, 0, 0}, {0, 1, 0}, {0, 0, 1}, }; extern struct projection projection; void __key_callback_input( GLFWwindow *window, int key, int scancode, int action, int mods) { if (action != GLFW_PRESS) return; if (GLFW_KEY_0 < key && key <= GLFW_KEY_9) { unsigned char selected_coord; selected_coord = key - GLFW_KEY_0 - 1; if (selected_coord >= projection.m) return; if (selected_coord == projection.x) return; if (selected_coord == projection.y) return; if (selected_coord == projection.z) return; selected_coord = projection.w; } if (projection.w >= projection.m) return; switch (key) { unsigned char tmp; case GLFW_KEY_I: tmp = projection.w; projection.w = projection.x; projection.x = tmp; animate_index=1; break; case GLFW_KEY_O: tmp = projection.w; projection.w = projection.y; projection.y = tmp; animate_index=2; break; case GLFW_KEY_P: tmp = projection.w; projection.w = projection.z; projection.z = tmp; animate_index=3; break; } return; } void __window_callback_input(GLFWwindow *window, int w, int h) { int m; m = (w < h) ? w : h; window_width = w; window_height = h; glViewport((w - m) / 2, (h - m) / 2, m, m); } void __mouse_callback_input( GLFWwindow *window, int button, int action, int mods) { unsigned char green_value; double xpos, ypos; if (button != GLFW_MOUSE_BUTTON_LEFT || action != GLFW_PRESS) return; glfwGetCursorPos(window, &xpos, &ypos); glReadPixels((int)xpos, (int)(window_height - ypos), 1, 1, GL_GREEN, GL_UNSIGNED_BYTE, &green_value); switch (green_value) { case 0xD3: case 0xD4: case 0xD5: selected_axis = green_value - 0xD3; } } void __scroll_callback_input(GLFWwindow *window, double xoffset, double yoffset) { versor p = GLM_QUAT_IDENTITY_INIT; versor r = GLM_QUAT_IDENTITY_INIT; //glm_quatv(p, yoffset * ANGLE, axis[selected_axis]); glm_quatv(p, yoffset * ANGLE * 2, (vec3){-1,0,0}); glm_quatv(r, xoffset * ANGLE * 2, (vec3){0,1,0}); glm_quat_mul(p, q, q); glm_quat_mul(r, q, q); glm_quat_rotatev(p, axis[0], axis[0]); glm_quat_rotatev(p, axis[1], axis[1]); glm_quat_rotatev(p, axis[2], axis[2]); glm_quat_rotatev(r, axis[0], axis[0]); glm_quat_rotatev(r, axis[1], axis[1]); glm_quat_rotatev(r, axis[2], axis[2]); } quat_t poll_input(window_t window) { versor p = GLM_QUAT_IDENTITY_INIT; if (glfwGetKey((GLFWwindow *)window, 'Q') == GLFW_PRESS) { glm_quatv(p, ANGLE, axis[0]); goto end; } if (glfwGetKey((GLFWwindow *)window, 'W') == GLFW_PRESS) { glm_quatv(p, -ANGLE, axis[0]); goto end; } if (glfwGetKey((GLFWwindow *)window, 'A') == GLFW_PRESS) { glm_quatv(p, ANGLE, axis[1]); goto end; } if (glfwGetKey((GLFWwindow *)window, 'S') == GLFW_PRESS) { glm_quatv(p, -ANGLE, axis[1]); goto end; } if (glfwGetKey((GLFWwindow *)window, 'Z') == GLFW_PRESS) { glm_quatv(p, ANGLE, axis[2]); goto end; } if (glfwGetKey((GLFWwindow *)window, 'X') == GLFW_PRESS) { glm_quatv(p, -ANGLE, axis[2]); goto end; } end: glm_quat_mul(p, q, q); glm_quat_rotatev(p, axis[0], axis[0]); glm_quat_rotatev(p, axis[1], axis[1]); glm_quat_rotatev(p, axis[2], axis[2]); glm_quat_normalize(q); // LOG INFO if(0) { printf("QUAT: %2.5f %2.5f %2.5f %2.5f\n", q[0], q[1], q[2], q[3]); printf("PROY: %3d %3d %3d (%3d)\n", projection.x, projection.y, projection.z, projection.w ); printf("\n"); } return q; }