#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; versor q = GLM_QUAT_IDENTITY_INIT; vec3 axis[3] = { {1, 0, 0}, {0, 1, 0}, {0, 0, 1}, }; 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 ) { printf("%d\n", key-GLFW_KEY_0 ); } } 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; glm_quatv(p, yoffset*ANGLE, axis[selected_axis]); 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]); } 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 ); return q; }