]> git.lizzy.rs Git - shadowclad.git/commitdiff
Implement rudimentary player movement; fix geometry logic bugs
authoroutfrost <kotlet.bahn@gmail.com>
Wed, 3 Jun 2020 23:59:20 +0000 (01:59 +0200)
committeroutfrost <kotlet.bahn@gmail.com>
Wed, 3 Jun 2020 23:59:20 +0000 (01:59 +0200)
Makefile
src/engine/geometry.c
src/engine/geometry.h
src/engine/input.c [deleted file]
src/engine/input.h [deleted file]
src/game/input.c [new file with mode: 0644]
src/game/input.h [new file with mode: 0644]
src/game/player.c
src/main.c

index fe1e34a88d961739473677270684320cc8d961bb..9a9e0e595674f5ad5a89e1e93e55a1a4b49055f5 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -22,6 +22,7 @@ sources ::= main.c \
             engine/scene.c \
             engine/tga.c \
             engine/ui.c \
+            game/input.c \
             game/level.c \
             game/player.c
 
index 7af8c1cc47217c46249490f462374897acaa9492..2cfb0aac767936b896d59531a70ad5555bc97f5c 100644 (file)
@@ -17,17 +17,19 @@ Transform identity() {
 Transform multiply(Transform t1, Transform t2) {
        GLfloat* a = (GLfloat*) &t1;
        GLfloat* b = (GLfloat*) &t2;
+       Transform result;
+       GLfloat* c = (GLfloat*) &result;
 
        for (size_t row = 0; row < 4; ++row) {
                for (size_t col = 0; col < 4; ++col) {
-                       b[(row * 4) + col] =
+                       c[(row * 4) + col] =
                                a[(row * 4) + 0] * b[(0 * 4) + col]
                                + a[(row * 4) + 1] * b[(1 * 4) + col]
                                + a[(row * 4) + 2] * b[(2 * 4) + col]
                                + a[(row * 4) + 3] * b[(3 * 4) + col];
                }
        }
-       return t2;
+       return result;
 }
 
 void translate(Transform* transform, Vector3D vec) {
@@ -47,6 +49,7 @@ void rotate(Transform* transform, Vector3D axis, float angle) {
        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,
@@ -55,7 +58,7 @@ void rotate(Transform* transform, Vector3D axis, float angle) {
                *transform);
 }
 
-Vector3D applyTransform(Transform* transform, Vector3D vec) {
+Vector3D applyTransform(Transform transform, Vector3D vec) {
        GLfloat* a = (GLfloat*) &transform;
        GLfloat b[4] = { vec.x, vec.y, vec.z, 1.0f };
        GLfloat c[4];
index 76e7cd0c8f6a8b9370a867c739f7271b4d64f225..ff45938aac5402d752d738c958161357975973b0 100644 (file)
@@ -25,7 +25,7 @@ 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 applyTransform(Transform transform, Vector3D vec);
 Vector3D translationOf(Transform transform);
 Vector3D normalized(Vector3D vec);
 
diff --git a/src/engine/input.c b/src/engine/input.c
deleted file mode 100644 (file)
index 30c3ea0..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#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
deleted file mode 100644 (file)
index 0ae694f..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef INPUT_H_
-#define INPUT_H_
-
-void onKeyPressed(unsigned char key, int x, int y);
-
-#endif // INPUT_H_
diff --git a/src/game/input.c b/src/game/input.c
new file mode 100644 (file)
index 0000000..447e92e
--- /dev/null
@@ -0,0 +1,22 @@
+#include "input.h"
+
+#include "player.h"
+
+void onKeyPressed(unsigned char key, int x, int y) {
+       switch (key) {
+               case 'w':
+                       playerMovementInput(0.0f, 1.0f);
+                       break;
+               case 's':
+                       playerMovementInput(0.0f, -1.0f);
+                       break;
+               case 'a':
+                       playerMovementInput(-1.0f, 0.0f);
+                       break;
+               case 'd':
+                       playerMovementInput(1.0f, 0.0f);
+                       break;
+               default:
+                       break;
+       }
+}
diff --git a/src/game/input.h b/src/game/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 ed0dab919b5b5abb0fc2a5eefd780a1f3c68d4d5..560a044b3fa5d8c20bccfb690de4ffb1e07c3393 100644 (file)
@@ -4,10 +4,14 @@
 #include "engine/render.h"
 
 Scene* playerCharacter;
+static Transform movementDirectionTransform;
 
 
 
 void initPlayer() {
+       movementDirectionTransform = identity();
+       rotate(&movementDirectionTransform, (Vector3D) { 0.0f, 1.0f, 0.0f }, - TAU / 8.0f);
+
        playerCharacter = newScene();
        cameraAnchor = playerCharacter;
        playerCharacter->solid = importSolid("assets/playercharacter.3ds");
@@ -19,8 +23,17 @@ void spawnPlayer(Transform transform) {
 }
 
 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));
+       if (!playerCharacter) {
+               return;
+       }
+
+       Vector3D direction = (Vector3D) { x, 0.0f, -y };
+       direction = normalized(
+               applyTransform(movementDirectionTransform, direction));
+       float velocity = 1.0f;
+       Vector3D movement = { direction.x * velocity,
+                             direction.y * velocity,
+                             direction.z * velocity };
+
+       translate(&(playerCharacter->transform), movement);
 }
index 7372d8eef5bbd831af0a80d3885f32b107b52a97..abfd8e9fe214ebf156f71d6e4577c5f16af96e0d 100644 (file)
@@ -6,6 +6,7 @@
 #include "engine/render.h"
 #include "engine/ui.h"
 
+#include "game/input.h"
 #include "game/level.h"
 #include "game/player.h"
 
@@ -50,7 +51,7 @@ int main(int argc, char** argv) {
        
        glutDisplayFunc(renderFrame);
        glutReshapeFunc(resizeStage);
-       //glutKeyboardFunc(key_pressed);
+       glutKeyboardFunc(onKeyPressed);
        //glutMouseFunc(mouse_button_event);
        //glutMotionFunc(mouse_motion_event);