From 89f31a7184a53459f84a41e0241969455861e959 Mon Sep 17 00:00:00 2001 From: Safariminer Date: Tue, 5 Aug 2025 23:55:32 -0400 Subject: [PATCH] Floor collisions working great with runtime-calculated collision maps, moving on to caching collision maps for future runtime --- .gitignore | 3 ++- mpfw/main.cpp | 57 ++++++++++++++++++++++++++++++--------------------- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/.gitignore b/.gitignore index 7ef6dc0..e0b37ef 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ x86 */x86 gameenv/imgui.ini docs/game/build -docs/internal/client \ No newline at end of file +docs/internal/client +gameenv/data/cache \ No newline at end of file diff --git a/mpfw/main.cpp b/mpfw/main.cpp index bd02b2a..783c25a 100644 --- a/mpfw/main.cpp +++ b/mpfw/main.cpp @@ -15,6 +15,8 @@ #include #include "MPFW_Physics.h" +#define DISTANCE_FROM_FLOOR 15 + // turn quake miptex into rl texture Texture2D RLMT_QUAKE(MPFW::Quake::Maps::rlMipTex rlmt) { Texture2D retval; @@ -196,7 +198,7 @@ int main() { SetConfigFlags(FLAG_WINDOW_RESIZABLE); InitWindow(1280, 720, TextFormat("mpfw")); - SetTargetFPS(60); + // SetTargetFPS(60); SetExitKey(0); DisableCursor(); @@ -266,6 +268,36 @@ int main() { ClearBackground(BLACK); if(IsCursorHidden() && !consoleOn){ + + if (chr.cvars["math_3d_floor_collision_work"] == "true") { + float potentialNewFloor = -FLT_MAX; + for (int b = 0; b < collisionMap.collisionSets.size(); b++) { + BoundingBox bb; + bb.min = collisionMap.collisionSets[b].size.min; + bb.max = collisionMap.collisionSets[b].size.max; + if (CheckCollisionBoxSphere(bb, camera.position, 10)) { + MPFW::Physics::CollisionSet cs = collisionMap.collisionSets[b]; + for (int i = 0; i < cs.collisionFaces.size(); i++) { + for (int t = 2; t < cs.collisionFaces[i].polygon.size(); t++) { + Vector3 a = cs.collisionFaces[i].polygon[0]; + Vector3 b = cs.collisionFaces[i].polygon[t]; + Vector3 c = cs.collisionFaces[i].polygon[t - 1]; + Ray r; + r.position = camera.position; + r.direction = { 0,-1,0 }; + RayCollision coll = GetRayCollisionTriangle(r, a, b, c); + if (coll.hit) { + if (coll.point.y > potentialNewFloor) potentialNewFloor = coll.point.y; + } + } + } + } + + } + if (potentialNewFloor != -FLT_MAX) collisionFloor = potentialNewFloor + DISTANCE_FROM_FLOOR; + else collisionFloor = camera.position.y - DISTANCE_FROM_FLOOR; + } + Look(); Vector3 wishVel = { 0,0,0 }; wishSpeed = 320; @@ -302,28 +334,7 @@ int main() { velocity.y -= 10 * GetFrameTime(); } - if(chr.cvars["math_3d_floor_collision_work"] == "true"){ - for (int b = 0; b < collisionMap.collisionSets.size(); b++) { - BoundingBox bb; - bb.min = collisionMap.collisionSets[b].size.min; - bb.max = collisionMap.collisionSets[b].size.max; - if (CheckCollisionBoxSphere(bb, camera.position, 10)) { - MPFW::Physics::CollisionSet cs = collisionMap.collisionSets[b]; - for (int i = 0; i < cs.collisionFaces.size(); i++) { - for (int t = 2; t < cs.collisionFaces[i].polygon.size(); t++) { - Vector3 a = cs.collisionFaces[i].polygon[0]; - Vector3 b = cs.collisionFaces[i].polygon[t]; - Vector3 c = cs.collisionFaces[i].polygon[t - 1]; - Ray r; - r.position = camera.position; - r.direction = { 0,-1,0 }; - RayCollision coll = GetRayCollisionTriangle(r, a, b, c); - } - } - } - - } - } + velocity *= {GetFrameTime(), 1, GetFrameTime()};