From 4e00355dbebd5905d7cb47b4a871b93a4b3a8264 Mon Sep 17 00:00:00 2001 From: Asuro Date: Fri, 20 Jun 2025 05:15:35 +0200 Subject: [PATCH] working collision! --- src/game/Level.cpp | 50 ++++++++++++++++++++++++++++++-- src/game/Mesh.cpp | 7 ++--- src/game/Tools.cpp | 2 ++ src/game/data/puzzles/0.pzl | 2 +- src/game/data/static/puzzle.dat | Bin 19109 -> 19109 bytes tools/radsession.rad | 4 +-- 6 files changed, 55 insertions(+), 10 deletions(-) diff --git a/src/game/Level.cpp b/src/game/Level.cpp index b6f8f7c..647cd1a 100644 --- a/src/game/Level.cpp +++ b/src/game/Level.cpp @@ -212,6 +212,44 @@ namespace Game UpdatePlayerInputMode(); } + bool IsOnGround(Level& level, Vec3 worldPos) + { + for (auto& puz : level.Puzzles) + { + Vec3 offsetToPuzzle = + worldPos - puz.WorldPosition + (Vec3{0.5f, 0.0f, 0.5f} * Puzzle::Config::CardScaleWorld); + Vec3 scaledOffset = offsetToPuzzle / Puzzle::Config::CardScaleWorld; + int32_t offsetX = (int32_t)bx::floor(scaledOffset.x); + int32_t offsetY = (int32_t)bx::floor(scaledOffset.z); + if (offsetX >= 0 && offsetX < puz.Data.WidthTiles / 2 && offsetY >= 0 && offsetY < puz.Data.HeightTiles / 2) + { + auto& card = puz.Data.PlacedCards[offsetY * Puzzle::Config::MaxPuzzleSizeCards + offsetX]; + if (card.RefCard.Idx == UINT16_MAX) + { + return true; + } + + auto& refCard = Puzzle::GetStaticPuzzleData().Cards[card.RefCard.Idx]; + if (!IsValid(refCard.BaseModelHandle)) + { + LOG_WARN("missing base model! @ %i %i", offsetX, offsetY); + return true; + } + + auto& heightmap = GameRendering::Get().Models[refCard.BaseModelHandle.ModelIdx].Height; + float fracOffsetX = scaledOffset.x - offsetX; + float fracOffsetY = scaledOffset.z - offsetY; + int32_t xPos = (int32_t)(fracOffsetX * heightmap.Width); + int32_t yPos = (int32_t)(fracOffsetY * heightmap.Height); + uint8_t height = heightmap.Values[yPos * heightmap.Width + xPos]; + + LOG("Height: %u", height); + return height > 230; + } + } + return false; + } + void Level::Update() { ZoneScopedN("Level update"); @@ -263,9 +301,15 @@ namespace Game } else if (player.CameraM == CameraMode::Walk) { - TranslateLocal(player.PlayerCamTransform, {0.0f, 0.0f, inputVec.z}); - TranslateLocal(player.PlayerCamTransform, {inputVec.x, 0.0f, 0.0f}); - player.PlayerCamTransform.Position.y = 3.0f; + auto newTransform = player.PlayerCamTransform; + TranslateLocal(newTransform, {0.0f, 0.0f, inputVec.z}); + TranslateLocal(newTransform, {inputVec.x, 0.0f, 0.0f}); + newTransform.Position.y = 3.0f; + + if (IsOnGround(*this, newTransform.Position)) + { + player.PlayerCamTransform = newTransform; + } player.WalkXRot += rotInput.x; player.WalkYRot += rotInput.y; diff --git a/src/game/Mesh.cpp b/src/game/Mesh.cpp index a3389b1..9da2b1a 100644 --- a/src/game/Mesh.cpp +++ b/src/game/Mesh.cpp @@ -13,7 +13,6 @@ #include "rendering/Rendering.h" #include "Instance.h" -#include #include #define TINYGLTF_IMPLEMENTATION @@ -129,8 +128,8 @@ namespace Game { float uPos = mesh.MinPos.x + (float)u / HeightMap::Width * mesh.Size.x; - Gen::Vec3 rayStart = {uPos, mesh.MinPos.y, vPos}; - Gen::Vec3 rayEnd = {uPos, mesh.MaxPos.y, vPos}; + Gen::Vec3 rayStart = {uPos, -100.0f, vPos}; + Gen::Vec3 rayEnd = {uPos, 100.0f, vPos}; Gen::Vec3 ptOut; for (int16_t i = 0; i < indexBufferView.byteLength; i += indexStride * 3) @@ -148,7 +147,7 @@ namespace Game reinterpret_cast(&posBuffer.data[posBufferView.byteOffset + *idxC * posStride]); if (Gen::RayTriangleIntersect(rayStart, rayEnd, *triA, *triB, *triC, ptOut)) { - float len = ptOut.y - mesh.MinPos.y; + float len = ptOut.y - rayStart.y; uint8_t val = (uint8_t)(len / mesh.Size.y * UINT8_MAX); int32_t idx = v * HeightMap::Width + u; if (mesh.Height.Values[idx] < val) diff --git a/src/game/Tools.cpp b/src/game/Tools.cpp index 8827fe5..81e3470 100644 --- a/src/game/Tools.cpp +++ b/src/game/Tools.cpp @@ -278,6 +278,8 @@ namespace Tools level.Setup(shared.Game); } + ImGui::DragFloat3("Player Pos", &player.PlayerCamTransform.Position.x); + ImGui::DragFloat3("Puz0 Pos", &level.Puzzles[0].WorldPosition.x); ImGui::SliderFloat("Mouse Sensitivity", &player.MouseSensitivity, 0.1f, 5.0f); ImGui::SliderFloat("Player Speed", &player.MovementSpeed, 1.0f, 30.0f); diff --git a/src/game/data/puzzles/0.pzl b/src/game/data/puzzles/0.pzl index 9dbeb72..c5bb8a7 100644 --- a/src/game/data/puzzles/0.pzl +++ b/src/game/data/puzzles/0.pzl @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:05b2511e2d9f8b91944b2f805dfd38db5943f633ff9a9332f834bd0cd97eb2f2 +oid sha256:32793e740401f8e9f561da0ab87ab3870c4e92d8ed554ae790a0de7ea035eca5 size 11441 diff --git a/src/game/data/static/puzzle.dat b/src/game/data/static/puzzle.dat index 006576113dea2f338ff67c9e69de6c701cab139b..4e080a710b6dd0eef41a41ea341aeb54bfe275e0 100644 GIT binary patch delta 138 zcmZ2Fm2v4*#tkV