]> git.lizzy.rs Git - shadowclad.git/commitdiff
Implement transform math to rotate movement direction
authoroutfrost <kotlet.bahn@gmail.com>
Wed, 3 Jun 2020 23:00:46 +0000 (01:00 +0200)
committeroutfrost <kotlet.bahn@gmail.com>
Wed, 3 Jun 2020 23:00:46 +0000 (01:00 +0200)
Makefile
src/engine/geometry.c
src/engine/geometry.h
src/engine/input.c [new file with mode: 0644]
src/engine/input.h [new file with mode: 0644]
src/game/player.c
src/game/player.h

index 79a7f48b4e8593b5d42deebd9ef9bf8610fcc93c..fe1e34a88d961739473677270684320cc8d961bb 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -4,9 +4,10 @@ BUILDDIR ?= target/$(PLATFORM)
 SRCDIR ?= src
 
 CPPFLAGS ::= -iquotesrc/ $(CPPFLAGS)
-CFLAGS ::= -g -std=c99 -Wall -Wextra -Wpedantic -Werror -Wno-error=unused-function $(CFLAGS)
+CFLAGS ::= -g -std=c99 -Wall -Wextra -Wpedantic -Werror \
+           -Wno-error=unused-function -Wno-error=unused-parameter $(CFLAGS)
 LDFLAGS ::= $(LDFLAGS)
-LDLIBS ::= -lGL -lGLEW -lglut -lassimp $(LDLIBS)
+LDLIBS ::= -lm -lGL -lGLEW -lglut -lassimp $(LDLIBS)
 
 # ######
 # Paths
index aa5de049407ae22e922b3b1fe83dbdc1e0d45d45..7af8c1cc47217c46249490f462374897acaa9492 100644 (file)
@@ -1,7 +1,12 @@
 #include "geometry.h"
 
+#include <math.h>
 #include <stddef.h>
 
+const float TAU = 6.28318530718f;
+
+
+
 Transform identity() {
        return (Transform) { .a1 = 1.0f, .a2 = 0.0f, .a3 = 0.0f, .a4 = 0.0f,
                             .b1 = 0.0f, .b2 = 1.0f, .b3 = 0.0f, .b4 = 0.0f,
@@ -34,6 +39,42 @@ void translate(Transform* transform, Vector3D vec) {
                *transform);
 }
 
+void rotate(Transform* transform, Vector3D axis, float angle) {
+       axis = normalized(axis);
+       float l = axis.x;
+       float m = axis.y;
+       float n = axis.z;
+       float sinA = sinf(angle);
+       float cosA = cosf(angle);
+       float omcA = 1 - cosA;
+       *transform = multiply(
+               (Transform) { l*l*omcA + cosA, m*l*omcA - n*sinA, n*l*omcA + m*sinA, 0.0f,
+                             l*m*omcA + n*sinA, m*m*omcA + cosA, n*m*omcA - l*sinA, 0.0f,
+                             l*n*omcA - m*sinA, m*n*omcA + l*sinA, n*n*omcA + cosA, 0.0f,
+                             0.0f, 0.0f, 0.0f, 1.0f },
+               *transform);
+}
+
+Vector3D applyTransform(Transform* transform, Vector3D vec) {
+       GLfloat* a = (GLfloat*) &transform;
+       GLfloat b[4] = { vec.x, vec.y, vec.z, 1.0f };
+       GLfloat c[4];
+
+       for (size_t row = 0; row < 4; ++row) {
+               c[row] =
+                       a[(row * 4) + 0] * b[0]
+                       + a[(row * 4) + 1] * b[1]
+                       + a[(row * 4) + 2] * b[2]
+                       + a[(row * 4) + 3] * b[3];
+       }
+       return (Vector3D) { c[0], c[1], c[2] };
+}
+
 Vector3D translationOf(Transform transform) {
        return (Vector3D) { transform.a4, transform.b4, transform.c4 };
 }
+
+Vector3D normalized(Vector3D vec) {
+       float magnitude = sqrtf(vec.x * vec.x + vec.y * vec.y + vec.z * vec.z);
+       return (Vector3D) {vec.x / magnitude, vec.y / magnitude, vec.z / magnitude};
+}
index cea05a64733854b312b4a4ecc80f567a6d0f9ed0..76e7cd0c8f6a8b9370a867c739f7271b4d64f225 100644 (file)
@@ -19,9 +19,14 @@ struct Transform {
        GLfloat d1, d2, d3, d4;
 };
 
+extern const float TAU;
+
 Transform identity();
 Transform multiply(Transform t1, Transform t2);
 void translate(Transform* transform, Vector3D vec);
+void rotate(Transform* transform, Vector3D axis, float angle);
+Vector3D applyTransform(Transform* transform, Vector3D vec);
 Vector3D translationOf(Transform transform);
+Vector3D normalized(Vector3D vec);
 
 #endif // GEOMETRY_H_
diff --git a/src/engine/input.c b/src/engine/input.c
new file mode 100644 (file)
index 0000000..30c3ea0
--- /dev/null
@@ -0,0 +1,16 @@
+#include "input.h"
+
+#include "player.h"
+
+void onKeyPressed(unsigned char key, int x, int y) {
+       switch (key) {
+               case 'w':
+               case 's':
+               case 'a':
+               case 'd':
+                       //playerMovementInput();
+                       break;
+               default:
+                       break;
+       }
+}
diff --git a/src/engine/input.h b/src/engine/input.h
new file mode 100644 (file)
index 0000000..0ae694f
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef INPUT_H_
+#define INPUT_H_
+
+void onKeyPressed(unsigned char key, int x, int y);
+
+#endif // INPUT_H_
index 2b091fde62d266fb6448abedce823bec6f32478e..ed0dab919b5b5abb0fc2a5eefd780a1f3c68d4d5 100644 (file)
@@ -17,3 +17,10 @@ void spawnPlayer(Transform transform) {
        playerCharacter->transform = transform;
        reparentScene(playerCharacter, currentScene);
 }
+
+void playerMovementInput(float x, float y) {
+       Transform rotation = identity();
+       rotate(&rotation, (Vector3D) { 0.0f, 1.0f, 0.0f }, TAU / 8.0f);
+       Vector3D movementDirection = (Vector3D) { x, 0.0f, -y };
+       movementDirection = normalized(applyTransform(&rotation, movementDirection));
+}
index 184406998c30e38c15819318b339133bf444b879..ab18adec710737823a54c7faad783ac15b7b2c8d 100644 (file)
@@ -9,5 +9,6 @@ extern Scene* playerCharacter;
 
 void initPlayer();
 void spawnPlayer(Transform transform);
+void playerMovementInput(float x, float y);
 
 #endif // PLAYER_H_