From 3509d29964b42f51fbcd9688d35925218b37db19 Mon Sep 17 00:00:00 2001 From: outfrost Date: Thu, 4 Jun 2020 01:59:20 +0200 Subject: [PATCH] Implement rudimentary player movement; fix geometry logic bugs --- Makefile | 1 + src/engine/geometry.c | 9 ++++++--- src/engine/geometry.h | 2 +- src/{engine => game}/input.c | 8 +++++++- src/{engine => game}/input.h | 0 src/game/player.c | 21 +++++++++++++++++---- src/main.c | 3 ++- 7 files changed, 34 insertions(+), 10 deletions(-) rename src/{engine => game}/input.c (52%) rename src/{engine => game}/input.h (100%) diff --git a/Makefile b/Makefile index fe1e34a..9a9e0e5 100644 --- 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 diff --git a/src/engine/geometry.c b/src/engine/geometry.c index 7af8c1c..2cfb0aa 100644 --- a/src/engine/geometry.c +++ b/src/engine/geometry.c @@ -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]; diff --git a/src/engine/geometry.h b/src/engine/geometry.h index 76e7cd0..ff45938 100644 --- a/src/engine/geometry.h +++ b/src/engine/geometry.h @@ -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/game/input.c similarity index 52% rename from src/engine/input.c rename to src/game/input.c index 30c3ea0..447e92e 100644 --- a/src/engine/input.c +++ b/src/game/input.c @@ -5,10 +5,16 @@ 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(); + playerMovementInput(1.0f, 0.0f); break; default: break; diff --git a/src/engine/input.h b/src/game/input.h similarity index 100% rename from src/engine/input.h rename to src/game/input.h diff --git a/src/game/player.c b/src/game/player.c index ed0dab9..560a044 100644 --- a/src/game/player.c +++ b/src/game/player.c @@ -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); } diff --git a/src/main.c b/src/main.c index 7372d8e..abfd8e9 100644 --- a/src/main.c +++ b/src/main.c @@ -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); -- 2.44.0