diff --git a/src/inputHandler.c b/src/inputHandler.c new file mode 100644 index 0000000..32de687 --- /dev/null +++ b/src/inputHandler.c @@ -0,0 +1,192 @@ +#include "inputHandler.h" + +void handleCameraTravel() +{ + if (cameraTraveling) + { + vec3 delta; + + vec3Subtract(&delta, &cameraTravelPosition, &cameraPosition); + + if (vec3Length(&delta) < 0.0001) + cameraTraveling = false; + + vec3Multiply(&delta, &delta, 0.1); + vec3Add(&cameraPosition, &cameraPosition, &delta); + } +} + +void travelCamera(vec3 newPosition) +{ + cameraTravelPosition = newPosition; + cameraTraveling = true; +} + +/** + * Input handler for camera movement. + * */ +float chalkboardYPosition = 0.0f; +void handleInputs(double deltaTime) +{ + assert(window != NULL); + + if (glfwGetKey(window, GLFW_KEY_1) == GLFW_PRESS) + { + travelCamera((vec3){0.0f, 1.7f, 2.4f}); + } + if (glfwGetKey(window, GLFW_KEY_2) == GLFW_PRESS) + { + travelCamera((vec3){3.3f, 3.4f, -11.0f}); + } + if (glfwGetKey(window, GLFW_KEY_3) == GLFW_PRESS) + { + travelCamera((vec3){-3.0f, 2.9f, -7.5f}); + } + if (glfwGetKey(window, GLFW_KEY_4) == GLFW_PRESS) + { + travelCamera((vec3){-0.6f, 2.1f, -4.5f}); + } + if (glfwGetKey(window, GLFW_KEY_5) == GLFW_PRESS) + { + travelCamera((vec3){-10.6f, 22.1f, -4.5f}); + } + if (glfwGetKey(window, GLFW_KEY_6) == GLFW_PRESS) + { + travelCamera((vec3){3.574698f, 0.966039f, 3.852249f}); + } + if (glfwGetKey(window, GLFW_KEY_7) == GLFW_PRESS) + { + travelCamera((vec3){0.324839f, 1.325346f, 3.798471f}); + } + if (!cameraTraveling) + { + if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) + { + vec3 delta; + + vec3Subtract(&delta, &origin, &cameraPosition); + vec3Normalise(&delta, &delta); + vec3Multiply(&delta, &delta, -10); + vec3Multiply(&delta, &delta, deltaTime); + + vec3Add(&cameraPosition, &cameraPosition, &delta); + } + if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) + { + vec3 delta; + vec3Subtract(&delta, &origin, &cameraPosition); + if (vec3Length(&delta) > 0.1) + { + vec3Normalise(&delta, &delta); + vec3Multiply(&delta, &delta, 10); + vec3Multiply(&delta, &delta, deltaTime); + + vec3Add(&cameraPosition, &cameraPosition, &delta); + } + } + if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) + { + vec4 delta; + mat4 transform; + + vec3Subtract((vec3 *)&delta, &origin, &cameraPosition); + delta.y = 0; + vec3Normalise((vec3 *)&delta, (vec3 *)&delta); + vec3Multiply((vec3 *)&delta, (vec3 *)&delta, -10); + + rotationY(&transform, pi / 2); + multiplyAny((GLfloat *)&delta, (GLfloat *)&transform, (GLfloat *)&delta, 4, 4, 1); + + vec3Multiply((vec3 *)&delta, (vec3 *)&delta, deltaTime); + + vec3Add(&cameraPosition, &cameraPosition, (vec3 *)&delta); + } + if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) + { + vec4 delta; + mat4 transform; + + vec3Subtract((vec3 *)&delta, &origin, &cameraPosition); + delta.y = 0; + vec3Normalise((vec3 *)&delta, (vec3 *)&delta); + vec3Multiply((vec3 *)&delta, (vec3 *)&delta, 10); + + rotationY(&transform, pi / 2); + multiplyAny((GLfloat *)&delta, (GLfloat *)&transform, (GLfloat *)&delta, 4, 4, 1); + + vec3Multiply((vec3 *)&delta, (vec3 *)&delta, deltaTime); + + vec3Add(&cameraPosition, &cameraPosition, (vec3 *)&delta); + } + if (glfwGetKey(window, GLFW_KEY_F) == GLFW_PRESS || glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) + { + cameraPosition.y -= deltaTime * 10; + } + if (glfwGetKey(window, GLFW_KEY_R) == GLFW_PRESS || glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) + { + cameraPosition.y += deltaTime * 10; + } + } + + SceneNode *chalkboard = findNodeByName("myChalkboard1", rootNode); + if (!chalkboard) + return; + if (glfwGetKey(window, GLFW_KEY_X) == GLFW_PRESS) + { + chalkboardYPosition += deltaTime * 1.0f; + chalkboardYPosition = fminf(chalkboardYPosition, 1.0f); + chalkboard->transformation = (mat4){1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, chalkboardYPosition, 0.0f, 1.0f}; + updateSceneNode(chalkboard, &findNodeByName("myChalkboard", rootNode)->worldTransformation); + } + if (glfwGetKey(window, GLFW_KEY_C) == GLFW_PRESS) + { + chalkboardYPosition -= deltaTime * 1.0f; + chalkboardYPosition = fmaxf(chalkboardYPosition, 0.0f); + chalkboard->transformation = (mat4){1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, chalkboardYPosition, 0.0f, 1.0f}; + updateSceneNode(chalkboard, &findNodeByName("myChalkboard", rootNode)->worldTransformation); + } + + if (glfwGetKey(window, GLFW_KEY_L) == GLFW_PRESS) + { + objectPosition.x += deltaTime * 10; + } + if (glfwGetKey(window, GLFW_KEY_J) == GLFW_PRESS) + { + objectPosition.x -= deltaTime * 10; + } + if (glfwGetKey(window, GLFW_KEY_I) == GLFW_PRESS) + { + objectPosition.z += deltaTime * 10; + } + if (glfwGetKey(window, GLFW_KEY_K) == GLFW_PRESS) + { + objectPosition.z -= deltaTime * 10; + } + if (glfwGetKey(window, GLFW_KEY_O) == GLFW_PRESS) + { + radius += deltaTime * 10; + } + if (glfwGetKey(window, GLFW_KEY_U) == GLFW_PRESS) + { + radius -= deltaTime * 10; + } +} + +// input handler to quit with ESC +void keyboardHandler(GLFWwindow *window, int key, int scancode, int action, int mods) +{ + assert(window != NULL); + if (action == GLFW_PRESS) + { + if (key == GLFW_KEY_ESCAPE) + { + exitRequested = true; + } + } +} \ No newline at end of file diff --git a/src/inputHandler.h b/src/inputHandler.h new file mode 100644 index 0000000..88edf8c --- /dev/null +++ b/src/inputHandler.h @@ -0,0 +1,24 @@ +#ifndef INPUTHANDLER_H +#define INPUTHANDLER_H + +#include +#include "matrixMath.h" +#include "sceneGraph.h" + +extern const GLfloat pi; +extern bool exitRequested; +extern GLFWwindow *window; +extern vec3 origin; +extern vec3 cameraPosition; +extern vec3 cameraTravelPosition; +extern vec3 objectPosition; +extern GLfloat radius; +extern SceneNode *rootNode; +extern bool cameraTraveling; + +void handleInputs(double deltaTime); +void keyboardHandler(GLFWwindow *window, int key, int scancode, int action, int mods); +void handleCameraTravel(); +void travelCamera(vec3 newPosition); + +#endif \ No newline at end of file diff --git a/src/main.c b/src/main.c index 87c0d2b..540b84b 100644 --- a/src/main.c +++ b/src/main.c @@ -1,23 +1,21 @@ #include - +#include +#include +#include +#include #include #include +#include #include "vertexShader.c" #include "fragmentShader.c" - #include "objectHandler.h" #include "matrixMath.h" #include "transformation.h" #include "wavefrontobj.h" #include "sceneGraph.h" #include "shader.h" - -#include -#include -#include -#include -#include +#include "inputHandler.c" GLuint program; @@ -58,163 +56,6 @@ mat4 viewingTransformation; // Define a global scene graph root node SceneNode* rootNode; -void handleCameraTravel() { - if (cameraTraveling) { - vec3 delta; - - vec3Subtract(&delta, &cameraTravelPosition, &cameraPosition); - - if (vec3Length(&delta) < 0.0001) cameraTraveling = false; - - vec3Multiply(&delta, &delta, 0.1); - vec3Add(&cameraPosition, &cameraPosition, &delta); - } -} - -void travelCamera(vec3 newPosition) { - cameraTravelPosition = newPosition; - cameraTraveling = true; -} - -/** - * Input handler for camera movement. - * */ -float chalkboardYPosition = 0.0f; -void handleInputs(double deltaTime) { - assert(window != NULL); - - if (glfwGetKey(window, GLFW_KEY_1) == GLFW_PRESS) { - travelCamera((vec3){0.0f, 1.7f, 2.4f}); - } - if (glfwGetKey(window, GLFW_KEY_2) == GLFW_PRESS) { - travelCamera((vec3){3.3f, 3.4f, -11.0f}); - } - if (glfwGetKey(window, GLFW_KEY_3) == GLFW_PRESS) { - travelCamera((vec3){-3.0f, 2.9f, -7.5f}); - } - if (glfwGetKey(window, GLFW_KEY_4) == GLFW_PRESS) { - travelCamera((vec3){-0.6f, 2.1f, -4.5f}); - } - if (glfwGetKey(window, GLFW_KEY_5) == GLFW_PRESS) { - travelCamera((vec3){-10.6f, 22.1f, -4.5f}); - } - if (glfwGetKey(window, GLFW_KEY_6) == GLFW_PRESS) { - travelCamera((vec3){3.574698f, 0.966039f, 3.852249f}); - } - if (!cameraTraveling) { - if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) { - vec3 delta; - - vec3Subtract(&delta, &origin, &cameraPosition); - vec3Normalise(&delta, &delta); - vec3Multiply(&delta, &delta, -10); - vec3Multiply(&delta, &delta, deltaTime); - - vec3Add(&cameraPosition, &cameraPosition, &delta); - } - if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) { - vec3 delta; - vec3Subtract(&delta, &origin, &cameraPosition); - if (vec3Length(&delta) > 0.1) { - vec3Normalise(&delta, &delta); - vec3Multiply(&delta, &delta, 10); - vec3Multiply(&delta, &delta, deltaTime); - - vec3Add(&cameraPosition, &cameraPosition, &delta); - } - - } - if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) { - vec4 delta; - mat4 transform; - - vec3Subtract((vec3*)&delta, &origin, &cameraPosition); - delta.y = 0; - vec3Normalise((vec3*)&delta, (vec3*)&delta); - vec3Multiply((vec3*)&delta, (vec3*)&delta, -10); - - rotationY(&transform, pi / 2); - multiplyAny((GLfloat*)&delta, (GLfloat*)&transform, (GLfloat*)&delta, 4, 4, 1); - - vec3Multiply((vec3*)&delta, (vec3*)&delta, deltaTime); - - vec3Add(&cameraPosition, &cameraPosition, (vec3*)&delta); - } - if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) { - vec4 delta; - mat4 transform; - - vec3Subtract((vec3*)&delta, &origin, &cameraPosition); - delta.y = 0; - vec3Normalise((vec3*)&delta, (vec3*)&delta); - vec3Multiply((vec3*)&delta, (vec3*)&delta, 10); - - rotationY(&transform, pi / 2); - multiplyAny((GLfloat*)&delta, (GLfloat*)&transform, (GLfloat*)&delta, 4, 4, 1); - - vec3Multiply((vec3*)&delta, (vec3*)&delta, deltaTime); - - vec3Add(&cameraPosition, &cameraPosition, (vec3*)&delta); - } - if (glfwGetKey(window, GLFW_KEY_F) == GLFW_PRESS || glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) { - cameraPosition.y -= deltaTime * 10; - } - if (glfwGetKey(window, GLFW_KEY_R) == GLFW_PRESS || glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) { - cameraPosition.y += deltaTime * 10; - } - } - - SceneNode* chalkboard = findNodeByName("myChalkboard1", rootNode); - if (!chalkboard) return; - if (glfwGetKey(window, GLFW_KEY_X) == GLFW_PRESS) { - chalkboardYPosition += deltaTime * 1.0f; - chalkboardYPosition = fminf(chalkboardYPosition, 1.0f); - chalkboard->transformation = (mat4){1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, chalkboardYPosition, 0.0f, 1.0f}; - updateSceneNode(chalkboard, &findNodeByName("myChalkboard", rootNode)->worldTransformation); - } - if (glfwGetKey(window, GLFW_KEY_C) == GLFW_PRESS) { - chalkboardYPosition -= deltaTime * 1.0f; - chalkboardYPosition = fmaxf(chalkboardYPosition, 0.0f); - chalkboard->transformation = (mat4){1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, chalkboardYPosition, 0.0f, 1.0f}; - updateSceneNode(chalkboard, &findNodeByName("myChalkboard", rootNode)->worldTransformation); - } - - if (glfwGetKey(window, GLFW_KEY_L) == GLFW_PRESS) { - objectPosition.x += deltaTime * 10; - } - if (glfwGetKey(window, GLFW_KEY_J) == GLFW_PRESS) { - objectPosition.x -= deltaTime * 10; - } - if (glfwGetKey(window, GLFW_KEY_I) == GLFW_PRESS) { - objectPosition.z += deltaTime * 10; - } - if (glfwGetKey(window, GLFW_KEY_K) == GLFW_PRESS) { - objectPosition.z -= deltaTime * 10; - } - if (glfwGetKey(window, GLFW_KEY_O) == GLFW_PRESS) { - radius += deltaTime * 10; - } - if (glfwGetKey(window, GLFW_KEY_U) == GLFW_PRESS) { - radius -= deltaTime * 10; - } -} - -// input handler to quit with ESC -void keyboardHandler(GLFWwindow* window, int key, int scancode, int action, int mods) { - assert(window != NULL); - if (action == GLFW_PRESS) { - if (key == GLFW_KEY_ESCAPE) { - exitRequested = true; - } - } -} - void renderNode(SceneNode* node) { assert(node != NULL);