Inputhandelierer outgelagert yessir

This commit is contained in:
JonasJan2 2024-06-24 18:33:32 +02:00
parent be78abddcc
commit a9d658502a
3 changed files with 222 additions and 165 deletions

192
src/inputHandler.c Normal file
View File

@ -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;
}
}
}

24
src/inputHandler.h Normal file
View File

@ -0,0 +1,24 @@
#ifndef INPUTHANDLER_H
#define INPUTHANDLER_H
#include <GLFW/glfw3.h>
#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

View File

@ -1,23 +1,21 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdbool.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <assert.h>
#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 <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdbool.h>
#include <assert.h>
#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);