From: outfrost Date: Wed, 3 Jun 2020 23:59:20 +0000 (+0200) Subject: Implement rudimentary player movement; fix geometry logic bugs X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=3509d29964b42f51fbcd9688d35925218b37db19;p=shadowclad.git Implement rudimentary player movement; fix geometry logic bugs --- 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/engine/input.c deleted file mode 100644 index 30c3ea0..0000000 --- a/src/engine/input.c +++ /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 index 0ae694f..0000000 --- a/src/engine/input.h +++ /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 index 0000000..447e92e --- /dev/null +++ b/src/game/input.c @@ -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 index 0000000..0ae694f --- /dev/null +++ b/src/game/input.h @@ -0,0 +1,6 @@ +#ifndef INPUT_H_ +#define INPUT_H_ + +void onKeyPressed(unsigned char key, int x, int y); + +#endif // 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);