From 137d8fa53925da832e0ef1e61b7fbe56f81a00a6 Mon Sep 17 00:00:00 2001 From: Asuro Date: Wed, 12 Feb 2025 02:01:39 +0100 Subject: [PATCH] more camera movement --- src/engine/Shared.h | 2 ++ src/engine/Window.cpp | 3 +++ src/game/Global.cpp | 27 ++++++++++++++++++++++++++- src/game/Global.h | 7 ++++++- src/game/Setup.cpp | 2 ++ src/game/rendering/Rendering.cpp | 21 +++++++++++++++++---- 6 files changed, 56 insertions(+), 6 deletions(-) diff --git a/src/engine/Shared.h b/src/engine/Shared.h index ac08a07..70ff357 100644 --- a/src/engine/Shared.h +++ b/src/engine/Shared.h @@ -7,6 +7,8 @@ struct SharedWindowData int32_t WindowWidth = 1920; int32_t WindowHeight = 1080; bool HeldScanCodes[512]{0}; + float MouseDeltaX = 0.0f; + float MouseDeltaY = 0.0f; }; struct FileChangeNotification diff --git a/src/engine/Window.cpp b/src/engine/Window.cpp index d78424a..70202b6 100644 --- a/src/engine/Window.cpp +++ b/src/engine/Window.cpp @@ -57,6 +57,9 @@ void EngineWindow::Update(SharedWindowData& shared) } case SDL_EVENT_MOUSE_MOTION: { + shared.MouseDeltaX += evt.motion.xrel; + shared.MouseDeltaY += evt.motion.yrel; + break; } default: break; diff --git a/src/game/Global.cpp b/src/game/Global.cpp index 7dd1cb5..271699b 100644 --- a/src/game/Global.cpp +++ b/src/game/Global.cpp @@ -9,6 +9,21 @@ namespace Game::GameInstance* GameInst = nullptr; } // namespace +void Vec2::Normalize() +{ + float len = bx::sqrt(X * X + Y * Y); + X /= len; + Y /= len; +} + +void Vec3::Normalize() +{ + float len = bx::sqrt(X * X + Y * Y + Z * Z); + X /= len; + Y /= len; + Z /= len; +} + Quat Quat::FromEuler(float x, float y, float z) { x *= bx::kPi / 180.0f; @@ -47,13 +62,23 @@ void Mat4::CreateTransform(float* out, Vec3 pos, Quat rot, Vec3 scale) bx::mtxMul(out, buf, tMat); } -void Mat4::Translate(Vec3 offset) +void Mat4::TranslateLocal(Vec3 offset) { M[12] += offset.X; M[13] += offset.Y; M[14] += offset.Z; } +void Mat4::Rotate(Vec3 rotation) +{ + float rot[16]{0}; + bx::mtxRotateXYZ(rot, rotation.X, rotation.Y, rotation.Z); + float temp[16]{0}; + bx::mtxMul(temp, M, rot); + for (int32_t i = 0; i < 16; ++i) + M[i] = temp[i]; +} + Vec3 Mat4::Right() { return {M[0], M[1], M[2]}; diff --git a/src/game/Global.h b/src/game/Global.h index 3fe64c7..8f83d58 100644 --- a/src/game/Global.h +++ b/src/game/Global.h @@ -20,6 +20,8 @@ struct Vec2 { float X = 0.0f; float Y = 0.0f; + + void Normalize(); }; struct Vec3 @@ -32,6 +34,8 @@ struct Vec3 { return {X, Y, Z}; }; + + void Normalize(); }; struct Quat @@ -67,7 +71,8 @@ struct Mat4 }; static void CreateTransform(float* out, Vec3 pos, Quat rot = {}, Vec3 scale = {1.0f, 1.0f, 1.0f}); - void Translate(Vec3 offset); + void TranslateLocal(Vec3 offset); + void Rotate(Vec3 rotation); Vec3 Right(); Vec3 Up(); Vec3 Forward(); diff --git a/src/game/Setup.cpp b/src/game/Setup.cpp index 285a0aa..5cf6e24 100644 --- a/src/game/Setup.cpp +++ b/src/game/Setup.cpp @@ -57,6 +57,8 @@ namespace Game GetInstance().Delta = newNow - GetInstance().Now; GetInstance().Now = newNow; SetupInstance.Rendering.Update(); + GetShared().Window.MouseDeltaX = 0.0f; + GetShared().Window.MouseDeltaY = 0.0f; } void Shutdown() diff --git a/src/game/rendering/Rendering.cpp b/src/game/rendering/Rendering.cpp index d968888..95fb5d6 100644 --- a/src/game/rendering/Rendering.cpp +++ b/src/game/rendering/Rendering.cpp @@ -174,18 +174,31 @@ namespace Game { GetInstance().GameLevel.Update(); + + float delta = GetInstance().Delta; + constexpr float moveSpeed = 10.0f; + constexpr float rotSpeed = 1.0f; + float forwardInput = (GetKey(ScanCode::SDL_SCANCODE_W) ? 1.0f : 0.0f) + (GetKey(ScanCode::SDL_SCANCODE_S) ? -1.0f : 0.0f); float rightInput = (GetKey(ScanCode::SDL_SCANCODE_D) ? 1.0f : 0.0f) + (GetKey(ScanCode::SDL_SCANCODE_A) ? -1.0f : 0.0f); - Vec3 inputVec = {rightInput, 0.0f, forwardInput}; + Vec2 moveInput = Vec2{rightInput, forwardInput}; + moveInput.Normalize(); + Vec3 inputVec = {moveInput.X * delta * moveSpeed, 0.0f, moveInput.Y * delta * moveSpeed}; Vec3 camForward = Cam.Transform.Forward(); Vec3 camRight = Cam.Transform.Right(); - Cam.Transform.Translate( - {camForward.X * forwardInput, camForward.Y * forwardInput, camForward.Z * forwardInput}); - Cam.Transform.Translate({camRight.X * rightInput, camRight.Y * rightInput, camRight.Z * rightInput}); + Vec3 rotInput = {shared.Window.MouseDeltaY * delta, shared.Window.MouseDeltaX * delta, 0.0f}; + Cam.Transform.Rotate({0.0f, rotInput.Y, 0.0f}); + // TODO: split transform into rot matrix and translation + + // Cam.Transform.Translate( + // {camForward.X * forwardInput, camForward.Y * forwardInput, camForward.Z * forwardInput}); + Cam.Transform.TranslateLocal({0.0f, 0.0f, -forwardInput}); + Cam.Transform.TranslateLocal({-rightInput, 0.0f, 0.0f}); + bgfx::dbgTextPrintf(1, 4, 0x0f, "Cam forward: %.2f %.2f %.2f", camForward.X, camForward.Y, camForward.Z); } // Set view and projection matrix for view 0.